ArduPilot加速度计与陀螺仪校准:一场与物理世界的精密对话
你有没有遇到过这样的情况——飞行器刚离地就轻微左右晃动,悬停时高度缓慢爬升,或者转向后航向迟迟不回中?这些看似“飞控不太灵”的表象,背后大概率不是代码bug,也不是参数调优不到位,而是IMU(惯性测量单元)在默默抗议:“我还没被认真对待过。”
ArduPilot从不假设你的传感器是理想的。它把每一次起飞前的静置、每一次翻转、每一次等待,都当作一次与真实物理世界的校准对话。这不是一个可跳过的设置项,而是一套嵌入在固件血液里的、严谨到近乎苛刻的传感建模流程。今天我们就抛开“点一下就完事”的幻觉,真正走进加速度计与陀螺仪校准的内核——看它如何用重力当尺子、以静止为基准、拿矩阵做笔,一笔一划地修正硬件与现实之间的微小裂隙。
六面法:用重力给自己画一张三维坐标图
加速度计的本质,是在没有外力加速时,忠实地告诉你“哪边是下”。这个“下”,就是地球重力矢量在你飞行器机体坐标系中的投影。理想情况下,当你把飞机Z轴朝下稳稳放平,加速度计应该坚定地输出[0, 0, 1](单位g);X轴朝下时是[1, 0, 0];Y轴朝下则是[0, 1, 0]。但现实中,由于MEMS工艺限制、焊点应力、PCB微形变,每个轴都有自己的“倔脾气”:零点偏了、放大倍数不准、甚至三个轴根本没严格垂直。
ArduPilot没去硬抗这些偏差,而是选择建模——它不强行要求硬件完美,而是学着理解它的不完美。
六面法正是这一思想的具象化:让飞行器依次以+X、−X、+Y、−Y、+Z、−Z六个方向朝下静置。每种姿态下,重力矢量在机体坐标系中会落在不同轴上,形成6组清晰的约束方程。比如Z朝下时,理论值应为[0, 0, 1],但实测可能是[0.023, −0.011, 0.987];X朝下时本该是[1, 0, 0],结果读成[0.991, 0.008, −0.0