Kalman滤波一

本笔记将记录大名鼎鼎的 Kalman Filter.
卡尔曼滤波器设计的目的:我们希望尽量的从具有不确定性的信息中获取尽可能多的有用信息

首先需要是明确的是,对于滤波器这个我们如何理解??----真的就是简单的求平均值的吗?
卡尔曼滤波器:是一个最优化的递归数据处理算法,而并不是简单的滤波器,不要给滤波器这个词误导了啊!!

直观理解

  • 卡尔曼滤波出现的原因:现实生活中有太多不确定的因素了,而不确定性主要体现在
    1. 我们无法建立一个完美的数学模型
    2. 传感器的测量结果存在偏差
    3. 现实中存在着一些无法抗拒和测量的扰动

举个例子:假设我们用直尺测量一个物体,每次测量的结果为 Z i Z_i Zi,第 k k k次测量后,计估计值我们记为 X ^ k \hat{X}_k X^k
则我们由平均值可以得到:
X ^ k = 1 k ( Z 1 + Z 2 + . . . + Z k ) = 1 k k − 1 k − 1 ( Z 1 + Z 2 + . . . + Z k − 1 ) + 1 k Z k \begin{aligned} \hat{X}_k &= \frac{1}{k}(Z_1 + Z_2 + ...+ Z_k) \\ &= \frac{1}{k}\frac{k-1}{k-1}(Z_1 + Z_2 + ...+ Z_{k-1}) + \frac{1}{k}Z_k \end{aligned} X^k=k1(Z1+Z2+...+Zk)=k1k1k1(Z1+Z2+...+Zk1)+k1Zk
接着因为我们知道, X ^ k − 1 = 1 k − 1 ( Z 1 + Z 2 + . . . + Z k − 1 ) \hat{X}_{k-1} = \frac{1}{k-1}(Z_1 + Z_2 + ...+ Z_{k-1}) X^k1=k11(Z1+Z2+...+Zk1)
所以,我们得到:
X ^ k = X ^ k − 1 + 1 k ( Z k − X ^ k − 1 ) \hat{X}_k = \hat{X}_{k-1} + \frac{1}{k}(Z_k - \hat{X}_{k-1}) X^k=X^k1+k1(ZkX^k1)

可以看出这个式子同时包含了 X k X_k Xk X k − 1 X_{k-1} Xk1,这也就很好说明了卡尔曼滤波器的递归性质;
在卡尔曼滤波器中,我们将上式的系数 1 k \frac{1}{k} k1记为: K k K_k Kk,即卡尔曼增益
通过这个系数我们可以看出:

  • 若系数 K k → 0 K_k\rightarrow 0 Kk0,则我们的估计值将于我们所测量的结果无关,我们越来越相信我们的计算结果(这可能也就是我们测量了很多次的原因吧!)
  • 若系数 K k → 1 K_k\rightarrow 1 Kk1, 则我们的估计值就是我们所测量的值!

在这里我们首先提一下这个卡尔曼系数的计算公式(详细的推导见后面部分)
K k = e e s t k − 1 e e s t k − 1 + e m e a k K_k = \frac{e_{est_{k-1}}}{e_{est_{k-1}} + e_{mea_k}} Kk=eestk1+emeakeestk1
其中: e e s t k − 1 e_{est_{k-1}} eestk1为估计值与真实值的误差; e m e a k e_{mea_k} emeak为测量值与真实值的误差
(疑问:可是我们的真实值不知道啊啊啊!!)

我们再讲解一下,在解决实际问题的时候应用卡尔曼滤波器的步骤:

  • Step1:计算卡尔曼增益 K k K_k Kk K k = e e s t k − 1 e e s t k − 1 + e m e a k K_k = \frac{e_{est_{k-1}}}{e_{est_{k-1}} + e_{mea_k}} Kk=eestk1+emeakeestk1
  • Step2:计算 X ^ k = X ^ k − 1 + 1 k ( Z k − X ^ k − 1 ) \hat{X}_k = \hat{X}_{k-1} + \frac{1}{k}(Z_k - \hat{X}_{k-1}) X^k=X^k1+k1(ZkX^k1)
  • Step3:更新估计误差 e e s t k = ( 1 − K k ) e e s t k − 1 e_{est_k} = (1 - K_k)e_{est_{k-1}} eestk=(1Kk)eestk1(这个公式我们后面也会详细的推导的)

