首页 > 其他分享 >Kalman滤波器的原理与实现

Kalman滤波器的原理与实现

时间:2024-04-12 09:33:36浏览次数:23  
标签:滤波器 frac Kalman 卡尔曼滤波 矩阵 协方差 bmatrix 原理 hat

Kalman滤波器的原理与实现

卡尔曼滤波器(Kalman Filter)是一个十分强大滤波器,虽然叫做滤波器,卡尔曼滤波器其实可以起到到两个作用,即预测与更新,这与我们在其运行时所关注的环节有关。当我们关注预测状态量这一步时,我们可以通过卡尔曼滤波器获取状态量的超前预测值,预测的值取决于滤波对象的运动建模。而当我们关注更新来获取最优估计状态时,我们关心的是如何通过卡尔曼增益以及测量量估计量来获取当前的最优估计状态,这时卡尔曼滤波就像一个正常的滤波器。本篇是看完Dr_Can博士对于卡尔曼滤波的讲解后的小笔记。
链接在这Dr_Can的卡尔曼滤波器讲解

一些参数明确

在解释卡尔曼滤波之前,需要先明确一些参数,如下

\(x_k\) 为\(k\)时刻的状态量的真实值\(\\\)
\(\hat{x}_k^-\) 为\(k\)时刻的状态量的先验预测值\(\\\)
\(\hat{x}_{k-1}\) 为\(k-1\)时刻的状态量的最优后验估计值\(\\\)
\(z_k\) 为\(k\)时刻的测量量\(\\\)
\(u\) 为外部输入的控制量\(\\\)
\(B\) 为控制量矩阵\(\\\)
\(A\) 为状态转移矩阵\(\\\)
\(P^-\) 为误差协方差矩阵的先验预测值\(\\\)
\(P\) 为误差协方差矩阵\(\\\)
\(H\) 为观测转移矩阵\(\\\)
\(Q\) 为状态噪声协方差矩阵\(\\\)
\(R\) 为测量噪声协方差矩阵\(\\\)
\(K_k\) 为卡尔曼增益\(\\\)

例子引出

给出一个匀速运动模型的例子来引出卡尔曼滤波。这也是一个经典的例子。
image

给出一个做匀速直线运动的小球,其速度为\(V\),其相对于某坐标系的位置为\(x\),根据运动学相关的知识,可以写出小球的运动方程\(x_{t} = x_{t-1} + V_x * t\)。假设小球不仅在\(x\)方向上有运动,在\(y\)方向上也有同样的匀速直线运动,其\(y\)方向的运动方程为\(y_{t} = y_{t-1} + V_y * t\)。即我们现在有了描述小球运动的两个方程,再加上速度的两个方程\(V_{xt} = V_{xt-1}\)以及\(V_{yt} = V_{yt - 1}\)。我们称物体的以上的变量为物体的状态量,也就是我们想要获得一些量。

\[x_{t} = x_{t-1} + V_{xt-1} t \\ y_{t} = y_{t-1} + V_{yt-1} t \\ V_{xt} = V_{xt-1} \\ V_{yt} = V_{yt - 1} \]

不妨写为矩阵相乘的形式

\[\begin{bmatrix} x_t \\ y_t \\ V_{xt} \\ V_{yt} \end{bmatrix} = \begin{bmatrix} 1&0&t&0 \\ 0&1&0&t \\ 0&0&1&0 \\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x_{t-1} \\ y_{t-1} \\ V_{xt-1} \\ V_{yt-1} \end{bmatrix} \]

倘若假设采样时间为1即\(t = 1\),可以写成

\[\begin{bmatrix} x_t \\ y_t \\ V_{xt} \\ V_{yt} \end{bmatrix} = \begin{bmatrix} 1&0&1&0 \\ 0&1&0&1 \\ 0&0&1&0 \\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x_{t-1} \\ y_{t-1} \\ V_{xt-1} \\ V_{yt-1} \end{bmatrix} \]

