3、协方差矩阵调优:过程噪声协方差Q、测量噪声协方差R、初始协方差P0
好,咱们直接进入正题。前面聊完了状态量和观测量,接下来这块儿,才是EKF调参里最磨人的地方——协方差矩阵。
说白了,Q、R、P0这三个矩阵,就是EKF的“三驾马车”。你调得好,滤波器就听话;调不好,它要么反应迟钝,要么直接发散给你看。我在项目里见过太多人,算法公式背得滚瓜烂熟,一上手调Q和R就懵了。
嗯,今天我就把这三兄弟掰开揉碎了讲清楚。
3.1 初始协方差P0:给滤波器一个“起点”
P0代表的是,在刚开始那一时刻,我们对状态估计的不确定度。你想想看,无人机刚上电,IMU还没预热,GPS还没搜到星,这时候你对位置、速度、姿态的把握有多大?
我个人习惯,P0设得稍微“大方”一点。什么意思?
- 位置P0:如果用的是GPS,初始位置误差可能在几米到几十米。我一般设 diag(10, 10, 10) 单位是米²。
- 速度P0:悬停起飞的话,速度不确定度小一些,diag(1, 1, 1) 单位 (m/s)²。
- 姿态P0:这个要小心。如果初始对准没做,欧拉角误差可能很大。我建议设 diag(0.1, 0.1, 0.1) 弧度²,大概相当于5.7°的不确定度。
核心原则:P0设得偏大,滤波器会快速收敛;设得太小,滤波器会“固执己见”,导致初期估计值迟迟追不上真实值。
我曾经在一个飞控项目里,把P0设得太小,结果无人机起飞后姿态估计一直有偏差,飞控以为自己是平的,其实已经歪了。嗯,那次差点炸机。
3.2 过程噪声协方差Q:对“模型”的信任程度
Q矩阵描述的是,我们的运动模型到底有多准。说白了,就是你对“IMU积分出来的结果”有多大信心。
Q越大,说明你觉得模型噪声大,滤波器就会更依赖测量值。Q越小,说明你觉得模型很准,滤波器就更相信IMU积分。
这里有个常见的坑:Q不是随便拍脑袋设的。它应该反映真实的物理过程。
举个例子,加速度计的噪声密度是 0.01 m/s²/√Hz,陀螺仪是 0.001 rad/s/√Hz。那Q该怎么设?
// 以离散时间系统为例,dt为IMU采样周期
// 加速度计噪声方差: (噪声密度)^2 / dt
// 陀螺仪噪声方差: (噪声密度)^2 / dt
float dt = 0.005; // 200Hz IMU
float acc_noise = 0.01; // m/s²/√Hz
float gyro_noise = 0.001; // rad/s/√Hz
float acc_var = (acc_noise * acc_noise) / dt; // 约 0.02
float gyro_var = (gyro_noise * gyro_noise) / dt; // 约 0.0002
// 对于15维状态向量 [位置, 速度, 姿态, 加速度偏置, 陀螺仪偏置]
// Q矩阵对角线元素可以这样设:
// 位置过程噪声:很小,因为位置是通过速度积分来的
// 速度过程噪声:acc_var
// 姿态过程噪声:gyro_var
// 加速度偏置过程噪声:通常很小,比如 1e-6
// 陀螺仪偏置过程噪声:通常很小,比如 1e-8
我的经验:Q矩阵里,速度噪声和姿态噪声是最敏感的。我一般先根据传感器手册算一个理论值,然后在实际飞行中微调。如果发现估计值抖动厉害,就适当减小Q;如果发现跟踪滞后,就增大Q。
3.3 测量噪声协方差R:对“传感器”的信任程度
R矩阵和Q正好相反。R描述的是测量值的噪声有多大。R越大,说明你觉得这个传感器不准,滤波器就会更相信模型预测。
GPS的R怎么设?看HDOP和卫星颗数。气压计的R怎么设?看高度变化率。
我见过有人把R设成固定值,结果GPS信号差的时候,滤波器还把噪声很大的位置测量当宝贝,导致位置估计乱跳。
| 传感器 | 典型R值 | 备注 |
|---|---|---|
| GPS位置(水平) | 5~25 m² | 根据HDOP动态调整 |
| GPS速度(水平) | 0.5~2 (m/s)² | GPS速度一般比位置准 |
| 气压计高度 | 1~10 m² | 受风影响大,动态调整 |
| 磁力计航向 | 0.01~0.1 rad² | 受磁场干扰严重 |
注意:R设得太小,滤波器会“过拟合”测量值,导致估计值剧烈抖动。R设得太大,滤波器会忽略测量值,导致估计值发散。我建议在调试时,先让R偏大一些,保证稳定性,再逐步减小。
3.4 三者的关系:一张图看懂
为了让你更直观地理解Q、R、P0的关系,我画了一张流程图。这张图我每次培训必讲,因为它把EKF的核心逻辑说透了。
这张图你看懂了吗?P0决定了起点,Q和R决定了整个飞行过程中的“信任分配”。
3.5 实战调优步骤
说了这么多理论,来点实际的。我总结了一套调优步骤,你照着做就行。
- 先固定P0:按3.1节的方法设一个偏大的值,保证滤波器能收敛。
- 再调R:把无人机放在静止状态,观察估计值的噪声。如果噪声太大,增大R;如果估计值太“死”,减小R。
- 最后调Q:让无人机做小幅机动(比如前后晃动),观察跟踪延迟。如果延迟大,增大Q;如果抖动厉害,减小Q。
- 反复迭代:Q和R是相互影响的。调了Q可能要重新调R,反之亦然。别嫌麻烦,这是必经之路。
避坑指南:我曾经在一个项目中,为了追求极致的动态响应,把Q设得很大,R设得很小。结果无人机在悬停时,位置估计值像心电图一样上下跳动。后来花了整整两天,才找到一个平衡点。所以,别贪心,稳定第一。
好了,协方差矩阵这块儿就讲到这里。记住,P0、Q、R不是孤立存在的,它们是一个整体。你调好了一个,另外两个也得跟着动。嗯,下一节我们聊聊更具体的——怎么在实际代码里实现这些矩阵的更新。