PX4 EKF2 common.h 公共数据结构详解
一、传感器样本结构体
common.h 是 EKF 库的公共头文件,定义了所有模块共享的数据结构和枚举类型。这些结构体被 RingBuffer<T> 模板类直接实例化使用。
1.1 IMU 样本 imuSample
1 | struct imuSample { |
关键设计说明:
- 存储的是增量(delta),而非原始角速度/加速度。增量在降采样过程中累积,避免混叠。
delta_vel_clipping用于检测加速度计饱和,饱和时抑制对应轴的卡尔曼增益(clearInhibitedStateKalmanGains)。
1.2 GNSS 样本 gnssSample
1 | struct gnssSample { |
1.3 磁力计样本 magSample
1 | struct magSample { |
磁力计在 EKF 中负责航向约束(yaw fusion)以及地球磁场矢量估计(3 维)+ 机体磁偏差估计(3 维),共 6 个状态分量。
1.4 其他样本结构
| 结构体 | 主要字段 | 用途 |
|---|---|---|
baroSample |
time_us, hgt(m) |
气压计高度融合 |
gpsSample(旧名) |
→ gnssSample |
— |
rangeSample |
time_us, rng(m), quality |
测距仪高度融合 |
airspeedSample |
time_us, true_airspeed, eas2tas |
空速融合 |
flowSample |
time_us, flow_xy_rad, gyro_xyz_rad, quality |
光流融合 |
extVisionSample |
time_us, pos, vel, quat, pos_var, vel_var, angVar, reset_counter |
外部视觉融合 |
dragSample |
time_us, accelXY(机体坐标系) |
阻力模型辅助风速估计 |
二、辅助源状态结构 AidSourceStatus
AidSourceStatus<N> 是一个模板结构,N 为观测维数(1、2 或 3 维):
1 | template<int N> |
设计要点:
- 新息拒绝机制(
innovation_rejected)基于归一化新息平方(NIS)检验:test_ratio = innov² / S。若超过阈值(通常EKF2_*_GATE参数控制),则本周期拒绝该测量。 time_last_fuse_us用于检测传感器超时,决定是否降级(fallback)。
三、EKF 参数结构 parameters
parameters 结构体集中存放所有 EKF 可调参数。大部分与 EKF2_* 类 PX4 参数对应,通过 EKF2.cpp 的 updateParams() 写入。
关键参数分类
1 | struct parameters { |
设计原则:EKF 的参数调试核心在于过程噪声 vs 观测噪声的权衡:
- 过程噪声大 → EKF 对模型置信度低 → 更信任传感器 → 响应快但更嘈杂
- 观测噪声大 → EKF 对传感器置信度低 → 更信任模型预测 → 平滑但滞后
四、枚举类型
4.1 高度传感器类型
1 | enum class HeightSensor { |
4.2 偏航估计模式
1 | enum class MagFuseType { |
五、小结
common.h 是 EKF 内部所有模块的数据契约:
- 样本结构体 → 规定了
RingBuffer和estimator_interface如何存储传感器数据 - AidSourceStatus → 统一了各传感器融合的状态报告接口
- parameters → 集中管理调参入口,与 PX4 参数系统对接
理解这些数据结构是阅读后续融合代码(control.cpp、covariance.cpp 等)的前提。
相关文章:RingBuffer 环形缓冲区
上一篇:EKF2 目录与层级架构
系列总目录:PX4 v1.16 源码解读总目录