可以看出,\(t\)时刻物体的状态量可以由\(t-1\)时刻物体的状态量来推算出来。此时我们将上式记为

\[x_{t} = Ax_{t-1} \]

显然有时物体并不会一直线性运动,假设此时物体被外部因素赋予(输入)一个加速度\(a\),则物体此时的运动方程变为

\[x_{t} = x_{t-1} + V_{xt-1} t + \frac{1}{2}at^2\\ V_{xt} = V_{xt-1} + at \]

则矩阵形式的方程变为

\[\begin{bmatrix} x_t \\ y_t \\ V_{xt} \\ V_{yt} \end{bmatrix} = \begin{bmatrix} 1&0&t&0 \\ 0&1&0&t \\ 0&0&1&0 \\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x_{t-1} \\ y_{t-1} \\ V_{xt-1} \\ V_{yt-1} \end{bmatrix} + \begin{bmatrix} 0&\frac{1}{2}t^2 \\ 0&\frac{1}{2}t^2 \\ 0&t\\ 0&t \end{bmatrix} \begin{bmatrix} a_x \\ a_y \end{bmatrix} \]

不妨记为

\[x_{t} = Ax_{t-1} + Bu \]

这样我们就得出了如何使用前一时刻或者说前一次的状态量来获得预测当前的状态量。不难看出,预测的准不准,取决于对观测物体运动建模的准确性。

倘若模型不准确,根据该模型推理出的数据是有噪声干扰和误差的,我们将这个噪声干扰叫做\(w_i\)。并假设噪声的概率分布符合期望为0的正态分布(这是卡尔曼滤波的重要假设之一),即\(P(w_i)\sim N(0,Q)\)。加上这个误差后的公式为

\[x_{t} = Ax_{t-1} + Bu + w_i \]

需要注意的是\(w_i\)也为一个矩阵,同理\(Q\)也为一个协方差矩阵,这是一个多元正态分布。

此时我们再来考虑更多一种情况。倘若我们不仅可以通过模型对状态量进行预测得出当前时刻的状态量,同时还可以通过一些测量仪器来获得物体的当前状态的测量值。

在这个例子中可以认为有一个雷达来检测物体每一时刻的位置信息以及速度信息。这些测量值统称为\(z_k\),为一个矩阵。注意测量量的维度并不要求与状态量相同。考虑到有时测量量与状态量可能需要些许转换,如测量电阻时我们总是使用电压处以电流(\(R = \frac{U}{I}\))的转换,我们将这种转换关系使用一个矩阵\(H\)表示,\(H\)就表示状态量可以通过某个公式或者关系转换到测量量。在上面的例子中,\(H\)为单位矩阵。综上,可以得出以下式子。

\[z_k = H x_k \]

当然,考虑到测量仪器测量时的各种噪声以及误差,我们将其记为\(v_i\),并假设其概率分布也满足正态分布,即\(P(v_i)\sim N(0,R)\)。
最终得出

\[z_k = Hx_k + v_i \]

最后,我们好像得出了观测物体的两个值,一个是通过不太精确的模型得出的预测值,另一个是通过不太准确的仪器测出的当前的测量值。我们所有的信息只有这两个值。那么如何在一些合理的假设下,通过这两个不太准确的值,获得最接近物体真实值的最优解呢?这便是这便是卡尔曼滤波所要做的事情,通过两个不准确值来估计出最接近真实值的最优解。

写在题外:这两个公式实质上的严格数学推导是由现代控制理论里的状态空间表达式的离散形式得出的,想要了解更多的推导请看Dr_Can的卡尔曼滤波器讲解,讲的非常详细易懂!

卡尔曼滤波简单推导

下面对卡尔曼滤波的一些思想和公式进行简单的说明

数据融合

考虑最简单的均值滤波,对于物体的某一属性(如上述的位置\(x\))我们已经有\(k-1\)个已经测量到的值,以及当前第\(k\)次的测量值。为了利用当前这些数据获取接近真实值的值,我们最容易想到的就是均值滤波,也就是从1到\(k\)的测量取均值。

