PX4 EKF2 协方差矩阵预测 covariance.cpp
一、协方差矩阵的作用
协方差矩阵 P 是 EKF 的核心数据结构之一,其物理意义是状态估计误差的统计描述:
- P 的对角元 P[i][i] = 状态分量 i 的方差,即估计误差的平方期望
- P 的非对角元 P[i][j] = 状态 i 与 j 的协方差,描述误差的相关性
P 越大,表示 EKF 对该状态量的估计越不确信;卡尔曼增益 K 正比于 P,P 大时 EKF 更信任传感器测量,给予更大的修正力度。
EKF2 的 P 矩阵是 24×24(含地形则 25×25),covariance.cpp 负责其全生命周期管理。
二、协方差初始化 initialiseCovariance()
初始化在 initialiseFilter() 中调用,将 P 设为对角矩阵,各对角元反映对初始状态的先验不确定度:
1 | void Ekf::initialiseCovariance() { |
三、协方差预测 predictCovariance()
predictCovariance() 实现了离散时间 EKF 的协方差传播:
其中:
是状态转移矩阵(系统雅可比),由 IMU 数据计算 是过程噪声协方差矩阵
3.1 F 矩阵的稀疏性利用
完整的 F 矩阵是 24×24,但大部分元素为零(稀疏矩阵)。EKF2 使用 Symforce 自动生成的符号化展开代码,只计算非零元素,避免全矩阵乘法(24³ = 13824 次浮点运算 → 优化后仅需数百次)。
关键的 F 矩阵耦合项(非零非对角块):
| 行(状态) | 列(状态) | 物理含义 |
|---|---|---|
| 速度 | 姿态误差 | 速度预测依赖机体→导航系旋转,姿态误差影响速度预测误差 |
| 速度 | 加速度计零偏 | 加速度计零偏直接影响速度积分 |
| 位置 | 速度 | 位置是速度的积分 |
| 姿态 | 陀螺仪零偏 | 陀螺仪零偏直接影响姿态积分 |
3.2 过程噪声 Q
Q 矩阵描述系统动力学模型的不确定性(随机游走噪声)。EKF2 的 Q 是对角矩阵:
1 | // 陀螺仪过程噪声(持续随机游走) |
四、数值稳定性约束 constrainCovariance()
实际代码中协方差矩阵会因数值误差导致对称性破坏或对角元变负,需要定期约束:
1 | void Ekf::constrainCovariance() { |
五、协方差重置场景
以下情况会触发局部或全局协方差重置:
| 场景 | 动作 |
|---|---|
initialiseFilter() 调用 |
全局重置为初始对角矩阵 |
磁力计融合崩溃(fuseYaw 病态) |
调用 initialiseCovariance()(全局重置) |
| 速度/位置状态重置 | 对应分块清零(消除与其他状态的相关性) |
| 传感器切换(如 GPS→EV) | 对对应状态协方差膨胀(增大不确定度) |
| 长时间 GPS 丢失 | 位置方差随时间增大(过程噪声累积) |
局部重置示例(GPS 速度重置时):
1 | // 速度重置时,清除速度与其他状态的协方差(相关性不再有效) |
六、小结
covariance.cpp 实现了 EKF 的不确定度管理:
- 初始化——设定合理先验,反映各传感器精度
- 预测传播——Symforce 自动代码高效计算 F·P·F’+Q
- 数值稳定——对称强制 + 上下限约束,防止计算病态
- 局部重置——传感器切换时精确清理相关性,避免错误传播
P 矩阵的健康状态直接决定卡尔曼增益的合理性,是整个 EKF 系统可靠工作的基础。
上一篇:ekf.cpp 核心主循环
下一篇:融合调度 control.cpp
系列总目录:PX4 v1.16 源码解读总目录