4. EKF2 架构与数据流
PX4 的 EKF2 并不是一个“黑盒滤波器”,而是一套由 uORB 消息驱动、以模块化方式组织的状态估计系统。理解它的架构与数据流,是后续调参、排障和日志分析的基础。本节从消息入口、模块结构、状态向量、协方差矩阵到输出接口,梳理 EKF2 的完整链路。
一、uORB 消息:EKF2 的输入与输出总线
EKF2 与飞控其他模块之间通过 uORB 发布/订阅机制通信。传感器驱动、GPS、光流、视觉等模块把数据发布为 uORB 话题,EKF2 订阅这些话题作为观测输入;EKF2 完成融合后,再发布估计结果供控制、导航、日志等模块使用。可以把 uORB 理解为 EKF2 的“数据总线”,所有输入输出都以话题形式存在。
典型输入话题包括:sensor_combined(IMU 原始数据)、vehicle_gps_position(GPS 位置与速度)、distance_sensor(测距)、optical_flow(光流)、vehicle_magnetometer(磁力计)、vehicle_air_data(气压高度)等。输出话题则包括 vehicle_local_position、vehicle_global_position、vehicle_attitude、vehicle_odometry 等。
二、EKF2 模块结构:从入口到融合
EKF2 模块内部大致可分为四层:消息接收层、数据缓冲与时间同步层、核心滤波层、输出发布层。消息接收层负责订阅 uORB 话题并做有效性检查;缓冲层对 IMU、GPS 等异步数据进行时间对齐;核心滤波层执行预测与更新;输出层把状态和协方差转换为标准话题发布。
核心滤波层采用 24 维误差状态卡尔曼滤波器。它并不直接估计“绝对状态”,而是估计“名义状态 + 误差状态”。名义状态由 IMU 积分推进,误差状态由卡尔曼滤波修正。这种设计让滤波器在数值上更稳定,也便于处理四元数归一化等约束。
三、主状态向量:24 维误差状态
EKF2 的主状态向量由名义状态和误差状态共同描述。名义状态包括位置、速度、姿态四元数、陀螺零偏、加速度零偏、磁力计零偏、风估计等。误差状态则是这些量的小偏差,共 24 维,用于卡尔曼滤波的线性化更新。
具体维度划分如下:位置误差 3 维、速度误差 3 维、姿态误差 3 维、陀螺零偏误差 3 维、加速度零偏误差 3 维、磁力计零偏误差 3 维、风估计误差 3 维,再加上地磁相关状态等。不同 PX4 版本维度可能略有差异,但核心结构一致。
| 状态分量 | 维度 | 物理含义 | 主要观测来源 |
|---|---|---|---|
| 位置误差 | 3 | NED 位置偏差 | GPS、光流、视觉 |
| 速度误差 | 3 | NED 速度偏差 | GPS、光流、视觉 |
| 姿态误差 | 3 | 四元数小角度偏差 | 磁力计、视觉、GPS |
| 陀螺零偏 | 3 | 角速度零偏 | 静态观测、GPS |
| 加速度零偏 | 3 | 比力零偏 | GPS、测距 |
| 磁力计零偏 | 3 | 磁场测量偏差 | 磁力计 |
| 风估计 | 3 | 水平风速与风向 | GPS 地速对比 |
四、协方差矩阵:滤波器“信心”的量化
协方差矩阵 P 是 EKF2 的核心内部量,它描述每个状态估计的不确定度以及状态之间的相关性。P 的对角线元素是各状态的方差,非对角线元素是状态间的协方差。P 越大,表示滤波器对该状态越“没信心”,观测更新时就会更依赖新测量。
预测阶段,P 按 P = F P Fᵀ + Q 传播,其中 F 是状态转移矩阵,Q 是过程噪声矩阵。更新阶段,卡尔曼增益 K = P Hᵀ (H P Hᵀ + R)⁻¹ 决定修正力度,R 是观测噪声矩阵。调参时调整的 EKF2_GPS_P_NOISE、EKF2_BARO_NOISE 等参数,本质上就是在改 Q 和 R。
estimator_status 话题暴露部分信息,例如各传感器融合的创新量、测试比例等,是排障时的重要依据。
五、输出接口:从状态到可用话题
EKF2 完成融合后,会把内部状态转换为标准 uORB 话题发布。最常用的输出包括:vehicle_attitude(姿态四元数与角速度)、vehicle_local_position(本地 NED 位置、速度、加速度)、vehicle_global_position(经纬度、海拔)、vehicle_odometry(统一里程计接口)、estimator_status(滤波器健康状态)。
控制模块通常订阅 vehicle_attitude 和 vehicle_local_position;导航模块使用 vehicle_global_position;日志模块则记录 estimator_status 用于事后分析。理解这些话题的对应关系,能快速定位“估计异常”还是“控制异常”。
六、案例与常见误区
场景:一架四旋翼在 GPS 模式下出现高度缓慢下沉。排查时先看 vehicle_local_position 的 z 是否漂移,再看 estimator_status 中气压计创新量是否持续偏大。若气压计创新量异常,说明气压观测与预测不一致,可能是 EKF2_BARO_NOISE 设置过小或气压计受气流干扰。
常见误区一:认为 EKF2 直接使用原始传感器数据。实际上它订阅的是 uORB 话题,话题异常会直接导致估计失败。误区二:只关注状态输出,忽略协方差。协方差过大时,估计值可能看起来“正常”,但实际不可信。误区三:把调参等同于改状态向量。调参主要影响 Q、R 和门限,不改变状态维度。
# 查看 EKF2 相关话题
uorb top vehicle_attitude
uorb top vehicle_local_position
uorb top estimator_status
# 查看 EKF2 参数
param show EKF2_*
param show EKF2_GPS_P_NOISE
param show EKF2_BARO_NOISE
掌握 EKF2 的架构与数据流后,后续的传感器融合配置、创新量分析和日志排障都会变得有据可依。建议在实飞前先用 estimator_status 确认各观测源的健康状态,再进入正式任务。