卡尔曼滤波(Kalman Filter)深入解析:从零开始彻底搞懂预测与修正(适合小白,无需数学基础,一步步深入讲解)

在昨天的文章中,我复盘了 均值滤波(滑动平均滤波)、中值滤波、指数滤波、高斯滤波 这些基本滤波方法。这些方法虽然简单易用,但在 复杂环境下(如高噪声、动态系统) 可能存在不足。它们有一个共同的问题

  • 只能基于过去的数据进行简单的平滑处理,但无法预测未来
  • 无法区分真实信号和噪声,一旦数据波动较大,它们可能会使信号失真。

今天,我将复盘更高级的滤波方法:卡尔曼滤波(Kalman Filter,KF),它的核心特点是:

能够预测数据的未来趋势{x}_{k}^{ }
结合当前数据进行修正,使预测更加准确
可以处理动态变化的系统,比如目标跟踪、导航定位
能够区分信号和噪声,即使数据被干扰,依然能估计出真实值

在查看网上各种关于卡尔曼滤波的资料时,发现几乎都是通过数学模型带领大家了解学习,因此我在考虑如果通过简单直白的方式,让我同组并没有平差基础的学弟学妹了解卡尔曼滤波,所以下面我会用尽量简单、直白的话语和例子来解释和介绍卡尔曼滤波。

1.卡尔曼滤波的核心思想

卡尔曼滤波的思想其实很简单,就是 不断进行“预测”和“修正”

  1. 预测:基于之前的数据,估算当前的值。
  2. 修正:用传感器或测量数据,对预测值进行调整,使其更加准确。
  3. 重复上述步骤,不断优化,使误差越来越小。

2.状态变量(State Variables)是什么

在卡尔曼滤波中,我们用一个状态变量 {x}_{k}^{ }来描述系统的状态。
比如,在定位问题中,状态变量可能包含:

  • 仅位置:
  • 位置 + 速度:
  • 位置 + 速度 + 加速度:

卡尔曼滤波的目标就是估计状态变量 {x}_{k}^{ }

3.下面结合实际,来简单的讲述卡尔曼滤波的公式:

假设一个汽车:

  • 当前在 5 米 的位置。
  • 速度是 2 米/秒
  • 你想预测它1 秒后的位置

那么:预测位置=5+2=7 米 

这就是卡尔曼滤波的预测阶段\hat{x}_k^-=A\hat{x}_{k-1}+Bu_k

\hat{x}_k^-:预测的状态,在这个情景下表示为

A:    状态转移矩阵,描述状态如何从上一个时刻 k−1 变化到当前时刻 k。(例如速度的影响)

