3. ArduPilot导航架构:导航滤波器(EKF)、位置/速度/姿态估计、传感器融合

这一章,我们来聊聊ArduPilot的“大脑”——导航架构。

说白了,飞控要解决的核心问题就一个:我现在在哪?飞得怎么样? 然后才能决定下一步怎么走。GPS能告诉你位置,但更新慢,还容易丢星;IMU(惯性测量单元)反应快,但时间长了会漂。怎么办?把两者结合起来,取长补短。这就是传感器融合,而EKF(扩展卡尔曼滤波器)就是干这个活的。

3.1 为什么需要EKF?

我刚开始接触飞控时,觉得直接用GPS数据不就完了?后来在项目里遇到一次强风,飞机被吹得偏航,GPS显示位置还在飘,但姿态已经乱套了。那次之后我彻底明白了:单一传感器靠不住

EKF的作用,就是像一个“数据裁判”:

  • 它相信IMU的短期变化(比如瞬间的角速度、加速度)
  • 它相信GPS的长期位置(但会过滤掉噪声)
  • 它还会用空速、地速、磁力计等数据互相校验

你想想看,如果只用GPS,飞机在翻滚时GPS根本来不及反应。EKF通过融合IMU,能实时估算出姿态,哪怕GPS短暂失效,也能维持几秒钟的稳定控制。

核心思想: EKF不是“平均”数据,而是根据每个传感器的置信度(协方差)进行加权融合。置信度高的传感器权重更大。

3.2 ArduPilot中的EKF实现

ArduPilot目前主推的是 EKF3(扩展卡尔曼滤波器第三代)。它比前代更稳定,对传感器故障的容错性更好。

EKF3内部维护了一个状态向量,包含:

  • 位置(北、东、地)
  • 速度(北、东、地)
  • 姿态(四元数,表示机头朝向)
  • 陀螺仪零偏(IMU的漂移误差)
  • 加速度计零偏
  • 地磁干扰(如果使用磁力计)
  • 风速(没错,EKF还能估算风速!)

嗯,这里要注意:风速估算是固定翼飞行的关键。EKF通过对比空速(皮托管测得)和地速(GPS测得),反推出风速矢量。我在调参时发现,如果空速管堵了,EKF估算的风速会严重偏离,导致航向控制异常。

3.3 传感器融合流程

EKF的工作流程,可以简单理解为“预测-更新”循环:

  1. 预测步:根据IMU的角速度和加速度,推算下一时刻的位置、速度、姿态。这一步很快,频率高达400Hz。
  2. 更新步:当GPS、空速、磁力计等数据到来时(通常5-10Hz),用这些观测值修正预测结果。

我习惯把EKF比作一个“近视眼开车”:

  • IMU是手感,你闭着眼也能感觉车在加速还是转弯(预测)
  • GPS是偶尔看一眼路标,确认自己没跑偏(更新)

如果路标(GPS)突然没了,你还能靠手感开一段,但时间长了肯定偏。EKF也一样,GPS丢失后,它会逐渐切换到“纯惯性”模式,位置误差会随时间累积。

避坑指南: 我曾经遇到过EKF报错“Variance too high”,排查后发现是GPS天线安装位置离电机太近,电磁干扰导致GPS数据噪声过大。EKF发现GPS数据与IMU预测偏差太大,就自动降低了GPS的权重。解决办法是:重新布置天线位置,或者在参数里调高GPS的噪声系数。

3.4 关键参数与调优

EKF虽然智能,但也不是万能的。有几个参数我建议你重点关注:

参数名 作用 我的建议
EKF3_IMU_MASK 选择使用哪个IMU(飞控通常有2-3个IMU) 默认用主IMU,如果主IMU故障会自动切换
EKF3_GPS_TYPE GPS融合模式(0=关闭,1=使用,2=仅用于高度) 固定翼建议设为1,除非你在室内飞行
EKF3_MAG_CAL 磁力计校准模式 我习惯用“飞行中校准”,但前提是飞机做过完整的磁力计旋转校准
EKF3_GSF_RUN 地面速度滤波器(用于无GPS时辅助) 建议开启,尤其在城市峡谷等GPS易遮挡的环境

调参时,我建议先看日志里的 EKF3.velInnovEKF3.posInnov 这两个字段。它们表示“新息”——也就是GPS观测值与EKF预测值的差异。如果这个值长期偏大(比如超过5米),说明EKF的预测模型或传感器数据有问题。

3.5 知识体系图

下面这张图,帮你理清EKF在导航架构中的位置:

ArduPilot EKF导航架构 IMU (陀螺+加计) GPS 空速计 磁力计 EKF3 核心滤波器 预测步 (400Hz) → 更新步 (5-10Hz) → 状态修正 位置/速度估计 姿态估计 (四元数) 风速/风向估计 导航与控制层 (L1/TECS)

从图中可以看到,EKF处于传感器和控制器之间。它不直接输出控制指令,而是输出干净、连续、可信的状态估计。后面的L1导航控制器和TECS(总能量控制系统)再根据这些估计去计算舵面指令。

3.6 实际项目中的经验

最后分享一个我踩过的坑。有一次在海上飞行,磁力计受到船体磁场干扰,EKF的姿态估计开始漂移。飞机在直线飞行时,机翼却慢慢倾斜,最后进入螺旋。事后分析日志发现,EKF的磁力计新息(magInnov)在几分钟内从0.1逐渐增大到0.8,但因为没有触发故障检测,EKF一直“相信”了错误的磁力计数据。

从那以后,我养成了一个习惯:在每次飞行前,检查EKF的故障标志位。在Mission Planner里,可以查看 EKF3.health 参数,如果小于1,说明EKF认为某些传感器不可靠。这时候别起飞,先排查问题。

警告: 不要盲目相信EKF的自动切换功能。虽然EKF3支持在传感器故障时自动降级(比如从GPS+IMU降级到纯IMU),但降级后的位置精度会大幅下降。在固定翼飞行中,这可能导致无法返航。我建议在参数中设置 EKF3_FAILURE_MODE=1,当EKF检测到严重故障时,强制切换到手动模式,让飞行员接管。

好了,这一章的内容就到这里。EKF是飞控的基石,理解它的工作原理,能帮你更好地诊断飞行中的异常。下一章我们会深入L1导航控制器,看看EKF输出的状态是如何被用来跟踪航线的。


专注资料整理