4、离散卡尔曼滤波推导:系统模型、预测步骤、更新步骤、卡尔曼增益

各位同学,欢迎来到第四讲。

说实话,卡尔曼滤波的推导,是很多人入门导航融合时最头疼的一关。我当年刚接触时,看着那一堆矩阵和协方差,也是一脸懵。但后来在项目里摔打了几次,慢慢就摸到门道了。

今天咱们就把这个「硬骨头」啃下来。我会带着大家,从系统模型开始,一步步推导出预测、更新和卡尔曼增益。你跟着我的思路走,保证能理清楚。

4.1 系统模型:你得先知道系统长什么样

做卡尔曼滤波,第一步就是建模。说白了,你得用数学语言告诉计算机:这个系统是怎么演变的?传感器是怎么观测的?

离散卡尔曼滤波假设系统是线性的,模型分两部分:

1. 状态方程(预测模型)

描述状态如何随时间变化:

x_k = F * x_{k-1} + B * u_k + w_k
  • x_k:k时刻的状态向量(比如位置、速度)
  • F:状态转移矩阵(描述上一时刻状态如何影响当前)
  • B:控制输入矩阵
  • u_k:控制输入(比如加速度指令)
  • w_k:过程噪声,服从 N(0, Q)

2. 观测方程(测量模型)

描述传感器如何观测状态:

z_k = H * x_k + v_k
  • z_k:观测向量(比如GPS位置)
  • H:观测矩阵(把状态映射到观测空间)
  • v_k:观测噪声,服从 N(0, R)
我的经验: 建模时最容易犯的错,就是忽略噪声的统计特性。Q和R矩阵的取值,直接影响滤波效果。我建议你刚开始时,先根据传感器手册的噪声参数来设,然后在实际数据上微调。

4.2 预测步骤:先猜一个大概

预测步骤,就是利用系统模型,根据上一时刻的最优估计,来「猜」当前时刻的状态。说白了,就是先蒙一个。

预测分两步:

1. 状态预测

x̂_k|k-1 = F * x̂_{k-1|k-1} + B * u_k

这里 x̂_k|k-1 表示:基于k-1时刻的信息,对k时刻状态的预测。注意,这里没有加噪声项,因为噪声的期望是0。

2. 协方差预测

P_k|k-1 = F * P_{k-1|k-1} * F^T + Q

协方差矩阵 P 代表我们对状态估计的不确定度。预测会让不确定度增大(因为加了过程噪声Q)。

核心理解: 预测步骤的本质,就是「传播」不确定度。你想想看,系统在运动,模型又有误差,我们对状态的把握自然会越来越模糊。这个协方差矩阵,就是量化这种模糊程度的。

4.3 更新步骤:用观测来修正

预测完了,我们有了一个「猜测值」。现在传感器送来一个观测值,我们得用这个观测来修正之前的猜测。

更新步骤的核心公式:

x̂_k|k = x̂_k|k-1 + K_k * (z_k - H * x̂_k|k-1)

这个公式很直观:

  • z_k - H * x̂_k|k-1 叫「残差」或「新息」,就是实际观测和预测观测的差值
  • K_k 就是卡尔曼增益,它决定了我们有多相信这个残差

同时,协方差也要更新:

P_k|k = (I - K_k * H) * P_k|k-1

更新后,协方差会变小,说明我们对状态的把握更精确了。

避坑指南: 我曾经在调试一个无人机导航系统时,发现滤波结果发散。查了半天,原来是观测矩阵H写错了。H的维度必须和传感器数据匹配,否则残差计算就是错的。这个细节,你一定要注意。

4.4 卡尔曼增益:信任的权重

卡尔曼增益 K_k 是整个滤波器的灵魂。它决定了预测和观测谁更可信。

它的计算公式是:

K_k = P_k|k-1 * H^T * (H * P_k|k-1 * H^T + R)^{-1}

这个公式看着复杂,但本质很简单:

  • 分子 P_k|k-1 * H^T:代表预测的不确定度映射到观测空间
  • 分母 H * P_k|k-1 * H^T + R:代表预测不确定度 + 观测噪声

说白了,卡尔曼增益就是「预测不确定度」和「总不确定度」的比值。

极端情况分析:

情况 K_k 取值 含义
观测噪声R → 0 K_k → H^{-1} 完全相信观测,忽略预测
预测协方差P → 0 K_k → 0 完全相信预测,忽略观测
我的习惯: 在实际项目中,我会先让卡尔曼增益自适应调整。比如GPS信号好的时候,R设小一点,让滤波器更相信GPS;信号差的时候,R设大一点,让滤波器更依赖IMU的预测。这种自适应策略,在很多场景下效果都不错。

4.5 完整算法流程

把上面这些串起来,离散卡尔曼滤波的完整流程就是:

  1. 初始化:设定初始状态 x̂_0 和初始协方差 P_0
  2. 预测:计算 x̂_k|k-1P_k|k-1
  3. 计算增益:计算 K_k
  4. 更新:用观测 z_k 修正状态和协方差
  5. 循环:k = k+1,回到步骤2

嗯,这里要注意:这个流程是递归的,每一时刻只需要上一时刻的状态和协方差,不需要历史数据。这也是卡尔曼滤波高效的原因之一。

好了,这一讲的内容就到这里。下一讲我们会用一个具体的导航融合案例,把今天推导的公式全部跑一遍。到时候你就知道,这些公式在代码里是怎么实现的了。