(可以把状态转移矩阵 A理解为一个“时间推进器”,它决定了当前状态如何变化到下一时刻。

例如:

表示:1. 新位置 = 旧位置 + 速度 × 时间     2. 速度保持不变

B:  控制输入对状态的影响程度(控制矩阵)

u_{k}控制输入(Control Input),表示 外部施加的影响,例如 加速、刹车、方向调整等。如果没有外部输入,B​ u_{k}这部分可以忽略。

以上就是你预测汽车位置的一个过程,这在卡尔曼滤波中被定义为:预测阶段(Prediction Step),但是现实世界并不是完美的,测量数据会受到噪声影响,所以就还有接下来的过程,被称作修正阶段(Correction Step)

如果你用测距仪器(有误差)发现汽车的位置是 6.5 米,而预测是 7 米,你会怎么办?

👉 你不会完全相信预测值(速度或者位置是有一定偏差的  不是确定的5米初始位置和确定的2米/s的速度),也不会完全相信测量值(因为测量值也有误差),而是取一个折中值!取折中值的方式就是其实就是取一个权重

这个过程称为修正(Correction)

$\hat{x}_k = K_k \cdot z_k + (1 - K_k) \cdot \hat{x}_k^-$

也可以写成:

\hat{x}_k=\hat{x}_k^-+K_k\left(z_k-\hat{x}_k^-\right)

z_{k}:测量值(用测量仪测的距离是6.5 米)

\hat{x}_{k}^{-}:预测值(你自己算出来是7米)

K_{k}:卡尔曼增益,决定如何在预测和测量之间取折中。其实就相当于一个权重:如果测量值很可靠(传感器误差很小),那么 K_{k} 取较大值,我们更相信测量值。如果测量值噪声较大,那么 K_{k}取较小值,我们更依赖预测值。

比如我们让K_{k}=0.75(假设我们认为传感器测量较准确,但也不是说非常非常非常准)

按照公式:汽车真实的位置\hat{x}_k​=0.75⋅6.5+0.25⋅7=6.625 米

上面就是最简单的卡尔曼滤波的过程。

我们刚刚讲的例子里,测量值z_{k} 和状态变量 \hat{x}_{k}^{-}​ 都是 位置,所以直接做加权平均即可。但如果测量的不是位置,而是速度,我们该怎么办?

这时候,我们需要引入 观测矩阵 H

\hat{x}_k=\hat{x}_k^-+K_k\left(z_k-H\hat{x}_k^-\right)

在某些情况中,我们的状态变量不仅仅是位置,还可能包括速度、加速度等多个变量。例如:

但我们的测量设备可能只能测量其中一部分信息,测量值只有速度,我们不能直接做加权平均,而是要从状态变量中提取出速度信息。那么H矩阵在这时候就定为:

那么

(由于测量值仅包含速度,而状态变量同时包含位置和速度,因此我们通过矩阵 HHH 提取状态变量中对应的速度信息,以确保修正过程仅影响速度,而不会改变位置。)

这样,我们就能正确计算修正值:

这就是矩阵 H的作用只让测量到的部分进行修正,不会影响其他状态变量。

以上就是简单的卡尔曼滤波理解了,简单来说,就是先根据上一时刻状态进行预测,然后结合测量值进行修正,不断优化估计结果。

但是理解了以上的过程,也只是刚刚入门卡尔曼滤波的流程,真正的理解卡尔曼滤波,还需要掌握以下几个关键点:

  • B 矩阵是什么?
  • u_{k}​ 代表什么?
  • 卡尔曼增益 K_{k}​ 的计算过程

4.B 矩阵与u_{k}​是什么?

B 描述控制输入u_{k} 如何影响状态,不同的系统有不同的 B 形式。

还是刚刚那个汽车直线运动的例子,在这个例子中,状态变量为

没有外部控制输入的情况下,状态转移方程为:\hat{x}_k^-=Ax_{k-1}

其中:A= \begin{bmatrix} 1 & t \\ 0 & 1 \end{bmatrix}

也就是说:\hat{x}_k^-= \begin{bmatrix} 1 & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ v_{k-1} \end{bmatrix}

表示:

  • 新位置 = 旧位置 + 速度 × 时间(x=x0+v0t)。
  • 速度保持不变(如果没有加速度作用)。

如果汽车受到了加速度 a的作用,那么:

物理规律:

  • 位置变化:x=x_{0}+v_{0}t+\frac{1}{2}at^{2}
  • 速度变化:v=v_0+at

那么:

B= \begin{bmatrix} \frac{1}{2}t^2 \\ t \end{bmatrix},\quad u_k=a

所以控制输入对状态变量的影响:

Bu_k= \begin{bmatrix} \frac{1}{2}t^2 \\ t \end{bmatrix}a

最终的完整状态预测公式

\hat{x}_k^-= \begin{bmatrix} 1 & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ v_{k-1} \end{bmatrix}+ \begin{bmatrix} \frac{1}{2}t^2 \\ t \end{bmatrix}a

这表示:

  • 如果没有外部控制,那么状态仅由 AA 矩阵决定(惯性运动)。
  • 如果有外部控制,那么加速度会影响位置和速度,并通过 B 矩阵建模。

状态预测 = 惯性运动(Ax_{k-1}​) + 控制输入(Bu_{k}​)
如果没有外部控制,u_{k}=0,状态完全由 A 预测。
如果有加速度 a,那么 Bu_{k}让加速度影响位置和速度,状态预测更加精准!

5.卡尔曼增益 K_{k}​ 的计算过程

在卡尔曼滤波的修正阶段,我们希望在预测值测量值之间取一个最佳的折中。

  • 如果测量值很可靠(误差很小),那么我们更应该信任测量值。
  • 如果测量值误差较大,那么我们应该更依赖预测值。

计算 K_{k}之前,先理解“误差”

在卡尔曼滤波中,我们不仅要估计状态(如位置),还要估计这个状态的误差大小

我们用误差协方差矩阵p_{k}来衡量估计的可信度:

  • 如果 p_{k}很大,说明我们的预测值不太可信,误差较大。
  • 如果 p_{k}很小,说明我们的预测值很可靠,误差较小。

此外,测量值z_{k}也有误差,我们用测量噪声协方差 R来衡量测量值的可信度:

  • 如果 R 很小,说明测量值很准确。
  • 如果 R 很大,说明测量值噪声较大,我们应该更依赖预测值。

为了让估计值更准确,我们希望:

  • 如果 预测值不确定性大(p_{k}很大),那么 K_{k}​ 变大,更多依赖测量值 z_{k}
  • 如果 测量值不确定性大(R 很大),那么K_{k} 变小,更多依赖预测值 \hat{x}_k^{-}​。

这个权重的计算公式如下:

K_k=P_k^-H^T(HP_k^-H^T+R)^{-1}

看到这个公式,感觉已经不想学了是吧.....(我刚学到的时候也是:这什么xx东西!)

先不要被公式吓到,我们分步拆解它的意义。(当你有耐心看到这里的时候,你已经无敌了)

首先,我们把这个公式里所有的符号代表的意思整理一下:

  • K_{k}:这个叫卡尔曼增益,它是我们在进行估计修正(也就是预测修正过程)时用的权重值。
    简单来说,就是用来决定我们到底更相信预测值,还是更相信测量值的。

  • p_{k}:这个是预测状态的误差协方差矩阵,反映了预测结果(刚刚我们通过起始位置和速度预测出的小车位置)的不确定性。
    简单理解:

    • 如果预测越不确定(误差越大),则这个矩阵越“大”。
    • 如果预测越准确(误差越小),则这个矩阵越“小”。
  • H:这个叫做测量矩阵,用来把预测状态(比如位置、速度这些东西)变换成测量空间中的值。
    通常 H 会告诉我们,“实际测量到的数据”和“预测的状态”之间是怎样一种关系。

  • R:这个是测量噪声协方差矩阵,表示我们测量值中误差(用测距仪器得到的汽车位置)的不确定性。

    • 如果测量值越准确(误差越小),则 R 越“小”。
    • 如果测量值越不准(误差越大),则 R 越“大”。
  • 上标T(H^{T}):代表矩阵转置,简单来说,就是把原来矩阵的行和列交换位置

  • 上标-1:代表矩阵求逆,我们把它看作类似于除法运算的概念,理解为它能“消除”矩阵的作用。

好了 接下来我们解释公式中的:

       我们有一个预测的结果(例如:你猜测自己走路去了某个位置,但你不确定你是否猜准了),我们要知道这个预测有多大的误差这个误差到底有多大呢?我们把预测的误差表示为​P_k^{-}。但是,预测误差通常是表示状态的(比如:位置、速度),而我们测量到的值不一定是位置和速度本身,比如可能只是距离或某个间接的测量量。

       此时我们需要一个东西,把预测误差从状态空间(例如位置)“映射”或“换算”到 测量空间(你实际测量到的距离)里去。

这个“换算工具”,就是我们说的 H 矩阵。用更简单的话理解:

  • P_k^{-}​是告诉你:“我位置可能不准了”
  • 乘以 H,变成了 HP_{k}^{-}H^{T},意思就变成了:“假如位置不准了,那么我这个测量值(比如距离)会不准到什么程度?”

这一步本质上在衡量:“预测状态的不确定性”会导致测量空间里的误差到底有多大。

我们测量得到的数据本身也有误差,叫 R。测量本身也会带来不确定性(仪器不准、噪声干扰等)

所以,我们把预测带来的测量空间误差 HP_{k}^{-}H^{T} 和测量本身的误差相加

HP_k^-H^T+R

这个式子告诉你:“如果我同时考虑预测和测量的不确定性,整体误差到底有多大?”

好了,现在我们知道了两个误差:

  • 预测的不确定性(在测量空间):P_k^{-}H^T
  • 总的误差(预测不确定性+测量误差):(HP_{k}^{-}H^{T}+R)

接下来,我们就想知道:

在总的误差里面,预测误差到底占了多大的比重?

用数学表达就是用 P_k^{-}H^T除以这个总误差 (HP_{k}^{-}H^{T}+R),得到比例,也就是卡尔曼增益:

K_k=P_k^-H^T(HP_k^-H^T+R)^{-1}

那么现在就是如何计算P_k^{-}和R了

我们已经知道了:

  • P_k^{-}表示的是预测状态的误差协方差矩阵(预测误差)。
  • R表示的是测量误差协方差矩阵(测量误差)。

接下来我们一个一个详细看:

(一) 如何计算 P_k^{-}

它的计算公式如下:P_k^-=F_kP_{k-1}F_k^T+Q_k

别慌,我们再慢慢解释公式中的每个字母:

  • P_k^{-}:当前时刻(k 时刻)预测的误差协方差矩阵
  • F_{k}​:状态转移矩阵(State Transition Matrix),简单理解就是告诉你:“状态是怎么从上一步变化到这一步的?”(类比于最上面公式的A)
    • 比如汽车从上一秒的位置到这一秒的位置,会根据速度发生变化,F_{k}就是描述这种变化关系的矩阵。
  • P_{k-1}:上一时刻(k−1时刻)的误差协方差矩阵(上一步你已经算出来了)。
  • Q_{k}​:过程噪声协方差矩阵,。表示的是过程噪声 w_{k}的方差:

其中:

  • w_{k}​ 是过程噪声向量(代表运动模型的不确定性)
  • E[⋅]代表数学期望
  • Q_{k}​ 反映了不同状态变量(如位置、速度等)之间的噪声关系

这儿就不细讲了,还是需要用到平差里的知识......    如果感兴趣,后面单独出一章讲吧

(二) 如何计算R?

R 是测量噪声协方差矩阵,表示测量误差大小。你的测量设备(例如GPS、雷达、传感器)本身存在的误差程度。R一般不是计算出来的,而是提前设定的

因为我们通常事先知道自己用的测量工具大概的误差是多少

  • 比如你买了一个温度计,厂家就告诉你它的误差大约是 ±0.5℃。
  • 再比如你使用GPS,GPS厂家或设备说明书可能告诉你,位置测量精度一般在 ±3米 左右。

📌 实际使用中:

  • R一般是由设备生产商或者通过实验标定的。
  • 如果是多个测量数据组成的测量空间(比如测了距离、速度两个量),那么 RRR 就是个矩阵,每个对角线元素表示各个测量量的不确定性。

这里会有人无法理解几个问题,我这边总结一下,看看有没有你的疑问

1.为什么分子是P_k^{-}H^T而不是P_k^{-}啊?

答:P_k^{-}是你预测的误差,你的误差在于状态空间维度,还是拿最初的汽车运动举例子,你预测的位置或者速度可能存在误差,但我们的测量数据不一定直接测的是位置或速度,可能测的是距离、角度等其他量(测量空间),你需要通过变化矩阵把误差转换到测量空间维度。

 2.为什么一会儿是P_k^{-},一会儿是p_{k}啊?

答:

  • P_k^{-}预测的误差协方差矩阵(预测不确定性)
  • p_{k}​:更新后的误差协方差矩阵(经过测量值校正后得到的最终不确定性)

直观地用一个生活化例子说明:

比如你早上出门前先预测今天的气温(预测阶段),你猜大概25℃,但是你也知道可能预测有2℃左右的误差:

  • 此时你对温度的不确定性(预测误差)是:25℃ ± 2℃。(这个就是P_k^{-}

然后你看了一眼手机的实时温度测量值(测量阶段),它显示现在是24℃,你知道手机的测量误差可能是±1℃:

  • 这时候你要修正自己的预测,你一定会根据“自己预测误差(2℃)”和“手机测量误差(1℃)”两个值去综合考虑。

你用的预测误差(2℃)就是 P_k^{-}

  • 因为此时你还没真正确定下来最终值(还没更新)。
  • 当你综合手机测量值后,修正成更准确的预测值(比如修正成24.5℃)后,你才得到真正更新后的误差(比如 ±0.8℃),这个更新后的误差才是 p_{k}

所以,计算修正(卡尔曼增益)过程中自然只能用预测误差 P_k^{-},因为此时还没有最终更新值 p_{k}

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值