截至上篇文章,这个专栏已经介绍了三种 IMU 姿态估计的算法:Mahony 的互补滤波器,基于欧拉角的卡尔曼滤波器,和乘法扩展卡尔曼滤波器(MEKF)。这篇文章通过仿真解释为什么 MEKF 是目前最好的姿态估计算法。各种滤波器的实现和仿真的 MATLAB 代码可以在下面的链接找到,感兴趣的朋友可以参考。
WangWeixin442/attitude-kalman-filtergithub.com![e09107757cda3129564a1044c9ab5dad.png](https://i-blog.csdnimg.cn/blog_migrate/a90a22dab8707fc1bf0101e68af42004.png)
1. 仿真设定
仿真使用了两种旋转运动,第一种是 roll-pitch-yaw 角度按照正弦曲线变化,频率是 0.35 Hz,幅值分别是 180,90,180 度。这个旋转运动在每一个周期内都都会经历两次欧拉角的奇异点。第二个旋转运动是 IMU 绕体坐标系的 z-轴以 6 rad/s 的角速度旋转,同时体坐标系的 z-轴绕固定坐标系的 y-轴以 1 rad/s 的角速度旋转。
陀螺仪的角度随机行走噪声设置为 0.1
这次仿真比较了四种滤波器,除了开头提到的三种还有直接使用四元数进行卡尔曼滤波的方法。四种滤波器都是用四元数的一阶积分对角速度积分。滤波器的初始值设置为真实的姿态绕体坐标系的 x-轴旋转
每种旋转运动都随机生成了 60 组噪声,滤波器的误差使用旋转矢量的模长表示,也就是将估计的姿态旋转到真实姿态需要的角度。误差先在每组仿真内对时间求平均,再对 60 组仿真求平均及标准差。
2. 主要结果
第一种旋转运动的误差比较如下图所示。
![4f21eef0632c78e5dd8212faf05afc29.png](https://i-blog.csdnimg.cn/blog_migrate/6dc6fbaf509ef556d946327877272d16.jpeg)
其中一组仿真的误差随时间变化的曲线如下图所示。
![85effd22fd54a274db3361351c9c56f9.png](https://i-blog.csdnimg.cn/blog_migrate/db86b93c1b67a49c886865eedd29a005.jpeg)
第二种旋转运动的结果如下面两图所示。
![9c4d62cd84fc28d6e7fcd64bd4efc6d0.png](https://i-blog.csdnimg.cn/blog_migrate/6a72b3fc9d48a2a567e8adc83565f3e8.jpeg)
![84d7e3376dffb3b7822a5cee79b55a88.png](https://i-blog.csdnimg.cn/blog_migrate/b7ce32d276db6c1283ad78318b1e35ee.jpeg)
从结果可以看到,四种滤波器都可以很快从错误的初始值收敛到真实值附近,但是 MEKF 的精度要明显好于其它三种滤波器。从误差随时间变化的轨迹中可以明显看到奇异点对欧拉角滤波器的影响,特别是在第一种旋转运动中。
3. MEKF 和欧拉角滤波器
为了更明显地表现欧拉角自锁现象对滤波器的影响,我在第一种旋转运动中尝试了不同的俯仰角(pitch)正弦曲线的幅值,分别为
![73016079242a98201f44a43711e7d6bc.png](https://i-blog.csdnimg.cn/blog_migrate/c6cad9fbf0ca55eca57ec3e332f4c176.jpeg)
可以看到,当俯仰角的最大值为
4. 互补滤波器和 MEKF
大家可能会质疑在第二节的结果中,我没有给出互补滤波器的增益
![713cc815d9481f574ba0e2a8c1ebd6ed.png](https://i-blog.csdnimg.cn/blog_migrate/16a53c43f45f67e54710a4ebf6dc007b.jpeg)
可以看到,即使在最优的
![db32f21f70623103d2e8a6802557484c.png](https://i-blog.csdnimg.cn/blog_migrate/9489251053d2cb5cd2a4ec10ba9df36b.jpeg)
那还有一个问题是如果只比较稳态精度,互补滤波器能不能赶得上 MEKF ?为了测试这一点,我把滤波器的初始值设为真实的姿态,MEKF 的初始标准差设为零,也就是对于初始值完全信任。两种滤波器的精度如下图所示
![a6eb3e2ea395837b6e105c22c0a30ea3.png](https://i-blog.csdnimg.cn/blog_migrate/8747351238bc43a8caf80cee64f742b3.jpeg)
可以看到,如果仔细挑选增益值,互补滤波器的稳态精度与 MEKF 非常接近。这是因为在角速度变化不大的情况下,MEKF 的增益近似趋向于定值,也就是趋向于互补滤波器。但如果对上图的结果用 paired t-test 做统计分析,即使用最好的 k 值(0.001左右)与 MEKF 比较,得到的 p 值也小于 0.001,也就是 MEKF 仍然“显著”优于互补滤波器(这里的“显著”指统计学里的显著差异),但它们均值的差别只有 0.0056 deg,完全可以忽略不记。一种可能的解释是 MEKF 的方差的递推公式与测量得到的角速度有关,因此即使已经趋于稳态,MEKF 增益还是会随着角速度的变化作微小的改变,这些微小的变化可能对精度有微小的提升。
需要注意的是,互补滤波器的稳态最优增益非常小,如果姿态的初始值离真实值较远,或者因为某些剧烈的运动(例如碰撞)造成姿态的误差突然变得很大,互补滤波器的收敛速度会非常慢,因此使用稳态最优增益是非常不好的选择。
5. 总结
这篇文章通过仿真比较了 MEKF,互补滤波器,基于欧拉角和四元数的卡尔曼滤波器。结论是 MEKF 的动态精度要明显优于其他三种滤波器;稳态精度与互补滤波器类似,但要优于其他两种滤波器。在实际应用中,如果不考虑初始的动态响应和运动中角速度较大的波动,互补滤波器不失为一种很好的选择;但如果用稳态最优的