\[\hat{x_k} = \frac{1}{k}\sum_{i = 1}^kx_i \]

不妨将其做以下变换

\[\hat{x_k} = \frac{1}{k}(x_1 + ... + x_{k-1} + x_k) \\ \hat{x_k} = \frac{1}{k}\sum_{i=1}^{k-1}x_i + \frac{1}{k}x_{k}\\ \hat{x_k} = \frac{k-1}{k}\frac{1}{k-1}\sum_{i=1}^{k-1}x_i + \frac{1}{k}x_{k} \\ 记\frac{1}{k-1}\sum_{i=1}^{k-1}x_i = \hat{x_{k-1}} \\ \hat{x_k} = \frac{k-1}{k} \hat{x_{k-1}} + \frac{1}{k}x_k = \hat{x_{k-1}} + \frac{1}{k}(\hat{x_{k-1}} - x_k) \]

最终我们得出了这个式子

\[\hat{x_k} = \hat{x_{k-1}} + \frac{1}{k}(x_k - \hat{x_{k-1}}) \]

不难看出,当前\(k\)时刻的估计值由\(x_{k-1}\)时刻的估计值\(\hat{x_{k-1}}\)以及\(k\)时刻的测量值\(x_k\)来共同决定,而\(\frac{1}{k}\)这个系数决定了这两者的占比。我们不妨令\(\frac{1}{k} = G\),这里姑且称其为卡尔曼增益。且\(\hat{x_{k-1}}\)可以视为基于前\(k-1\)次的数据对第\(k\)次的数据的一个预测或者说估计。不妨即为\(\hat{x_k}^-\)

利用这个思想,对于小球的例子中,\(x_{k}\)时刻的预测值可以由运动方程给出

\[\hat{x_k}^- = A\hat{x_{k-1}} + Bu_{k-1} \]

且\(k\)时刻的测量量满足以下

\[z_k = Hx_k \\ x_k = H^-z_k \]

利用上述思想,得出\(k\)时刻的估计值为

\[\hat{x_k} = \hat{x_k}^- + G(x_k -\hat{x_k}^- ) = \hat{x_k}^- + G( H^-z_k - \hat{x_k}^-) \]

不妨假设\(G = K_kH\),带入得出

\[\hat{x_k} = \hat{x_k}^- + K_k(z_k - H\hat{x_k}^-) \]

这便是卡尔曼滤波的核心公式之一,我们使用这个公式来估计当前状态量的最优值。至于为何为最优,后续会给出简单说明。

协方差矩阵

这部分是概率统计的知识。对于随机变量\(X\),我们可以用期望\(E(x)\)来描述它的平均水平或者一个趋势,同时可以使用方差\(D(x)\)或者\(Var(x)\)来描述其波动情况。同时我们定义这样一个式子

\[Cov(X,Y) = E((X - E(X))(Y - E(Y))) \]

称\(Cov(X,Y)\)为两个随机变量的协方差。不难看出,协方差描述了两个变量之间的相关程度,具体可以看这个通俗理解协方差。当两个变量相互独立时,其协方差为0,说明彼此毫无关系,互不影响。

对于两个随机变量\(X\)和\(Y\),可以给出一个矩阵来描述其各个变量之间的关系

\[P = \begin{bmatrix} \sigma_{xx}&\sigma_{xy} \\ \sigma_{yx}&\sigma_{yy} \end{bmatrix} \]

这样使用协方差矩阵就可以记录出2个以及多个随机变量之间的关系。

对于\(e = [e_1\quad e_2]\)假设随机变量\(e_1,e_2\)符合正态分布\((0,\sigma)\)(基本上卡尔曼滤波就是建立在所有误差都是正态分布这个假设上的),其各个元素协方差矩阵可以这样求

\[E[e *e^T] \]

展开即为

\[\begin{bmatrix} E(e_1e_1)&E(e_1e_2) \\ E(e_2e_1)&E(e_2e_2) \end{bmatrix} \]

