PX4 EKF2 State.h 状态向量详解
一、状态向量概述
EKF 的状态向量
| 分量组 | 符号 | 维数 | 物理意义 |
|---|---|---|---|
| 姿态旋转向量误差 | 3 | 当前姿态与参考四元数之间的小角误差(rad) | |
| NED 速度 | 3 | 北东地坐标系速度(m/s) | |
| NED 位置 | 3 | 北东地坐标系位置(m) | |
| 陀螺仪零偏 | 3 | 角速度偏差估计(rad/s) | |
| 加速度计零偏 | 3 | 加速度偏差估计(m/s²) | |
| 地球磁场(NED) | 3 | 导航坐标系地球磁场分量(Gauss) | |
| 机体磁偏差 | 3 | 机体固连磁场偏差(Gauss) | |
| 风速(NE) | 2 | 北向/东向风速(m/s) | |
| 合计 | — | 24 | — |
二、StateSample 结构体(state.h)
PX4 EKF2 通过 Symforce 自动生成状态结构体,物理布局为:
1 | struct StateSample { |
三、为何用旋转向量误差而非四元数
问题:四元数是 4 维,但只有 3 个自由度(受
解决方案:EKF2 采用误差状态卡尔曼滤波(ESKF):
- 名义状态(nominal state):
_state.quat_nominal— 存储完整四元数,用于预测 - 误差状态(error state):旋转向量
— 用于卡尔曼更新(协方差矩阵 P 是 24×24)
融合时,卡尔曼增益计算出误差修正量
将误差注入名义四元数,最后对四元数归一化。
四、协方差矩阵 P 的维数与索引
协方差矩阵 P 是 24×24(或 25×25)浮点数矩阵,其索引与状态分量的对应:
1 | // 状态索引枚举(P矩阵行/列索引) |
五、OutputPredictor 的输出状态
OutputPredictor 维护独立的实时积分状态(无延迟),供飞控直接使用:
1 | struct outputSample { |
OutputPredictor 以 IMU 原始频率(1 kHz)运行,每收到延迟 EKF 的修正量后,通过互补滤波对实时积分状态进行校正,保证输出的低延迟与无漂移。
六、状态初始化
1 | void Ekf::initialiseFilter() { |
七、小结
- EKF2 使用 24 维(含地形 25 维)误差状态向量,协方差矩阵 P 也是对应维数。
- 姿态用旋转向量误差 + 名义四元数的 ESKF 形式,避免约束奇异性。
- 状态索引与 P 矩阵的行/列一一对应,是阅读协方差预测(
covariance.cpp)和融合代码(measurementUpdate())的关键。
上一篇:RingBuffer 环形缓冲区
下一篇:EKF2 应用管理结构 EKF2.cpp
系列总目录:PX4 v1.16 源码解读总目录