详解卡尔曼滤波(Kalman Filter)原理

前言

看过很多关于卡尔曼滤波的资料,发现很多资料写的都很晦涩,初学者很难看懂。在网上找了很多资料之后,发现了这篇博文讲的非常清晰易懂,特此翻译记录,以备后用。为保证翻译的原滋原味,以下均用第一人称表述。

背景

我不得不说一说卡尔曼滤波,因为它能做到的事情简直令人惊叹。

很可惜的是,很少有软件工程师和科学家对此有深入了解。这让我感到很沮丧,因为卡尔曼滤波是如此通用且强大的工具,它能在不确定情况下组合信息。有时,它提取准确信息的能力似乎几乎是不可思议的。如果听起来我讲的太多了,那么请看一下之前发布的视频,其中演示了一个利用卡尔曼滤波观察自由浮动物体的速度来确定它的方向。真棒!

卡尔曼滤波是什么?

你可以在任何含有不确定信息的动态系统中的使用卡尔曼滤波,对系统的下一步动作做出有根据的猜测。即使伴随着各种干扰,卡尔曼滤波总是能指出真实世界发生的情况。它可以利用怪异现象之间的关联,你可能不会想到利用这些关联!

卡尔曼滤波对于持续变化的系统是理想的选择。由于卡尔曼滤波除了记忆前一个状态而不需要保留其他的历史记忆信息,因此卡尔曼滤波具有轻量化的特点,运行速度非常快,非常适合处理实时的问题和嵌入式系统。

你在Google上找到的大部分关于卡尔曼滤波的数学描述是晦涩难懂的。那是非常糟糕的状况!因为卡尔曼滤波能被简单和容易的方式所理解的。因此,本文是一个非常不错的文章主题,本文将尝试用许多清晰、美观的图片来阐明它。 本文的前提很简单,你仅仅需要对概率和矩阵有基本的了解。

本文将从一个简单的例子开始,说明卡尔曼滤波可以解决的问题。但如果你想直接接触精美的图片和数学,请随时跳转。

我们能用卡尔曼滤波做什么?

举一个简单的小例子:你已经做了一个能在丛林中游走的小机器人,为确保其能导航,机器人需要知道它所在的位置。


将机器人的运动状态表示为
\vec{x_k}
,其仅仅包含了位置和速度:
\vec{x_k}=(\vec{p},\vec{v})
请注意,状态只是关于系统底层配置的数字列表,它可以是任何东西。在我们的例子中,它是位置和速度,但它可以是油箱中液体量的数据、汽车引擎的温度、用户手指在触控板上的位置或者任何你需要跟踪的东西。

我们的机器人也有GPS传感器,精确大约10米,但它需要更精确地知道自己的位置。在树林中有很多沟壑和悬崖,如果机器人的误差超过几英尺,它可能会从悬崖上掉下去。所以仅依赖GPS进行定位是远远不够的。



我们可能还知道机器人是如何移动的:机器人知道发送给车轮马达的指令,如果它朝一个方向前进,没有任何干扰,下一刻它可能会继续朝同一方向前进。当然,它对自己的运动并不完全了解:它可能会受到风的冲击,车轮可能会打滑,或者在崎岖不平的地形上滚动;所以轮子转动的数量可能不能准确地代表机器人实际行走了多远,这个预测也不会完全准确。

GPS传感器告诉我们一些关于状态的信息,但只是间接的,带有一些不确定性而且并不精准。我们的预测告诉了机器人是如何移动的,但只是间接的,并且也是不确定和不精准的。

但是,如果我们利用所有可用的信息,我们能得到一个比这两个估计本身更好的答案吗?当然,答案是肯定的,这就是卡尔曼滤波器的作用。

如何从卡尔曼滤波的角度看待问题?

让我们来看看我们想要诠释的一个场景。我们继续上一个例子,机器人仅仅包含一个位置和速度的简单状态。

\vec{x}=\begin{bmatrix} p \\ v \end{bmatrix}

