前阵子有位做云台的客户来问,说模组静置的时候挺稳,一装到机器上跑起来,航向就慢慢偏出去了,问我是不是算法不够高级。聊了半天才发现,问题不在算法写得好不好看,而是三路传感器各自在干嘛,他其实没理清。姿态解算这件事,说白了就是把陀螺仪、加速度计、磁力计的数据揉到一起,输出一组可信的横滚、俯仰、航向。今天就把这条路顺一遍。
姿态解算,算的到底是什么
载体在空间里的姿态,本质是一个从载体坐标系到参考坐标系的旋转关系。解算要做的,就是靠模组自己测到的物理量,把这个旋转关系实时估出来,对外输出横滚、俯仰、航向这三个角。模组通常直接给四元数、欧拉角或旋转矩阵,这三者是等价的表示,只是换个写法。
三路来源,各管一段
陀螺仪测角速度。把角速度对时间积分就得到角度变化,优点是短期平滑、动态响应快,转多快它都跟得上。但零偏和随机游走会随着积分一点点累积,时间越长漂得越明显,这是它的天性。
加速度计测比力。静止时它感受到的就是重力方向,重力是个绝对参考,所以长期不漂,能稳稳约束横滚和俯仰。可一旦载体本身有加速度,或者振动传进来,这个参考就被污染了,短期反而不如陀螺可信。
磁力计测地磁。地磁是航向的绝对参考,能压住航向的长期漂移。它怕的是铁磁材料和电流产生的磁干扰,电机、扬声器、大电流走线都能让它读数跑偏。
一句话,陀螺管短期、加计和磁力计管长期,谁也不能单独扛全场。
融合的三条常见路子
互补滤波。用高通让陀螺负责高频段,用低通让加计和磁力计负责低频段,按频率互补加权。算力小、代码短、容易实现,在 MCU 上跑实时完全够用,是很多产品的第一选择。
卡尔曼一族。卡尔曼、扩展卡尔曼,以及工程里常见的误差状态卡尔曼(ESKF),思路是对零偏和噪声协方差建模,做统计意义上的最优估计。精度和鲁棒性更好,代价是算力和调参成本明显上来,状态量一多,调试也变磨人。
开源 AHRS 思路。Mahony 和 Madgwick 是开源社区里流传很广的两套姿态解算方案,前者偏 PI 式互补修正,后者用梯度下降做四元数更新,轻量、资料多,适合拿来起步和对照。
三条路没有绝对高低,先看你的算力预算和精度要求,再看团队调参的能力。
姿态怎么表示,为什么四元数成了主流
欧拉角最直观,人一眼能看懂,但它有万向节死锁的问题,某些姿态下会退化。旋转矩阵没有奇异点,代价是九个参数表示三个自由度,冗余且计算量大。四元数只有四个参数,没有奇异、递推简洁、还便于插值,唯一要做的是周期性地归一化,防止数值漂掉。所以嵌入式里它成了主流。
静态看零偏,动态看带宽
评估姿态解算效果,要把静态和动态分开看。静态主要看零偏稳定性,也就是漂移速度和航向能保持多久不跑偏。动态要看带宽够不够、振动抑制做得好不好、线加速度补偿到不到位。很多模组静态数据漂亮,一动起来就散,问题多半出在后两项。
选模组时问哪几件事
- 零偏稳定性和角度随机游走是什么水平?这决定了长期漂移的下限。
- 轴对齐和正交误差控制得怎么样?三轴不正交,后面的算法再准也补不回来。
- 温漂有没有补偿,是全温区标定还是只做常温?
- 输出速率和带宽够不够你的控制环用?
- 模组是否自带融合输出,走串口还是 CAN?自带的话能省掉一大部分算法工作。
- 算法生态和标定服务跟不跟得上?文档、例程、后期的重新标定,都是要算进成本的。
装上去之前的三件事
第一,出厂轴对齐和温度补偿标定要落到实处,最好拿到标定报告。第二,安装要保证刚性,该做减振就做减振,软趴趴的支架会把振动直接喂给加计。第三,磁环境该标定就标定,安装位置尽量远离电机和大电流线束,软硬铁补偿别省。
静态精度和动态精度,最好分开验
同一个模组,放在工装上慢慢转和装到机器上跑,表现常常不是一回事。静态精度看的是零偏稳定性和角度随机游走:零偏越小、游走越低,姿态随时间漂得越慢,航向能稳住的时间就越长。动态精度看的是带宽够不够、振动抑制做得如何、线加速度补偿到不到位。验证时不妨把静止、缓动、振动三种工况分开跑,分别记录姿态输出与参考值的偏差。静态数据漂亮、一动起来就散的模组,问题通常不在融合算法,而在这几项动态指标,或者安装刚性和减振没做好。
一句话总结
姿态解算不是玄学,是把三种各有缺点的传感器按频段和可靠度分工合作。静态盯零偏稳定性,动态盯带宽和抗扰,选型时先把零偏、随机游走、轴对齐、温补、输出接口这几项问清楚,再回头看算法。顺序对了,模组能给你的比你想象的多;顺序反了,再好的融合算法也救不回来。