3、卡尔曼滤波入门:状态空间模型、预测与更新步骤、协方差矩阵的意义

卡尔曼滤波,说白了就是一套「猜得准」的数学方法。

我刚开始接触它的时候,觉得这东西玄乎得很。后来在目标跟踪项目里被噪声折磨得够呛,才真正体会到它的价值。你想想看,传感器测出来的数据总是带噪声的——雷达可能跳一下,摄像头可能丢一帧。卡尔曼滤波干的事就是:把「不太准的测量」和「不太准的预测」揉在一起,揉出一个更准的结果。

3.1 状态空间模型:你在跟踪什么?

先问一个问题:你要描述一个运动的目标,最少需要几个数?

位置?对。速度?也对。如果目标在二维平面上运动,那就是四个数:x位置、y位置、x方向速度、y方向速度。这组数,就是状态向量。

状态空间模型的核心思想:把系统抽象成一组随时间演变的变量,用数学方程描述它们的变化规律。

我个人习惯把状态空间模型拆成两半来看:

  • 状态方程:描述状态怎么随时间变化。比如「下一时刻的位置 = 当前位置 + 速度 × 时间间隔」。
  • 观测方程:描述我们能测到什么。比如「雷达测到的距离 = 真实距离 + 测量噪声」。

用数学写出来就是:

x(k) = A · x(k-1) + B · u(k) + w(k)    // 状态方程
z(k) = H · x(k) + v(k)                  // 观测方程

这里:

  • x(k) 是 k 时刻的状态向量
  • A 是状态转移矩阵——描述上一时刻的状态怎么变到这一时刻
  • B 是控制输入矩阵——如果你有油门、刹车这类控制量
  • u(k) 是控制输入
  • w(k) 是过程噪声——模型不完美带来的误差
  • z(k) 是观测值
  • H 是观测矩阵——把状态映射到观测空间
  • v(k) 是观测噪声——传感器本身的误差

嗯,这里要注意:w(k) 和 v(k) 都是随机变量,我们假设它们服从高斯分布。为什么?因为高斯分布数学性质好,算起来方便。现实世界不一定完美高斯,但够用了。

3.2 预测与更新:两步走,循环往复

卡尔曼滤波就两个步骤,像个永不停歇的循环:

  1. 预测(Predict):根据上一时刻的状态,猜一下当前时刻的状态
  2. 更新(Update):拿到当前时刻的测量值,修正刚才的猜测

我在项目中遇到过这样的情况:雷达每 50ms 发一帧数据,但中间有丢帧。卡尔曼滤波的预测步骤就能帮我「脑补」出丢帧期间目标的位置。等下一帧数据来了,更新步骤再把它拉回真实轨迹。

预测步骤

x_pred = A · x_prev + B · u          // 预测状态
P_pred = A · P_prev · A^T + Q        // 预测协方差

这里多了一个 P 和 Q。P 是协方差矩阵,代表我们对当前状态估计的不确定度。Q 是过程噪声协方差矩阵,代表模型本身的不确定性。

更新步骤

K = P_pred · H^T · (H · P_pred · H^T + R)^(-1)   // 卡尔曼增益
x_updated = x_pred + K · (z - H · x_pred)         // 更新状态
P_updated = (I - K · H) · P_pred                  // 更新协方差

这个 K 就是卡尔曼增益,它是整个算法的灵魂。它决定了:你更相信预测,还是更相信测量?

我的经验:卡尔曼增益 K 的值在 0 到 1 之间。K 接近 0 时,说明测量噪声大,我更相信预测。K 接近 1 时,说明预测不准,我更相信测量。调参的时候,调整 Q 和 R 的比值,本质上就是在调这个 K 的行为。

3.3 协方差矩阵的意义:不确定度的「地图」

协方差矩阵 P 可能是初学者最头疼的东西。我刚开始也绕了很久,后来想明白了一件事:它其实就是一张「不确定度的地图」。

假设我们只跟踪一维位置 x 和速度 v,那么协方差矩阵长这样:

P = | P_xx  P_xv |
    | P_vx  P_vv |
  • P_xx:位置的不确定度(方差)
  • P_vv:速度的不确定度(方差)
  • P_xv 和 P_vx:位置和速度的相关性——如果位置偏大,速度是不是也偏大?

为什么这个矩阵重要?

举个例子。假设你跟踪一辆匀速行驶的车。如果位置不确定度很大,但速度不确定度很小,那说明你知道车大概跑多快,但不知道它具体在哪。这时候,卡尔曼滤波会倾向于用速度来推算位置——因为速度更可信。

反过来,如果位置很准但速度不准,那滤波就会更依赖位置测量来修正速度估计。

我曾经踩过的坑:一开始我把协方差矩阵的初始值设得特别小,觉得「我的初始猜测很准」。结果滤波器收敛极慢,因为初始的 P 太小,导致卡尔曼增益 K 一直很小,测量值几乎不起作用。后来我学乖了:初始 P 设大一点,让滤波器先「大胆尝试」,再慢慢收敛。

3.4 一张图看懂卡尔曼滤波

下面这张 SVG 图展示了卡尔曼滤波的完整流程。我建议你盯着它看一分钟,把预测和更新的循环刻在脑子里。

卡尔曼滤波核心流程 初始状态 x₀, P₀ 预测步骤 (Predict) x_pred = A·x + B·u P_pred = A·P·Aᵀ + Q 更新步骤 (Update) K = P_pred·Hᵀ·(H·P_pred·Hᵀ+R)⁻¹ x = x_pred + K·(z - H·x_pred) P = (I - K·H)·P_pred 输出 x, P 下一时刻循环 测量值 z (带噪声) 预测 更新 测量输入 输出 初始状态

3.5 调参心得:Q 和 R 的博弈

卡尔曼滤波里最让人头疼的就是调参。说白了就是调两个东西:

  • 过程噪声协方差 Q:模型有多不准?目标突然加速了?转弯了?Q 设大一点,滤波器会更「灵活」。
  • 测量噪声协方差 R:传感器有多不准?R 设大一点,滤波器会更「平滑」。

我个人的经验是:先固定 R(根据传感器手册上的噪声指标来设),然后调 Q。Q 太小,滤波结果会滞后;Q 太大,结果会抖动。找到一个平衡点,让滤波后的轨迹既平滑又能跟上真实运动。

一句话总结:卡尔曼滤波就是「预测 + 测量 → 加权平均」,权重由协方差矩阵自动计算。你只需要告诉它:你的模型有多可信(Q),你的传感器有多可信(R)。剩下的,它自己搞定。

嗯,这一章的内容就到这里。协方差矩阵这个东西,光看公式确实抽象。我建议你动手写一个一维的卡尔曼滤波代码,跟踪一个匀速运动的目标。跑起来之后,打印出每一步的 P 矩阵,看着它慢慢收敛——那种感觉,比看十遍公式都管用。