已知方差的计算式有\(D(x) = E(x^2) - E^2(x)\),且我们已知符合期望为0的正态分布,则\(E(x) = 0\),故有\(D(x) = E(x^2)\),同理对于协方差的计算式\(Cov(X,Y) = E(XY) - E(X)E(Y)\),应用如上条件变为\(Cov(X,Y) = E(XY)\),这两个公式应用于上式有

\[\begin{bmatrix} E(e_1^2)&E(e_1e_2) \\ E(e_2e_1)&E(e_2^2) \end{bmatrix} = \begin{bmatrix} \sigma_{e_1e_1}&\sigma_{e_1e_2} \\ \sigma_{e_2e_1}&\sigma_{e_2e_2} \end{bmatrix} \]

这个公式在推导卡尔曼增益的计算式时会用到。

卡尔曼公式简单推导

先给出卡尔曼滤波的五个核心公式,然后对其做一些说明

\[\hat{x_k}^- = A\hat{x_{k-1}} + Bu_{k-1}\qquad [1] \\ P_k^- = AP_{k-1}A^T + Q \qquad[2]\\ K_k = P_k^-H^T/(HP^-_kH^T + R) \qquad [3]\\ \hat{x_k} = \hat{x_k}^- + K_k(z_k - H\hat{x_k}^-) \qquad [4] \\ P_k = P_k^- - K_k HP_k^-或者(I - K_kH)P_k^- \qquad [5] \]

[1]式

\[\hat{x_k}^- = A\hat{x_{k-1}} + Bu_{k-1} \]

对于1式,我们将上一部分推断的公式写到这里

\[x_{k} = Ax_{k-1} + Bu_{k-1} + w_i \]

估计时,误差已经融入估计的计算,也就是误差与噪声是包含在模型本身中的,无法像上面一样直接提出来一个\(w_i\),因此我们将这个带有误差与噪声的预测值记为\(\hat{x_k}^-\),代表着状态量的先验预测值。这样我们就得出来第一个公式

\[\hat{x_k} = A\hat{x_{k-1}} + Bu_{k-1} \]

[4]式

\[\hat{x_k} = \hat{x_k}^- + K_k(z_k - H\hat{x_k}^-) \]

对于4式,我们可以看到出现了当前的最优估计值\(\hat{x_{k}}\)以及先验预测值\(\hat{x_{k}}^-\)和测量量\(z_k\)。还有一个新的量\(K_k\),我们称之为卡尔曼增益。卡尔曼增益是卡尔曼滤波中最为灵魂最为重要的一个量。

不难看出,当\(K_k = 0\)时(实际上是一个全0矩阵),\(x\)在\(k\)时刻的最优估计值\(\hat{x_k}\)就为\(k\)时刻的先验预测值\(\hat{x_{k}}^-\),当\(K_k = H\)时,\(\hat{x_k}\)就为测量值\(H^-z_k\)(这是由测量量\(z_k = Hx_k\)两边同乘\(H^-\)得\(x_k = H^-z _k\))。因此\(K_k\)这个参数决定了测量量与预测量对于最优估计值的贡献程度。

利用上面中数据融合的思想可以知道,为了求出当前状态下最优的估计值,我们唯一不知道的量就是\(K_k\)。而衡量最优的条件是什么呢?显然在概率统计中,方差越小,数据围绕真实值越集中。因此我们此时的目标就是寻找一个\(K_k\)的计算式,这样的\(K_k\)使得\( x_k -\hat{x_k}\)的方差(多元数据使用协方差矩阵的迹)最小。

[3]式

\[K_k = P_k^-H^T/(HP^-_kH^T + R) \]

再讲这个式子之前,我们不妨给出一个真实状态量与后验最优估计量之间的误差的量化。

\[e_k = x_k - \hat{x_k} \]

