4、传感器融合:加速度计、陀螺仪、磁力计,谁更可信?

做飞控调参这些年,我见过不少新手一上来就盯着PID猛调,结果飞机还是晃得跟喝醉了似的。其实很多时候,问题根本不在控制,而在——传感器没整明白。

你想想看,飞控大脑接收到的姿态数据,全靠加速度计、陀螺仪、磁力计这三个家伙提供。它们各有各的脾气,各有各的毛病。谁在什么时候更可信?怎么把它们揉到一起?这就是传感器融合要干的事。

核心观点:没有绝对可信的传感器,只有动态可信的融合策略。低频信任加速度计和磁力计,高频信任陀螺仪。

4.1 三员大将,各怀绝技

先说说这三个传感器各自的看家本领和致命短板。

传感器 测量对象 强项 致命短板
陀螺仪 角速度 高频响应快,动态性能好 零偏漂移,积分后角度误差随时间累积
加速度计 比力(重力+运动加速度) 长期稳定,不漂移 对振动敏感,无法区分重力与运动加速度
磁力计 地磁场矢量 提供绝对航向参考 极易受电机电流、铁磁物质干扰

说白了,陀螺仪是个短跑冠军,爆发力强但跑偏了也不知道。加速度计和磁力计是长跑选手,方向感好但步子慢,还容易受外界干扰。

4.2 为什么不能只用陀螺仪?

我刚开始做飞控时,也想过一个偷懒的办法:只用陀螺仪积分出角度不就行了?

结果你猜怎么着?飞机悬停10秒钟,姿态就偏了5度。原因很简单——陀螺仪有零偏。哪怕静止时输出不为零,积分一秒就是一个小误差,一分钟下来,飞机已经以为自己倒立了。

举个例子:

// 假设陀螺仪静止时输出 0.1°/s 的零偏
// 积分 60 秒后的角度误差:
float error = 0.1 * 60;  // = 6°
// 飞控以为自己在倾斜,实际上水平

嗯,这就是为什么必须引入加速度计和磁力计来做长期校正。

4.3 互补滤波:最简单的融合思路

互补滤波的思路很直观:

  • 陀螺仪负责短时间内的快速姿态变化(高通)
  • 加速度计+磁力计负责长时间内的姿态基准(低通)

公式长这样:

角度 = 0.98 × (上一时刻角度 + 陀螺仪角速度 × dt) + 0.02 × 加速度计角度

这里的0.98和0.02就是权重系数。系数怎么定?

我个人习惯的做法是:先根据陀螺仪噪声带宽估算截止频率。比如陀螺仪有效信号在10Hz以上,加速度计噪声主要在5Hz以下,那截止频率设在2~3Hz就挺合适。

调参小技巧:互补滤波的截止频率 f_c = (1 - α) / (2π × dt × α)。α越接近1,陀螺仪权重越大,响应快但易漂移;α越小,加速度计校正越强,但会引入延迟。

4.4 卡尔曼滤波:更聪明的融合

互补滤波虽然简单,但它有个问题——权重是固定的。不管飞机是悬停还是剧烈翻滚,都用同一套系数。

卡尔曼滤波就不一样了。它会根据当前的运动状态,动态调整对每个传感器的信任程度。

我曾经在调试一款测绘无人机时遇到过这种情况:飞机在做大机动转弯,加速度计测到的比力里混入了大量运动加速度。如果用互补滤波,姿态会瞬间被带偏。但卡尔曼滤波能通过协方差矩阵自动降低加速度计的权重,全靠陀螺仪撑住姿态。

核心流程就五步:

  1. 预测:用陀螺仪数据推算下一时刻姿态
  2. 更新协方差:估算预测的不确定度
  3. 计算卡尔曼增益:根据测量噪声和预测噪声动态调整
  4. 校正:用加速度计/磁力计测量值修正预测值
  5. 更新协方差:为下一轮迭代做准备

代码骨架大概是这样:

// 预测步骤
x = F * x + B * u;  // 状态预测
P = F * P * F' + Q; // 协方差预测

// 校正步骤
K = P * H' * inv(H * P * H' + R); // 卡尔曼增益
x = x + K * (z - H * x);          // 状态更新
P = (I - K * H) * P;              // 协方差更新

注意:卡尔曼滤波的调参难点在于Q和R矩阵的设置。Q太大,滤波响应快但噪声大;R太大,滤波平滑但延迟高。我建议先从单位矩阵开始,再根据实际飞行数据微调。

4.5 磁力计的特殊处理

磁力计是个让人头疼的家伙。它提供的航向信息虽然绝对,但干扰源太多了——电机电流、电源线、甚至附近的水泥钢筋都能让它跑偏。

我踩过的坑是:有一次在室内调试,磁力计读数一直稳定,我以为没问题。结果一飞到室外,航向直接偏了30度。后来才发现,室内地板里有钢筋网。

所以磁力计的使用要遵循几个原则:

  • 必须做硬铁和软铁校准,消除固定偏差和比例偏差
  • 只在低动态时信任磁力计,大机动时降低其权重
  • 配合GPS航向,双冗余校验

4.6 融合策略对比

融合方法 计算量 动态性能 长期稳定性 适用场景
互补滤波 极低 中等 中等 入门、玩具级飞控
卡尔曼滤波 较高 优秀 优秀 专业飞控、测绘无人机
Mahony/Madgwick 低 良好 良好 开源飞控(PX4/ArduPilot)

我个人更推荐在工程实践中使用Mahony滤波。它本质上是互补滤波的非线性版本,计算量比卡尔曼小得多,但效果在大多数场景下已经足够好。

4.7 传感器融合的完整流程

下面这张图展示了传感器融合的核心逻辑:

传感器融合核心流程 陀螺仪 (角速度) 加速度计 (比力) 磁力计 (地磁场) 零偏补偿 + 滤波 低通滤波 + 归一化 剔除运动加速度 硬铁/软铁校准 倾角补偿 传感器融合引擎 互补滤波 / 卡尔曼滤波 / Mahony 最终姿态:Roll / Pitch / Yaw 关键原则: 低频信任加速度计/磁力计(长期基准) 高频信任陀螺仪(短期动态)

4.8 实战中的避坑指南

最后分享几个我踩过的坑,希望能帮你少走弯路:

  • 加速度计不要直接当角度用:我曾经犯过这个错,以为atan2(ax, az)就是俯仰角。结果飞机一加速,姿态就乱跳。记住,加速度计测的是比力,不是重力。
  • 磁力计校准不能省:有一次我偷懒没做硬铁校准,结果航向误差在10度到30度之间随机跳。后来老老实实做了8字校准,问题才解决。
  • 融合频率要匹配:陀螺仪更新率如果是1kHz,加速度计只有100Hz,那融合循环要以最低频率为准,否则会出现数据不同步。
  • 初始化时不要信任任何传感器:上电瞬间,陀螺仪零偏还没稳定,加速度计可能有冲击。我习惯等2秒后再开始融合。

一句话总结:传感器融合的本质,就是用陀螺仪的短时精度,去填补加速度计和磁力计的动态缺陷;再用加速度计和磁力计的长时稳定性,去修正陀螺仪的漂移。三者互补,才能得到可靠的姿态。