需要注意一下,我们在这里首先要确定是卡尔曼增益,但是在计算的过程中我们很容易发现,我们还缺一个参数(测量误差哪里来的),特别是第一个的测量误差(因为在后面的可以根据我们所更新的公式来进行推导的),是我们随意估计的吗?(的确是的,因为我们的估计误差后面会不断的跟新,所以第一次可以随意给的,但是好像也不能太随意吧,啊啊我也不太清楚,接着往后学着看吧)

下面这张图是某一次假象的应用卡尔曼滤波算法的测量过程
Kalman滤波一_第1张图片

数学基础

在这一部分我将大致梳理一下,卡尔曼滤波器所涉及到的数学概念

  • 数据融合
    利用多个传感器测量同一个被测物体,然后融合这些测量值和对应的信息,实现比单个的传感器更准确的判断!

    (数据融合是一个大词,让人看了不明觉厉。其实就是利用统计信息,让数据之间相互校准。)

举个例子:假设我们用两台称去称量同一个物体,假设称A测量的结果为 Z 1 = 30 g Z_1 = 30g Z1=30g,方差 σ 1 = 2 g \sigma_1 = 2g σ1=2g;称B的测量结果为 Z 2 = 32 g Z_2 = 32g Z2=32g,方差 σ 2 = 4 g \sigma_2 = 4g σ2=4g,并且假设都满足正态分布,那么问题是我们如何根据这两个数据得出更加准确的结果??
我们假设直接引用我们的卡尔曼滤波的思想?假设我们得到的估计值为 Z ^ = Z 1 + K ( Z 2 − Z 1 ) \hat{Z} = Z_1 + K(Z_2 - Z_1) Z^=Z1+K(Z2Z1),其中 K K K就是卡尔曼增益,接下来的问题就是这个参数取何值的时候,我们能够得到更加准确的估计值也(也就是说,如何将该估计值的方差最小)
由方差的性质可以得到:
σ ^ 2 = v a r ( Z 1 + K ( Z 2 − Z 1 ) ) = v a r ( ( 1 − K ) Z 1 ) + v a r ( K Z 2 ) = ( 1 − K ) 2 σ 1 2 + K 2 σ 2 2 \begin{aligned} \hat{\sigma}^2 &= var(Z_1 + K(Z_2 - Z_1)) \\ &= var((1-K)Z_1) + var(KZ_2) \\ &= (1-K)^2\sigma_1^2 + K^2\sigma_2^2 \end{aligned} σ^2=var(Z1+K(Z2Z1))=var((1K)Z1)+var(KZ2)=(1K)2σ12+K2σ22
所以我们呢可以对参数 K K K进行求导,求极小值,进而得到该问题的解。最终我们得到结果肯定是介于两者之间的,而方差比两者都小(也可以从正态分布的图像可以看出来的)

  • 协方差矩阵
    下面我们将回顾一下概率中的几个概念:
    • 方差:用来描述数据偏离整体数据均值的程度的, E { ( X − E X ) 2 } E\{(X - EX)^2\} E{(XEX)2}
    • 协方差:这个时候就不是一组数据了,而是需要描述两组数据之间的关系了, E { ( X − E X ) ( Y − E Y ) } E\{(X-EX)(Y-EY)\} E{(XEX)(YEY)}
      - 协方差矩阵:将上述的方差和协方差组成一个矩阵
      P = ( σ x 2 σ x y 2 σ x y 2 σ y 2 ) P = \begin{pmatrix}{\sigma_x^2} & {\sigma_{xy}^2} \\ {\sigma_{xy}^2} & {\sigma_y^2} \end{pmatrix} P=(σx2σxy2σxy2σy2)
  • 状态方程
    • 概念:由状态变量所张成的空间,就叫做状态空间,而状态方程是由这些状态变量的一阶微分方程组来描述这个系统。
  • 观测器
    • 这里就涉及到了状态观测的概念了,这些都是现代控制理论中所学的啊啊!!
    • 在实际的控制过程中,我们所采用的状态变量有时候并不能直接测得的,或者说直接测得的误差将会很大!因此我们不得不将状态进行重构,来间接的获得我们的状态变量!