我们不知道实际的位置和速度是什么;有一系列可能的位置和速度组合可能是正确的,但其中一些状态比其他的状态更可能:


卡尔曼滤波器假设两个变量(例子中为位置和速度)都是随机变量且服从高斯分布的。随机变量的均值为
\mu
,它表示随机分布的中心位置,即机器人最可能的状态,不确定性用方差
\sigma^2
表示:

在上图中,位置和速度是不相关的,这意味着一个变量的状态不能推测出其他变量的状态。

更有趣的是下面的例子:位置和速度是呈相关性的。观察特定位置的可能性取决于你的速度:


这种情况可能会出现。例如:根据一个旧的位置估计一个新的位置,如果速度很快,可能会走得更远,所以位置会更远。如果走得很慢,那么就不会走的很远。

这种关系非常重要,因为它给我们提供了更多的信息:一个测量值告诉我们其他测量值可能是什么。我们要尽可能多地从不确定的目标中压缩卡尔曼滤波器的信息!

这种相关性被称为协方差矩阵。简而言之,矩阵的每个元素

\sum\nolimits_{ij}
是第
i
个状态变量和
j
个状态变量之间的相关程度。(由于协方差矩阵是对称的,也就是交换
i
j
不会影响最终的结果)。协方差矩阵往往用“
\sum
”来表示,其中的元素则表示为“
\sum\nolimits_{ij}
”。

矩阵化描述问题

我们基于高斯分布来建立状态变量,所以在时间

k
需要两条信息:将最佳估计称为
\hat{\mathbf{x}}_{\mathbf{k}}
(即均值
\mu
)和它的协方差矩阵
\rm{P_k}

\hat{\mathbf{x}}_{\mathbf{k}} = \begin{bmatrix} \text{position} \\ \text{velocity} \end{bmatrix} \\ \rm{P_k} = \begin{bmatrix} \sum\nolimits_{pp} & \sum\nolimits_{pv} \\ \sum\nolimits_{vp} & \sum\nolimits_{vv} \end{bmatrix} \tag{1}

(在这里本文只使用了位置和速度,但是该状态可以包含任意数量的变量,并表示任何需要表示的东西,这对于处理其他问题是非常有益的)。

接下来,我们需要某种方式来知道目前状态(时刻

k-1
)并预测下一个时刻
k
的状态。记住,我们不知道哪个状态是“真实的”状态,但我们的预测函数并不关心。它适用于所有的情况,并给出了一个新的分布:


用矩阵
\mathbf{F_k}
表示这个预测步骤:

它将我们原始估计中的每个点都移动到了一个新的预测位置,如果原始估计是正确的话,这个新的预测位置就是系统下一步会移动到的位置。那我们又如何用矩阵来预测下一个时刻的位置和速度呢?下面用一个基本的运动学公式来表示:
\begin{aligned} \hat{\mathbf{x}}_{k} &=\left[\begin{array}{cc} 1 & \Delta t \\ 0 & 1 \end{array}\right] \hat{\mathbf{x}}_{k-1} \\ &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1} \end{aligned}

\begin{aligned} \operatorname{Cov}(x) &=\Sigma \\ \operatorname{Cov}(\mathbf{A} x) &=\mathbf{A} \Sigma \mathbf{A}^{T} \end{aligned}

\begin{array}{l} \hat{\mathbf{x}}_{k}=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1} \\ \mathbf{P}_{k}=\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_{k}^{T} \end{array}

外部控制变量

\begin{equation} \begin{array}{l} p_{k}=p_{k-1}+\Delta t v_{k-1}+\frac{1}{2} a \Delta t^{2} \\ v_{k}=\quad v_{k-1}+a \Delta t \end{array} \end{equation}

\begin{equation} \begin{aligned} \hat{\mathbf{x}}_{k} &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\left[\begin{array}{c} \frac{\Delta t^{2}}{2} \\ \Delta t \end{array}\right] a \\ &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\mathbf{B}_{k} \overrightarrow{\mathbf{u}_{k}} \end{aligned} \end{equation}