同理,假设\(e_k\)的误差也符合正态分布\(P(e_k)\sim{N(0,P)}\)。与噪声的方差一样,\(P\)也是一个协方差矩阵,反映了\(e_k\)的各个状态之间的关系以及误差。以匀速运动的物体为例,我们仅关注其位置为状态量。

\[P = \begin{bmatrix} \sigma_{xx} & \sigma_{xy} \\ \sigma_{xy} & \sigma_{yy} \end{bmatrix} \]

因此当前的目的就是寻求一个\(K_k\),使得\(e_k\)的误差最小,也就是协方差矩阵的迹最小(迹上的元素描述的是各个变量相对于其真实值的误差,而其他元素描述的是各个变量之间的相关性)。我们依旧认为\(e_k\)符合正态分布\((0,P)\),由上述协方差矩阵的计算式可知

\[P = E(e_ke_k^T)\\ \]

带入\(e_k\)

\[P = E((x_k - \hat{x_k})(x_k - \hat{x_k})^T)\\ \]

又已知\(\hat{x_k}\)的表达式为

\[\hat{x_k} = \hat{x_k}^- + K_k(z_k - H\hat{x_k}^-) \]

将其带入计算P的式子,这样\(K_k\)就引入进来了。接着只需要应用一些线性代数的技巧化简即可。最后对得到的式子求导取极值可以得到\(K_k\)的计算式

\[K_k = P_k^-H^T/(HP^-_kH^T + R) \]

其中

\[P_k^- = E(e_k^-{e_k^-}^T) \]

[2]式

对于[2]式,是由\(k-1\)次的误差协方差矩阵推算出\(k\)次的先验误差协方差矩阵的过程。使用了计算公式\(D(AX) = AD(X)A^T\),外加上噪声矩阵Q的测量噪声,可以得出[2]式

\[P_k^- = AP_{k-1}A^T + Q \]

这是很不严谨的推理,算不上推导,推导请看Dr_Can的卡尔曼滤波讲解

[5]式

最后,我们要更新误差协方差矩阵,得出根据\(\hat{x_k}\)计算出的最新的误差协方差矩阵。直接使用公式

\[P = E((x_k - \hat{x_k})(x_k - \hat{x_k})^T) \]

带入求出表达式即可。最终得出

\[P_k = P_k^- - K_k HP_k^-或者(I - K_kH)P_k^- \]

综上,[1][2]式用来根据模型进行当前状态的预测,[3][4][5]式用来对当前状态进行最优估计,这两部分不断循环执行,一个卡尔曼滤波器就开始工作了。

相对于简单的均值滤波,我们可以看到卡尔曼滤波并不太依赖于之前的一些数据与状态,本次的更新仅取决于上一次的数据,而且可以取得不错的效果。而均值的话非常依赖之前的样本数量,样本数量少的话会导致本次的估计不太准确

至此,卡尔曼滤波的黄金五式就解释完啦,知识水平有限,讲的很粗糙,有错误的话记得提醒我。

简单扩展Kalman滤波器

显然,kalman滤波器的预测的第一个式子

\[\hat{x_k}^- = A\hat{x_{k-1}} + Bu_{k-1} \]

注定了卡尔曼滤波只能使用与线性系统,且系统的各种误差与噪声均符合期望为0的正态分布。那么,对于非线性系统,怎么才可以使用卡尔曼滤波呢?答案是线性化。

对于一个使用非线性模型描述的系统(即包含\(sinx,cosx,e^x\)),我们可以通过泰勒展开的方式将其线性化。通过非线性函数在上一次最优估计\(\hat{x_{k-1}}\)处的一阶泰勒展开,将其化为多项式的形式。对于一些矩阵如A,B,H等,可以利用矩阵求导的知识将其化为对应的雅可比矩阵来求解。

也就是说扩展卡尔曼滤波与卡尔曼滤波的不同之处仅在于预测这一步中的模型是非线性系统线性化后的模型,其他的步骤与普通而卡尔曼滤波一模一样。