接着我们来描述一下这些式子:
X ˙ = A X + B u Y = C X + D u \begin{aligned} \dot{\pmb{X}} &= A\pmb{X} + B\pmb{u} \\ \pmb{Y} &= C\pmb{X} + D\pmb{u} \end{aligned} XXX˙YYY=AXXX+Buuu=CXXX+Duuu
其中, X = [ x 1 , x 2 , x 3 , . . . , x n ] T X = [x_1,x_2,x_3,...,x_n]^T X=[x1,x2,x3,...,xn]T状态矢量
将其离散化后:
X k = A X k − 1 + B u k − 1 Y k = C X k + D u k \begin{aligned} \pmb{X}_{k} &= A\pmb{X}_{k-1} + B\pmb{u}_{k-1} \\ \pmb{Y}_k &= C\pmb{X}_k + D\pmb{u}_k \end{aligned} XXXkYYYk=AXXXk1+Buuuk1=CXXXk+Duuuk
当然了,离散化后,上面两个式子中的 A A A就不是同一个矩阵了!!(而且没有 X ˙ \dot{X} X˙)了!
然而正如我们之前所说,现实生活中充满了不确定的因素,因此我们将得到
X k = A X k − 1 + B u k − 1 + ω k − 1 Y k = C X k + D u k + μ k \begin{aligned} \pmb{X}_{k} &= A\pmb{X}_{k-1} + B\pmb{u}_{k-1} + \pmb{\omega}_{k-1} \\ \pmb{Y}_k &= C\pmb{X}_k + D\pmb{u}_k + \pmb{\mu}_k \end{aligned} XXXkYYYk=AXXXk1+Buuuk1+ωωωk1=CXXXk+Duuuk+μμμk
其中, ω \pmb{\omega} ωωω为过程噪声和 μ \pmb{\mu} μμμ为测量噪声,假设服从无偏的(期望为0)高斯分布(正态分布)
到现在,假如我们直接测量这个状态变量:
Z = H X = [ 1 0 ⋯ 0 0 1 ⋱ 0 ⋮ ⋱ ⋱ 0 0 ⋯ 0 1 ] [ x 1 x 2 ⋮ x n ] \begin{aligned} \pmb{Z} &= H\pmb{X} \\ &= \begin{bmatrix} {1} & {0} & {\cdots} & {0} \\ {0} & {1} & {\ddots} & {0} \\ {\vdots} & {\ddots} & {\ddots} & {0} \\ {0} & {\cdots} & {0} & {1} \end{bmatrix} \begin{bmatrix} {x_1} \\ {x_2} \\ {\vdots} \\ {x_n} \end{bmatrix} \end{aligned} ZZZ=HXXX=1000100001x1x2xn
类比上面的离散化的过程,我们得到了测量值 Z k = H k X k + μ k \pmb{Z}_k = H_k\pmb{X}_k+\pmb{\mu}_k ZZZk=HkXXXk+μμμk

综合上述的式子,我们可以得到以下两个式子:
X k = A X k − 1 + B u k − 1 + ω k − 1 Z k = H X k + μ k \begin{aligned} \pmb{X}_{k} &= A\pmb{X}_{k-1} + B\pmb{u}_{k-1} + \pmb{\omega}_{k-1} \\ \pmb{Z}_k &= H\pmb{X}_k+\pmb{\mu}_k \end{aligned} XXXkZZZk=AXXXk1+Buuuk1+ωωωk1=HXXXk+μμμk

其中 X k \pmb{X}_k XXXk为我们的计算值,而 Z k \pmb{Z}_k ZZZk为测量值
现在我们类比上面那个称物体重量的例子,在对比一下这两个式子,我们是不是发现了什么??
如果我们可以用卡尔曼滤波融合这个两个式子我们是不是就可以得到更加准确的估计值 X ^ \hat{\pmb{X}} XXX^

参考资料

卡尔曼滤波算法

补充资料

卡尔曼滤波算法与最小二乘

你可能感兴趣的:(Kalman滤波,算法)