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 的输入不是“直接读传感器”,而是订阅 uORB 话题。因此任何传感器数据异常,都要先确认对应话题是否正常发布,再排查 EKF2 内部逻辑。

二、EKF2 模块结构:从入口到融合

EKF2 模块内部大致可分为四层:消息接收层、数据缓冲与时间同步层、核心滤波层、输出发布层。消息接收层负责订阅 uORB 话题并做有效性检查;缓冲层对 IMU、GPS 等异步数据进行时间对齐;核心滤波层执行预测与更新;输出层把状态和协方差转换为标准话题发布。

核心滤波层采用 24 维误差状态卡尔曼滤波器。它并不直接估计“绝对状态”,而是估计“名义状态 + 误差状态”。名义状态由 IMU 积分推进,误差状态由卡尔曼滤波修正。这种设计让滤波器在数值上更稳定,也便于处理四元数归一化等约束。

EKF2 架构与数据流 uORB 输入话题 sensor_combined vehicle_gps_position vehicle_magnetometer distance_sensor optical_flow vehicle_air_data vehicle_visual_odometry 缓冲与时间同步 IMU 积分缓冲 GPS 延迟补偿 观测时间对齐 数据有效性检查 核心滤波层 名义状态预测 IMU 积分推进 误差状态更新 卡尔曼增益修正 协方差传播 P = F P Fᵀ + Q 观测更新 K = P Hᵀ (H P Hᵀ + R)⁻¹ 状态修正与归一化 四元数 / 位置 / 速度 输出话题 vehicle_attitude local_position global_position vehicle_odometry estimator_status 数据流:uORB 输入 → 缓冲同步 → 名义状态预测 + 误差状态更新 → uORB 输出

三、主状态向量:24 维误差状态

EKF2 的主状态向量由名义状态和误差状态共同描述。名义状态包括位置、速度、姿态四元数、陀螺零偏、加速度零偏、磁力计零偏、风估计等。误差状态则是这些量的小偏差,共 24 维,用于卡尔曼滤波的线性化更新。

具体维度划分如下:位置误差 3 维、速度误差 3 维、姿态误差 3 维、陀螺零偏误差 3 维、加速度零偏误差 3 维、磁力计零偏误差 3 维、风估计误差 3 维,再加上地磁相关状态等。不同 PX4 版本维度可能略有差异,但核心结构一致。

状态分量 维度 物理含义 主要观测来源
位置误差3NED 位置偏差GPS、光流、视觉
速度误差3NED 速度偏差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 确认各观测源的健康状态,再进入正式任务。