4、传感器融合算法:PX4的EKF2与ArduPilot的EKF3,谁更稳定?

传感器融合,说白了就是飞控的「大脑皮层」。它把IMU、GPS、磁罗盘、气压计这些乱七八糟的数据揉在一起,输出一个靠谱的姿态和位置。PX4用EKF2,ArduPilot用EKF3,很多人问我哪个更稳。我的回答是:没有绝对的好坏,只有合不合适的场景。

先别急着站队。我做过不少飞控移植项目,两种算法都踩过坑。今天咱们就掰开揉碎,看看它们到底差在哪。

4.1 核心架构差异:EKF2 vs EKF3

EKF2和EKF3都基于扩展卡尔曼滤波,但设计哲学完全不同。

对比维度 PX4 EKF2 ArduPilot EKF3
状态向量维度 24维(含磁偏角、风场) 22维(可扩展至28维)
传感器冗余策略 主/备切换,单实例运行 多实例并行,投票融合
GPS失效处理 自动降级为光流+气压 支持惯性导航+视觉惯性
磁干扰补偿 在线估计硬铁/软铁 动态磁异常检测+剔除
代码维护状态 稳定,更新频率低 活跃,每季度有改进

你看,EKF2像个老派的瑞士军刀——功能固定,但足够可靠。EKF3则像个模块化工具箱,你可以根据任务拼装不同的传感器组合。

关键结论:EKF2的24维状态是写死的,EKF3的22维是基础,你可以通过参数EKF3_ENABLE开启额外维度。我建议:如果只用GPS+IMU,EKF2更省心;如果要上RTK、双目视觉或激光雷达,EKF3的扩展性更好。

4.2 稳定性实测:我踩过的坑

先说说EKF2。我在一个农业植保项目里用过PX4,飞的是六轴,挂10公斤药箱。有一次GPS信号被高压线干扰,EKF2瞬间跳到了「光流+气压」模式。嗯,当时飞机正在3米高度悬停,突然开始上下漂移。我赶紧切增稳手动救回来。后来查日志发现,EKF2的GPS权重降得太快,导致高度融合瞬间失准。

再说EKF3。另一个项目是ArduPilot的VTOL,在山区做测绘。山谷里GPS多径效应严重,EKF3的多实例投票机制起了作用。它同时跑了3个滤波器实例,每个用不同的传感器子集,最后选置信度最高的那个输出。那次飞行,即使GPS偶尔跳变,飞机姿态一直很稳。

我的经验:EKF2在传感器突然失效时,切换逻辑比较「硬」,容易产生阶跃。EKF3因为有多个实例并行,切换更平滑。但代价是EKF3的CPU占用率比EKF2高约15%~20%。如果你用F4主控,建议优先考虑EKF2。

4.3 参数调优:别让默认值害了你

很多人拿到飞控就用默认参数,这是大忌。EKF2和EKF3都有几十个参数,但真正关键的只有几个。

EKF2 必调参数

  • EKF2_IMU_POS_X/Y/Z:IMU相对重心的位置。我见过有人装歪了IMU,结果悬停时飞机一直偏航。量准了再填。
  • EKF2_GPS_CHECK:GPS数据有效性检查阈值。默认太宽松,建议从0.5改到0.3,减少异常GPS的干扰。
  • EKF2_MAG_TYPE:磁力计类型。如果你用外置罗盘,记得改成2(外置罗盘优先)。

EKF3 必调参数

  • EKF3_IMU_MASK:选择使用哪个IMU。双IMU的板子,建议同时启用,让EKF3自动融合。
  • EKF3_GPS_TYPE:GPS融合模式。1是单GPS,2是双GPS。我建议用2,冗余性更好。
  • EKF3_MAG_CAL:磁力计校准模式。默认是3(飞行中在线校准),但如果你在强磁环境(比如变电站附近),改成2(仅地面校准)更安全。

警告:我曾经在调试EKF3时,把EKF3_VELD_NOISE(速度观测噪声)设得太小,结果滤波器对GPS速度过于信任。飞机在顺风飞行时,地速突然增大,EKF3以为GPS坏了,直接切到惯性推算,导致位置漂移。这个参数建议保持默认,除非你非常清楚自己在做什么。

4.4 传感器融合流程图

下面这张图是我自己总结的,两种算法在传感器融合时的核心路径差异。你看一眼就明白了。

EKF2 vs EKF3 传感器融合流程对比 EKF2 vs EKF3 传感器融合流程对比 EKF2 单实例串行流程 传感器数据采集(IMU/GPS/磁/气压) 数据有效性检查(GPS_CHECK等) 主滤波器更新(24维状态) 输出姿态/位置/速度 EKF3 多实例并行流程 传感器数据采集(IMU/GPS/磁/气压) 传感器分组(3个实例不同子集) 3个滤波器并行更新 投票机制选择最优输出 输出姿态/位置/速度 核心差异 EKF2:单实例串行,传感器失效时切换模式,CPU占用低 EKF3:多实例并行,投票融合,传感器失效时自动剔除,CPU占用高

4.5 选型建议:什么时候选谁?

你想想看,如果你只是飞个普通的四轴,用默认GPS,不搞什么花哨的传感器,EKF2完全够用。它稳定、省资源、文档多。但如果你要做工业级应用,比如电力巡检、物流配送,或者要在城市峡谷、强磁干扰环境下飞,我建议你上EKF3。

我个人的习惯是:原型验证用EKF2,量产部署用EKF3。为什么?因为EKF2调试简单,出问题容易定位;EKF3虽然复杂,但容错性强,适合长期稳定运行。

一句话总结:EKF2是「稳如老狗」,EKF3是「灵活如蛇」。选哪个,取决于你的飞机要面对什么样的环境。如果你还在犹豫,不妨两个都试试——反正代码都是开源的,烧个固件又不花钱。