飞控IMU数据进阶处理(FFT,滤波器)

前面的文章(知乎专栏 https://zhuanlan.zhihu.com/c_60591778)曾简单讲过IMU数据(陀螺仪、加速度数据)的校准以及一阶低通滤波。本文在此基础上更进一步讲一下数据的指标分析与滤波器的选择问题。

 

IMU数据的重要性

IMU数据在飞控中处于最底层的数据,其重要性可见一斑。一般可降级的飞控,在遇到如GPS故障时,可降级飞行模式,来保证飞行安全性。其中,由陀螺仪数据决定的角速度飞行模式是所有飞行模式的基础,换而言之,一个飞机飞的稳不稳主要要看陀螺仪的数据。

 

采样频率

前面的文章有提到过控制带宽的问题,一般来说,由于电调的响应在400hz左右,所以设计的角速度控制环最高可到400hz左右(再高就没有什么意义了);而一般飞行器的带宽在30-40hz左右,所以控制频率最好不低于200hz。所以,角速度的反馈数据,频率最好在200-400hz左右(至少与控制频率一致)

 

频率混叠

如果IMU的采样频率降到与干扰频率差不多时,比如IMU的采样为200hz,而实际可能有192hz的高频干扰,因为采样只有200hz,只能分辨出100hz的数据,这时192hz的干扰会对数据造成频率混叠,即低频段的数据波形错误,数据失真。

结论:数据的采样频率尽可能高,这里既有控制器的考虑,也避免频率混叠的情况。

 

如何减震?

有过飞机组装设计经验的人知道,飞机在飞行时,由于电机的转动,导致机身的震动过大,而这些震动对飞控的数据影响很大,所以必须要做一定的减震处理(实际有些飞行器可能不需要减震,由各个飞机的情况决定)。

而最头痛的就是如何设计减震?或者说,怎么判定减震是否设计良好?由于最终目的是处理好IMU的数据,所以就飞控而言,即通过IMU数据的质量好坏来辨别是否减震设计良好

 

如何分析IMU数据质量?

时域上来看的话,取一组悬停飞行的波形观察,经验值是陀螺仪的数据噪声波动不超过正负0.15rad/s,加速度不超过正负3m/s2

笔者这里取出一组飞行良好的数据,200hz采样,200hz回传保存。飞行动作包括悬停与roll轴的动作。数据包含两个部分,200hz采样的原始数据,和进行50hz的巴特沃斯低通滤波后的数据。数据波形如下:

放大悬停部分:

图中可以看出,原始数据噪音很大,波动范围约正负0.6rad/s,而红色滤波后的数据则表现良好。

对数据进行FFT分析:

图2可以看到原始数据在80-100hz左右具有高频干扰,而图3,滤波后的FFT表明这段高频干扰已经去除,低频段的波形基本一致,证明滤波器有效。

 

滤波器截止频率选择

如上数据波形所示,对原始数据进行FFT分析后,得到其各个频段的幅值,比如这里的80-100hz有干扰,则将滤波器设置在70以下都可以。

结论:滤波器截止频率的选择与原始数据的FFT有关。通常有个经验值30-50都可。

 

滤波器是否有差别?

这里尝试三个不同的滤波器,一阶低通、2阶IIR和FIR。

设计一个6阶的FIR滤波器,截止频率50hz,对比二阶巴特沃斯,50hz滤波器,以及50hz一阶低通。

对比滤波后的FFT,放大观察

可见6阶FIR滤波器滤波效果更佳,高频段几乎滤掉。所以6阶FIR > 2阶IIR > 一阶低通

 

IIR与FIR的区别?

简单来说就是一个是非线性相位延迟,一个是线性相位延迟。比如FIR,无论在低频还是高频段,其滤波后的数据延迟是固定的。而IIR则不是,在低频段的延迟小于其高频段的延迟。

 

为什么开源用的都是IIR

这里笔者分析主要是实现问题,IIR结构简单,只需在代码中设置好采样频率和截止频率,则自动生成对应的滤波器参数,而FIR这里,笔者是在matlab下设计的滤波器,再将得到的参数放置在代码中,过程较为繁琐,且优势不明显。另外,IIR滤波器的运算量也较FIR要小。

其次,这里,在动态下,6阶FIR的延迟较大,所以滤波时不能光考虑数据的平滑,还要考虑延迟对控制器的影响,综合来看,还是IIR较为好用。

数据延时约0.01s。

所以,综上,一般采用2阶IIR滤波即可,其在数据的平滑性和可接受的延迟两个指标下综合最优。

 

延时有处理办法吗?

如果基于上面FIR滤波过后的数据,数据质量良好,但是延时过大,如何处理?

给数据加上微分量作为预测。

放大观察

这里延时是处理了,但是牺牲了数据的质量,数据的幅值发生变化,因此该处理是有严格条件的。实际应用中,并不一定好用。

 

卡尔曼滤波

这里笔者设计了一个单维的卡尔曼滤波,模型如下:

解释一下,认为状态转移为1,即数据无变化,u为模型的输入,以角速度的微分即角加速度。观测值即模型的输出,所以C也为1.

时域:

放大观察:

该模型下kalman,其性能与2阶IIR几乎一致。无特别明显优势处。

 

总结:

  • 滤波器的截止频率选择由FFT分析决定;
  • 关于滤波器的优劣:综合来看2阶IIR占优,但不排除其他的特殊处理,比如延时处理后的FIR滤波等;
  • 加速度的分析与此处举例的陀螺仪类似;
  • 10
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要订阅 `/mavros/imu/data` 话题并读取飞控的俯仰和偏滚角信息,你可以按照以下步骤进行: 1. 确保你已经安装了ROS,并且已经配置好了工作空间。 2. 创建一个新的ROS包,可以使用以下命令: ``` $ catkin_create_pkg imu_subscriber roscpp sensor_msgs ``` 3. 进入你的工作空间,并构建ROS包: ``` $ cd ~/catkin_ws $ catkin_make ``` 4. 进入创建的ROS包的源代码目录: ``` $ cd ~/catkin_ws/src/imu_subscriber/src ``` 5. 创建一个名为 `imu_subscriber.cpp` 的源代码文件,并使用你喜欢的文本编辑器打开它。 6. 在 `imu_subscriber.cpp` 文件中,导入必要的头文件: ```cpp #include <ros/ros.h> #include <sensor_msgs/Imu.h> ``` 7. 创建一个回调函数来处理接收到的飞控数据。该函数将被调用每当接收到新的消息时。 ```cpp void imuCallback(const sensor_msgs::Imu::ConstPtr& msg) { // 读取俯仰和偏滚角信息 double roll = msg->orientation.x; double pitch = msg->orientation.y; // 在这里处理俯仰和偏滚角信息 // 例如,可以打印这些信息 ROS_INFO("Roll: %f, Pitch: %f", roll, pitch); } ``` 8. 在 `main` 函数中,初始化ROS节点,并创建一个订阅者来订阅 `/mavros/imu/data` 话题,并指定回调函数。 ```cpp int main(int argc, char** argv) { ros::init(argc, argv, "imu_subscriber"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/mavros/imu/data", 10, imuCallback); ros::spin(); return 0; } ``` 9. 保存并关闭 `imu_subscriber.cpp` 文件。 10. 返回到你的工作空间根目录,并构建ROS包: ``` $ cd ~/catkin_ws $ catkin_make ``` 11. 运行ROS节点: ``` $ rosrun imu_subscriber imu_subscriber ``` 现在,你已经编写了一个用于订阅 `/mavros/imu/data` 话题并读取飞控的俯仰和偏滚角信息的C++程序。当有新的飞控数据发布到该话题时,`imuCallback` 函数将被调用。你可以在 `imuCallback` 函数中添加你想要执行的逻辑来处理接收到的俯仰和偏滚角信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值