PX4 EKF2 应用管理层 EKF2.cpp 详解
一、EKF2.cpp 的职责定位
EKF2.cpp 是 EKF 算法库与 PX4 飞控系统之间的粘合层(Glue Layer)。它不实现任何 EKF 数学算法,其职责是:
- 通过 uORB 订阅传感器原始数据
- 将 uORB 数据格式转换为 EKF 库接受的内部格式(
imuSample,gnssSample等) - 调用 EKF 算法库执行估计
- 将 EKF 输出发布为 uORB 话题供飞控其他模块使用
EKF2 运行在 WorkQueue(wq:ekf2)上,由 sensor_combined 或 vehicle_imu 话题到达时触发 Run()。
相关基础:uORB 通信机制(上),uORB 通信机制(下)
二、Run() 主循环
1 | void EKF2::Run() { |
三、数据订阅与发布
3.1 订阅的 uORB 话题
| 话题 | 类型 | 说明 |
|---|---|---|
vehicle_imu |
按实例订阅 | 每个 IMU 芯片对应一个实例(EKF2 有多实例) |
vehicle_gps_position |
可选 | GNSS 位置/速度 |
vehicle_magnetometer |
可选 | 磁力计数据 |
vehicle_air_data |
可选 | 气压计气压和高度 |
distance_sensor |
可选 | 测距仪 |
vehicle_optical_flow |
可选 | 光流 |
vehicle_visual_odometry |
可选 | 外部视觉/VIO/MoCap |
landing_target_pose |
可选 | 精确降落目标 |
airspeed_validated |
可选 | 空速 |
3.2 发布的 uORB 话题
| 话题 | 下游使用者 | 关键字段 |
|---|---|---|
vehicle_attitude |
mc_pos_control, Commander | 姿态四元数 q |
vehicle_local_position |
mc_pos_control, Navigator | NED 位置/速度/加速度 |
vehicle_global_position |
Navigator, GCS | 经纬度、海拔 |
vehicle_odometry |
外部系统 | 完整位姿 |
estimator_status |
QGC 健康监控 | 新息、方差、错误标志 |
estimator_innovations |
调试 | 各传感器新息和方差 |
wind |
固定翼空速控制 | 风速估计 |
ekf_gps_drift |
健康监控 | GPS 漂移 |
四、多实例架构与 EKF2Selector
4.1 多实例设计
PX4 飞控板可能搭载多个 IMU(如 Pixhawk 6C 有 3 个 IMU)。EKF2 对每个 IMU 单独运行一个 EKF 实例,相互独立。每个实例都发布完整的估计结果,只是实例编号不同(vehicle_attitude:0、vehicle_attitude:1 等)。
4.2 EKF2Selector 选择策略
EKF2Selector 负责从多个 EKF 实例中选择一个最优输出,供控制器使用:
1 | flowchart TD |
评分准则(综合多个因素):
- 姿态估计健康(没有大的姿态翻转)
- IMU 振动水平(滤除振动严重的 IMU)
- 新息检验通过率(GPS/Baro/Mag 新息是否合理)
- 传感器错误标志(卡尔曼滤波器未发散)
切换策略:Primary 实例评分显著降低时,无缝切换至 Fallback 实例。切换时对位置状态进行对齐,避免跳变。
五、参数更新机制
EKF2 通过 updateParams() 将 PX4 参数系统的值同步到 EKF 库内部的 parameters 结构:
1 | void EKF2::updateParams() { |
参数变更(通过 QGC 或 MAVLink 命令修改 EKF2_* 参数)触发 parameter_update 话题,EKF2 订阅后在下次 Run() 调用 updateParams()。
六、健康状态发布
estimator_status 是 EKF 健康状态的核心话题,关键字段:
1 | struct estimator_status_s { |
filter_fault_flags 的任意位置 1 都表示 EKF 状态异常(如协方差发散、四元数非法等),Commander 会据此触发估计器失效保护。
七、小结
EKF2.cpp 的核心价值在于:将 EKF 纯算法库与 PX4 模块化架构解耦。算法库(/EKF/)不依赖任何 PX4 特定的 uORB、参数系统,可以独立编译和单元测试;而 EKF2.cpp 负责所有 PX4 特定的 I/O 适配。
多实例 + Selector 的架构是 PX4 冗余估计的实现基础,在飞行安全上有实质意义。
上一篇:State.h 状态向量
下一篇:ekf.cpp 核心主循环
系列总目录:PX4 v1.16 源码解读总目录