外部干扰

\begin{aligned} \hat{\mathbf{x}}_{k} &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\mathbf{B}_{k} \overrightarrow{\mathbf{u}_{k}} \\ \mathbf{P}_{k} &=\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_{k}^{T}+\mathbf{Q}_{k} \end{aligned}

利用外部观测值修正估计量

\begin{array}{l} \vec{\mu}_{\text {expected }}=\mathbf{H}_{k} \hat{\mathbf{x}}_{k} \\ \mathbf{\Sigma}_{\text {expected }}=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} \end{array}

联合高斯分布

\mathcal{N}(x, \mu, \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}}

\mathcal{N}\left(x, \mu_{0}, \sigma_{0}\right) \cdot \mathcal{N}\left(x, \mu_{1}, \sigma_{1}\right) \stackrel{?}{=} \mathcal{N}\left(x, \mu^{\prime}, \sigma^{\prime}\right)

\begin{equation} \begin{aligned} \mu^{\prime} &=\mu_{0}+\frac{\sigma_{0}^{2}\left(\mu_{1}-\mu_{0}\right)}{\sigma_{0}^{2}+\sigma_{1}^{2}} \\ \sigma^{\prime 2} &=\sigma_{0}^{2}-\frac{\sigma_{0}^{4}}{\sigma_{0}^{2}+\sigma_{1}^{2}} \end{aligned} \end{equation}

\mathbf{k}=\frac{\sigma_{0}^{2}}{\sigma_{0}^{2}+\sigma_{1}^{2}}

\begin{aligned} \mu^{\prime} &=\mu_{0}+\mathbf{k}\left(\mu_{1}-\mu_{0}\right) \\ \sigma^{\prime 2} &=\sigma_{0}^{2}-\mathbf{k} \sigma_{0}^{2} \end{aligned}

\mathbf{K}=\Sigma_{0}\left(\Sigma_{0}+\Sigma_{1}\right)^{-1}

\begin{array}{l} \vec{\mu}^{\prime}=\overrightarrow{\mu_{0}}+\mathbf{K}\left(\overrightarrow{\mu_{1}}-\overrightarrow{\mu_{0}}\right) \\ \Sigma^{\prime}=\Sigma_{0}-\mathbf{K} \Sigma_{0} \end{array}

整合上述公式

\begin{aligned} \mathbf{H}_{k} \hat{\mathbf{x}}_{k}^{\prime} &=\mathbf{H}_{k} \hat{\mathbf{x}}_{k} &+\mathbf{K}\left(\overrightarrow{\mathrm{z}_{k}}-\mathbf{H}_{k} \hat{\mathbf{x}}_{k}\right) \\ \mathbf{H}_{k} \mathbf{P}_{k}^{\prime} \mathbf{H}_{k}^{T} &=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} &-\mathbf{K} \mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} \end{aligned}

\mathbf{K}=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}\left(\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}+\mathbf{R}_{k}\right)^{-1}

\begin{aligned} \hat{\mathbf{x}}_{k}^{\prime} &=\hat{\mathbf{x}}_{k}+\mathbf{K}^{\prime}\left(\overrightarrow{\mathrm{z}_{k}}-\mathbf{H}_{k} \hat{\mathbf{x}}_{k}\right) \\ \mathbf{P}_{k}^{\prime} &=\mathbf{P}_{k^{-}} \mathbf{K}^{\prime} \mathbf{H}_{k} \mathbf{P}_{k} \end{aligned}

\mathbf{K}^{\prime}=\mathbf{P}_{k} \mathbf{H}_{k}^{T}\left(\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}+\mathbf{R}_{k}\right)^{-1}

总结

对于上述所有的数学公式,你仅仅需要实现公式(7)、(18)和(19)。(如果你忘记了上述公式,你也能从公式(4)和(5)重新推导。)

这将允许你精确地建模任何线性系统。对于非线性系统,需要用到扩展卡尔曼滤波,区别在于EKF多了一个把预测和测量部分进行线性化的过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268