标签:滤波器,frac,Kalman,卡尔曼滤波,矩阵,协方差,bmatrix,原理,hat
From: https://www.cnblogs.com/CrescentWind/p/18130495

相关文章

  • CAS 操作原理
    CAS(CompareandSwap)是一种原子操作,用于实现乐观锁的一种方式。CAS操作包括三个参数:内存地址(或变量),期望值和新值。CAS操作会先比较内存地址处的值和期望值是否相等,如果相等,则将该内存地址的值更新为新值;如果不相等,则不做任何操作。CAS操作是一种无锁算法,可以保证操作的原子性。......
  • Kafka做消息队列的原理
    Kafka作为消息队列的实现原理主要基于其分布式架构和日志式存储机制。以下是Kafka作为消息队列工作的核心原理:1.分布式架构与分区:Kafka采用分布式架构,将数据分布存储在多个节点(称为Broker)上,以实现数据的水平扩展和并行处理。Kafka中的消息流被组织成主题(Topic),每个主题可以包......
  • 深入理解MD5算法:原理、应用与安全
    第一章:引言导言在当今数字化时代,数据安全和完整性变得至关重要。消息摘要算法是一种用于验证数据完整性和安全性的重要工具。在众多消息摘要算法中,MD5(MessageDigestAlgorithm5)因其快速、广泛应用和相对较高的安全性而备受关注。本书将深入探讨MD5算法的原理、应用和安全性,帮......
  • 编译原理(清华大学版)第二章
    第二章文法和语言符号和符号串字母表是元素的非空有穷集合字母表中的元素称为符号字母表中的符号可以组成的任何又穷序列称为符号串符号串运算:1.符号串的头尾,固有头和固有尾​ \(z=xy,只对头感兴趣则可以写为z=x...\)2.符号串的链接​ $符号串x、y,连接之后为xy;\spac......
  • 编译原理(清华大学版)第一章
    第一章概论基本概念 词法分析经过词法分析器识别出Token,把字符串转化为一个个Token。Token包括:关键字、标识符、界符等语法分析把Token串转换成体现语法规则的抽象树(AST)语义分析审查源程序有无语义错误找到变量的作用域识别执行的运算方式进行类型......
  • ZOMI的AI编译原理4
    为什么需要AI编译器面临的问题挑战类别描述算子挑战越来越多新算子被提出,导致算子库的开发、维护、优化和测试工作量指数上升。1.硬件不仅需要实现新算子,还需要结合硬件进行特性优化和测试,以充分发挥硬件性能。例如,对于Convolution运算,需要将其转换为GEMM矩阵乘......
  • redis自学(32)哨兵的作用和工作原理
    哨兵的作用Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:    服务状态监控Sentinel基于心跳机制监测服务状态,每隔1秒想集群的每个实例发送ping命令。l 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下......
  • Redis Pipelining 底层原理分析及实践
    作者:vivo互联网服务器团队-WangFeiRedis是一种基于客户端-服务端模型以及请求/响应的TCP服务。在遇到批处理命令执行时,Redis提供了Pipelining(管道)来提升批处理性能。本文结合实践分析了SpringBoot框架下Redis的Lettuce客户端和Redisson客户端对Pipeline特性的支持原理,并针......
  • Vue相关原理
    1、VUE2和VUE3对比响应式区别vue2的响应式原理是利⽤es5的⼀个API,Object.defineProperty()对数据进⾏劫持结合发布订阅模式的⽅式来实现的。vue3中使⽤了es6的proxyAPI对数据代理,通过reactive()函数给每⼀个对象都包⼀层Proxy,通过Proxy监听属性的变化,从⽽实现......
  • ZOMI的AI编译原理3
    LLVM设计架构LLVMIR与GCCIR对比特性LLVMIRGCCIR(GIMPLE)独立性和库化架构高度模块化,前端和后端分离,易于添加新语言和目标平台传统GCC架构,前端和后端耦合较紧密表达形式人类可读的汇编形式、C++对象形式、序列化后的bitcode形式GIMPLE表示形式,三地址代码,SS......