卡尔曼滤波学习记录

前言

博主是做无人驾驶车辆建图与定位的,所以针对于车辆方面来浅显的学习。
这一部分是关于卡尔曼滤波器的理论部分,言简意赅,只写关键的东西。
卡尔曼滤波的核心就是预测与更新。预测一个理论值,再根据测量值去修正这个理论值。
预测的值称为预测值,修正后的值称为估计值。

推理过程

方程

卡尔曼滤波主要用于测量数据与推测数据的融合,浅显的解释就是,我用一个系统算了一个值,比如说车速,我还有一个传感器能够测一个车速,这两个速度值都存在着不同程度的误差,那么我就把他俩融合起来,求一个比较准确的速度。

处理方程

处理方程就是抽象实际情况中的系统状态,得到处理模型方程。
一般我们遇到的处理方程是这样:
x k = A x k − 1 + B u k + ϵ \LARGE x_k=Ax_{k-1}+Bu_k+\epsilon xk=Axk1+Buk+ϵ
其中传递的意思就是,该系统 k k k时刻的状态 x k x_k xk k − 1 k-1 k1时刻的状态 x k − 1 x_{k-1} xk1与转换矩阵 A A A作用 + + +输入的数据 u k u_k uk与转换矩阵 B B B作用+噪声 ϵ \epsilon ϵ
注意:该方程也常称为预测方程,即我们通过这个方程算出来的 x t x_t xt是一个理论值。真实情况还需要用理论结合实际测量值计算出来。

用一个匀加速直线运动举例,根据物理知识,易得方程组
S k = S k − 1 + V k − 1 Δ t + 1 2 a ( Δ t ) 2 \LARGE S_k=S_{k-1}+V_{k-1}\Delta t+\frac{1}{2}a(\Delta t)^2 Sk=Sk1+Vk1Δt+21a(Δt)2
V k = V k − 1 + a Δ t \LARGE V_k=V_{k-1}+a\Delta t Vk=Vk1+aΔt
S S S是位移, V V V是速度, a a a是加速度, Δ t \Delta t Δt是间隔时间,即 k k k时刻与 k − 1 k-1 k1时刻的时间差值
把这个方程组和状态方程进行类比,我们可以得到
[ S k V k ] = [ 1 Δ t 0 1 ] ∗ [ S k − 1 V k − 1 ] + [ 1 2 a ( Δ t ) 2 Δ t ] ∗ a \LARGE \begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}\quad =\begin{bmatrix}1&\Delta t\\0&1\end{bmatrix}*\begin{bmatrix}S_{k-1}\\V_{k-1}\end{bmatrix} +\begin{bmatrix}\frac{1}{2}a(\Delta t)^2\\\Delta t\end{bmatrix}*a SkVk=10Δt1Sk1Vk1+21a(Δt)2Δta
状态方程里面的 x k = [ S k V k ] x_k=\begin{bmatrix} S_{k}\\V_{k} \end{bmatrix} xk=[SkVk] A = [ 1 Δ t 0 1 ] A=\begin{bmatrix}1&\Delta t \\0&1\end{bmatrix} A=[10Δt1] B = [ 1 2 ( Δ t ) 2 Δ t ] B=\begin{bmatrix}\frac{1}{2}(\Delta t)^2\\\Delta t\end{bmatrix} B=[21(Δt)2Δt] u k = a u_k=a uk=a
此时我们并没有考虑噪声的存在情况,及处理方程里面的 ϵ t \epsilon_t ϵt
既然我们现在有了处理方程,那么直接进行计算不就行了吗?为啥还要参考测量值呢?那是因为真实的世界环境中,一个系统的状态非常复杂,往往无法精确建模,如果只按照处理方程来进行计算,那么每次计算就会对误差进行 A A A倍的放大,会越来越不准,所以需要引入测量量和系统噪声, ϵ t \epsilon_t ϵt就是状态方程的噪声

测量方程

测量方程指的是系统 t t t时刻状态 x t x_t xt映射出来的一些特征 z t z_t zt

z k = H x k + ν \LARGE z_k=Hx_k+\nu zk=Hxk+ν
测量方程中的 x k x_k xk同状态方程中的 x k x_k xk ν \nu ν是测量噪声,没有百分百能够测得准的传感器, z k z_k zk是测量值, H H H是映射矩阵,把状态值变化为测量值
回到我们的例子里面,假设我们在起点处放置了一个传感器,该传感器可以测得位移大小,那么我们的测量方程就是
z k = [ 1 0 ] ∗ [ S k V k ] z_k=\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}S_k\\V_k\end{bmatrix} zk=[10][SkVk]
注:此处没有写出噪声 那么 H = [ 1 0 ] H=\begin{bmatrix}1&0\end{bmatrix} H=[10]
对于测量方程,其实测量值 z z z是我们通过传感器去测量得到的,那么这个方程由什么作用呢,这个方程的作用就是带入我们在状态方程中求的 x k x_k xk,称为预测值,记为 x k ^ \hat{x_k} xk^,然后计算 x k ^ \hat{x_k} xk^的测量值 z k z_k zk,记为 z k ^ \hat{z_k} zk^,再和实际情况下通过测量得到的 z t z_t zt进行比较,继而进行融合

方程小汇总

此处对上述所提到的方程进行一个小的汇总

处理方程

x k = A x k − 1 + B u k + ϵ \LARGE x_k=Ax_{k-1}+Bu_k+\epsilon xk=Axk1+Buk+ϵ

测量方程

z k = H x k + ν \LARGE z_k=Hx_k+\nu zk=Hxk+ν

按照匀加速运动的例子

处理方程

[ S k V k ] = [ 1 Δ t 0 1 ] ∗ [ S k − 1 V k − 1 ] + [ 1 2 a ( Δ t ) 2 Δ t ] ∗ a + ϵ \LARGE \begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}\quad =\begin{bmatrix}1&\Delta t\\0&1\end{bmatrix}*\begin{bmatrix}S_{k-1}\\V_{k-1}\end{bmatrix} +\begin{bmatrix}\frac{1}{2}a(\Delta t)^2\\\Delta t\end{bmatrix}*a+\epsilon SkVk=10Δt1Sk1Vk1+21a(Δt)2Δta+ϵ
其中 x k = [ S k V k ] x_k=\begin{bmatrix} S_{k}\\V_{k} \end{bmatrix} xk=[SkVk] A = [ 1 Δ t 0 1 ] A=\begin{bmatrix}1&\Delta t \\0&1\end{bmatrix} A=[10Δt1] B = [ 1 2 ( Δ t ) 2 Δ t ] B=\begin{bmatrix}\frac{1}{2}(\Delta t)^2\\\Delta t\end{bmatrix} B=[21(Δt)2Δt] u k = a u_k=a uk=a ϵ \epsilon ϵ是处理方程的噪声

测量方程

z k = [ 1 0 ] ∗ [ S k V k ] + ν \LARGE z_k=\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}S_k\\V_k\end{bmatrix}+\nu zk=[10]SkVk+ν
其中 z k = [ S k ] z_k=\begin{bmatrix}S_k\end{bmatrix} zk=[Sk] H = [ 1 0 ] H=\begin{bmatrix}1&0\end{bmatrix} H=[10] ν \nu ν是测量过程的噪声

噪声处理

现在我们开始考虑两个方程中噪声的问题
对于 ϵ \epsilon ϵ ν \nu ν假设这两个噪声服从如下的多元高斯分布
p ( ϵ ) ∼ N ( 0 , Q ) p ( ν ) ∼ N ( 0 , R ) \LARGE p(\epsilon)\thicksim N(0,Q)\\p(\nu)\thicksim N(0,R) p(ϵ)N(0,Q)p(ν)N(0,R)
为什么噪声应当服从高斯分布呢?继续往下
我们假设系统噪声只位于速度分量上,且速度噪声的方差是一个常量0.01,那么就有
Q = [ 0 0 0 0.01 ] Q=\begin{bmatrix}0&0\\0&0.01\end{bmatrix} Q=[0000.01]
这个Q表示的意思是,在模型的处理方程中,在速度上系统噪声方差为0.01,位移上的为0,二者的协方差为零,说明二者的噪声独立,互不相关

预测与更新

有了之前的说明,那么我们就要进行数据的融合工作,即通过预测值和测量值得到一个最优的估计值

定义几个值

x k ′ ^ \hat{x'_k} xk^预测(先验)值,即使用状态方程计算出来的值
x k ^ \hat{x_k} xk^估计值,即用预测值和测量值融合得到的结果
z k ^ \hat{z_k} zk^预测测量值,即把 x k ′ ^ \hat{x'_k} xk^带入测量方程计算的预测测量值
z k z_k zk实际的测量值

估计值计算方程

x k ^ = x k ′ ^ + K k ( z k − z k ^ ) = x k ′ ^ + K k ( z k − H ( x k ′ ^ ) ) \huge \hat{x_k}=\hat{x'_k}+K_k(z_k-\hat{z_k})\\ \qquad \quad=\hat{x'_k}+K_k(z_k-H(\hat{x'_k})) xk^=xk^+Kk(zkzk^)=xk^+Kk(zkH(xk^))
其中 z k − z k ^ = z k − H ( x k ′ ^ ) z_k-\hat{z_k}=z_k-H(\hat{x'_k}) zkzk^=zkH(xk^) 这个东西称为残差,其实就是实际测量值与预测测量值的差

对于这个方程,我们可以从特殊情况下来看待理解它。
如果残差为零,那么说明真实测量与预测测量没有差别,那么
x k ^ = x k ′ ^ + K k ∗ 0 ⃗ 即 x k ^ = x k ′ ^ \huge \hat{x_k}=\hat{x'_k}+K_k*\vec0\\即\hat{x_k}=\hat{x'_k} xk^=xk^+Kk0 xk^=xk^那么说明预测值与估计值一样
如果 K k = 0 K_k=0 Kk=0,说明我们就不考虑测量值对于系统状态的影响,我们只信赖状态方程估算的数据,那么
x k ^ = x k ′ ^ + 0 ⃗ ∗ ( z k − z k ^ ) 即 x k ^ = x k ′ ^ \huge \hat{x_k}=\hat{x'_k}+\vec0*(z_k-\hat{z_k})\\即\hat{x_k}=\hat{x'_k} xk^=xk^+0 (zkzk^)xk^=xk^
如果 K k = 1 K_k=1 Kk=1,说明我们非常信赖测量的数据,那么
x k ^ = x k ′ ^ + 1 ⃗ ∗ ( z k − z k ^ ) = x k ′ ^ + z k − z k ^ = x k ′ ^ + z k − H x k ′ ^ \huge \quad\hat{x_k}=\hat{x'_k}+\vec1*(z_k-\hat{z_k})\\ =\hat{x'_k}+z_k-\hat{z_k}\\ \quad=\hat{x'_k}+z_k-H\hat{x'_k}\\ xk^=xk^+1 (zkzk^)=xk^+zkzk^=xk^+zkHxk^
根据匀加速直线运动的例子我们继续展开上式
[ S k ^ V k ^ ] = [ S k ′ ^ V k ′ ^ ] + [ S k 测 0 ] − [ 1 0 ] ∗ [ S k ′ ^ V k ′ ^ ] = [ S k 测 V k ′ ^ ] \huge\begin{bmatrix}\hat{S_k}\\\hat{V_k}\end{bmatrix}=\begin{bmatrix}\hat{S'_k}\\\hat{V'_k}\end{bmatrix}+\begin{bmatrix}S_{k测}\\0\end{bmatrix}-\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}\hat{S'_k}\\\hat{V'_k}\end{bmatrix}=\begin{bmatrix}S_{k测}\\\hat{V'_k}\end{bmatrix} Sk^Vk^=Sk^Vk^+Sk0[10]Sk^Vk^=SkVk^
由此可以看出,当 K k = 1 K_k=1 Kk=1时,我们对于测量方程的测量结果完全信任,对于能够测量到的数据,一律认为是我们的估计值
所以对于估计值计算方程。
我们可以理解为 K k K_k Kk是残差的系数,我们融合的就是预测值和残差,关键就在于如何求解这个 K k \huge K_k Kk

残差系数的求解

估计值和真实值的差距

P k = E [ e k e k T ] = E [ ( x k − x k ^ ) ( x k − x k ^ ) T ] P_k = E[e_ke^T_k]=E[(x_k-\hat{x_k})(x_k-\hat{x_k})^T] Pk=E[ekekT]=E[(xkxk^)(xkxk^)T]
这个是真实值与估计值的协防差矩阵
e k e_k ek是一个向量,它是由系统状态的变量组成的,在例子中就是由 S S S V V V组成,即位移和速度。那么就有

P k = [ E ( S e r r S e r r T ) E ( S e r r V e r r T ) E ( V e r r S e r r T ) E ( V e r r V e r r T ) ] P_k=\begin{bmatrix}E(S_{err}S^T_{err}) &E(S_{err}V^T_{err})\\E(V_{err}S^T_{err}) &E(V_{err}V^T_{err})\end{bmatrix} Pk=[E(SerrSerrT)E(VerrSerrT)E(SerrVerrT)E(VerrVerrT)]

S e r r S_{err} Serr是位移的误差, V e r r V_{err} Verr是速度的误差,对角线上是他们各自的方差

x k − x k ^ = x k − ( x k ′ ^ + K k ( z k − z k ^ ) )       = x k − ( x k ′ ^ + K k ( H k x k + ν k − H k x k ′ ^ ) )       = x k − x k ′ ^ − K k H k x k − K k ν k + K k H k x k ′ ^       = ( I − K k H k ) ( x k − x k ′ ^ ) − K k ν k x_k-\hat{x_k}=x_k-(\hat {x'_k}+K_k(z_k-\hat{z_k})) \\\qquad\quad\;\;\, =x_k-(\hat {x'_k}+K_k(H_kx_k+\nu_k-H_k\hat{x'_k})) \\\qquad\quad\;\;\,=x_k-\hat{x'_k}-K_kH_kx_k-K_k\nu_k+K_kH_k\hat{x'_k} \\\qquad\quad\;\;\,=(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k xkxk^=xk(xk^+Kk(zkzk^))=xk(xk^+Kk(Hkxk+νkHkxk^))=xkxk^KkHkxkKkνk+KkHkxk^=(IKkHk)(xkxk^)Kkνk

此处 z k ^ = H k x k ′ ^ \hat{z_k}=H_k\hat{x'_k} zk^=Hkxk^,为什么没有噪声呢,博主自己理解的是,因为这个值不是真实测量的所以不引入噪声。就算如果引入了噪声,那么根据 z k − z k ^ z_k-\hat{z_k} zkzk^,噪声就被消去了,噪声就没用了。博主认为应该似乎就是这种原因吧。

x k − x k ^ x_k-\hat{x_k} xkxk^的表达式代入,直接展开,又因为 x k x_k xk ν k \nu_k νk是相互独立的,所以有 E [ A ν k ] = E [ A ] E [ ν k ] E[A\nu_k]=E[A]E[\nu_k] E[Aνk]=E[A]E[νk] A A A是一个表达式,且 E [ ν k ] = 0 E[\nu_k]=0 E[νk]=0,所以只带有 ν k \nu_k νk的期望项都为零
P k = E [ [ ( I − K k H k ) ( x k − x k ′ ^ ) − K k ν k ] [ ( I − K k H k ) ( x k − x k ′ ^ ) − K k ν k ] T ]     = E [ [ ( I − K k H k ) ( x k − x k ′ ^ ) − K k ν k ] [ ( x − x k ′ ^ ) T ( I − K k H k ) T − ν k T K k T ] ]     = E [ ( I − K k H k ) ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ( I − K k H k ) T + K k ν k ν k T K k T ]     = ( I − K k H k ) E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ] ( I − K k H k ) T + K k E [ ν k ν k T ] K k T P_k=E\begin{bmatrix}[(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k][(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k]^T\end{bmatrix} \\\quad\;\,=E\begin{bmatrix}[(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k][(x-\hat{x'_k})^T(I-K_kH_k)^T-\nu_k^TK_k^T]\end{bmatrix} \\\quad\;\,=E\begin{bmatrix}(I-K_kH_k)(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T(I-K_kH_k)^T+K_k\nu_k\nu_k^TK_k^T\end{bmatrix} \\\quad\;\,=(I-K_kH_k)E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}(I-K_kH_k)^T+K_kE\begin{bmatrix}\nu_k\nu_k^T\end{bmatrix}K_k^T Pk=E[[(IKkHk)(xkxk^)Kkνk][(IKkHk)(xkxk^)Kkνk]T]=E[[(IKkHk)(xkxk^)Kkνk][(xxk^)T(IKkHk)TνkTKkT]]=E[(IKkHk)(xkxk^)(xkxk^)T(IKkHk)T+KkνkνkTKkT]=(IKkHk)E[(xkxk^)(xkxk^)T](IKkHk)T+KkE[νkνkT]KkT
又因为 E [ ν k ν k T ] = R E\begin{bmatrix}\nu_k\nu_k^T\end{bmatrix}=R E[νkνkT]=R,所以就有
P k = ( I − K k H k ) E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ] ( I − K k H k ) T + K k R K k T P_k=(I-K_kH_k)E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}(I-K_kH_k)^T+K_kRK_k^T Pk=(IKkHk)E[(xkxk^)(xkxk^)T](IKkHk)T+KkRKkT
我们发现此时在 P k P_k Pk中出现了一个期望 E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ] E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix} E[(xkxk^)(xkxk^)T],由前面可知,这是真实值与预测值的协方差矩阵
所以有 P k ′ = E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ] P'_k=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix} Pk=E[(xkxk^)(xkxk^)T]
P k ′ P'_k Pk是真实值与预测值的协方差矩阵
现在回到 P k P_k Pk的表达式
P k = ( I − K k H k ) P k ′ ( I − K k H k ) T + K k R K k T     = P k ′ − K k H k P k ′ − P k ′ H k T K k T + K k ( H k P k ′ H k T + R ) K k T P_k=(I-K_kH_k)P'_k(I-K_kH_k)^T+K_kRK_k^T\\ \quad\;\,=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+K_k(H_kP'_kH_k^T+R)K_k^T Pk=(IKkHk)Pk(IKkHk)T+KkRKkT=PkKkHkPkPkHkTKkT+Kk(HkPkHkT+R)KkT
我们希望求到最小均方差,那么 P k P_k Pk的迹(矩阵对角线元素之和,也是均方差)应该最小,所以
t r ( P k ) = t r ( P k ′ ) − t r ( K k H k P k ′ ) − t r ( P k ′ H k T K k T ) + t r [ K k ( H k P k ′ H k T + R ) K k T ]         = t r ( P k ′ ) − 2 t r ( K k H k P k ′ ) + t r [ K k ( H k P k ′ H k T + R ) K k T ] tr(P_k)=tr(P'_k)-tr(K_kH_kP'_k)-tr(P'_kH_k^TK_k^T)+tr[K_k(H_kP'_kH_k^T+R)K_k^T]\\ \qquad\;\;\;\,=tr(P'_k)-2tr(K_kH_kP'_k)+tr[K_k(H_kP'_kH_k^T+R)K_k^T] tr(Pk)=tr(Pk)tr(KkHkPk)tr(PkHkTKkT)+tr[Kk(HkPkHkT+R)KkT]=tr(Pk)2tr(KkHkPk)+tr[Kk(HkPkHkT+R)KkT]
K k K_k Kk求偏导,此处需要用到两个矩阵微分公式
公式一:
∂ t r ( A B ) ∂ A = B T \frac{\partial tr(AB)}{\partial A}=B^T Atr(AB)=BT
公式二:
∂ t r ( A B A T ) ∂ A = 2 A B \frac{\partial tr(ABA^T)}{\partial A}=2AB Atr(ABAT)=2AB
∂ t r ( P k ) ∂ K k     = − ∂ 2 t r ( K k H k P k ′ ) ∂ K k + ∂ t r [ K k ( H k P k ′ H k T + R ) K k T ] ∂ K k = − 2 ( H k P k ′ ) T + 2 K k ( H P k ′ H T + R ) \frac{\partial tr(P_k)}{\partial K_k}\;\,=-\frac{\partial2tr(K_kH_kP'_k)}{\partial K_k}+\frac{\partial tr[K_k(H_kP'_kH_k^T+R)K_k^T]}{\partial K_k}\\=-2(H_kP'_k)^T+2K_k(HP'_kH^T+R) Kktr(Pk)=Kk2tr(KkHkPk)+Kktr[Kk(HkPkHkT+R)KkT]=2(HkPk)T+2Kk(HPkHT+R)
为了求得最小值,偏导应该为零,对于协方差矩阵 P = P T P=P^T P=PT
0 = − 2 ( H k P k ′ ) T + 2 K k ( H P k ′ H T + R ) 0=-2(H_kP'_k)^T+2K_k(HP'_kH^T+R) 0=2(HkPk)T+2Kk(HPkHT+R)
整理可得

卡尔曼增益的表达式

K k = P k ′ H k T ( H P k ′ H T + R ) − \huge K_k=P'_kH_k^T(HP'_kH^T+R)^- Kk=PkHkT(HPkHT+R)
得到了 K k K_k Kk的计算方法,只需求出 P k ′ P_k' Pk(真实值与预测值的协方差矩阵)即可

预测值和真实值的差距

P k ′ = E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ]    = E [ ( x k − x k ′ ^ ) ( x k − x k ′ ^ ) T ]    = E [ ( A k x k + B k u k + ϵ k − A k x ^ k − 1 − B k u k ) ( A k x k + B k u k + ϵ k − A k x ^ k − 1 − B k u k ) T ]    = E [ ( A k ( x k − x ^ k − 1 ) + ϵ k ) ( A k ( x k − x ^ k − 1 ) + ϵ k ) T ]    = E [ ( A k ( x k − x ^ k − 1 ) ( A k ( x k − x ^ k − 1 ) T ] + E [ ϵ k ϵ k T ] P'_k=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_kx_k+B_ku_k+\epsilon_k-A_k\hat{x}_{k-1}-B_ku_k)(A_kx_k+B_ku_k+\epsilon_k-A_k\hat{x}_{k-1}-B_ku_k)^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_k(x_k-\hat{x}_{k-1})+\epsilon_k)(A_k(x_k-\hat{x}_{k-1})+\epsilon_k)^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_k(x_k-\hat{x}_{k-1})(A_k(x_k-\hat{x}_{k-1})^T\end{bmatrix}+E\begin{bmatrix}\epsilon_k\epsilon_k^T\end{bmatrix} Pk=E[(xkxk^)(xkxk^)T]=E[(xkxk^)(xkxk^)T]=E[(Akxk+Bkuk+ϵkAkx^k1Bkuk)(Akxk+Bkuk+ϵkAkx^k1Bkuk)T]=E[(Ak(xkx^k1)+ϵk)(Ak(xkx^k1)+ϵk)T]=E[(Ak(xkx^k1)(Ak(xkx^k1)T]+E[ϵkϵkT]
     = A k P k − 1 A k T + Q \huge\;\;=A_kP_{k-1}A_k^T+Q =AkPk1AkT+Q

使用卡尔曼增益去更新估计值与真实值的差距

把卡尔曼增益表达式代入 P k P_k Pk表达式
K k = P k ′ H k T ( H P k ′ H T + R ) − K_k=P'_kH_k^T(HP'_kH^T+R)^- Kk=PkHkT(HPkHT+R)
P k = P k ′ − K k H k P k ′ − P k ′ H k T K k T + K k ( H k P k ′ H k T + R ) K k T P_k=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+K_k(H_kP'_kH_k^T+R)K_k^T Pk=PkKkHkPkPkHkTKkT+Kk(HkPkHkT+R)KkT
注意仅带入到第三项的 K k K_k Kk
P k = P k ′ − K k H k P k ′ − P k ′ H k T K k T + P k ′ H k T ( H P k ′ H T + R ) − ( H k P k ′ H k T + R ) K k T P_k=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+P'_kH_k^T(HP'_kH^T+R)^-(H_kP'_kH_k^T+R)K_k^T Pk=PkKkHkPkPkHkTKkT+PkHkT(HPkHT+R)(HkPkHkT+R)KkT
    = P k ′ − K k H k P k ′ \quad\;\,=P'_k-K_kH_kP'_k =PkKkHkPk
    = ( I − K k H k ) P k ′ \quad\;\,\huge=(I-K_kH_k)P'_k =(IKkHk)Pk

总结

卡尔曼滤波的更新过程

1, P 0 P_0 P0 x 0 x_0 x0是已知量,由 P 0 P_0 P0计算出 P 1 ′ P'_1 P1,再算出 K 1 K_1 K1,结合测量值算出 x 1 x_1 x1,再利用 K 1 K_1 K1更新 P 1 P_1 P1
2, 由 P 1 P_1 P1计算出 P 2 ′ P'_2 P2,再算出 K 2 K_2 K2,结合测量值算出 x 2 x_2 x2,再利用 K 2 K_2 K2更新 P 2 P_2 P2
。。。。。。
n,由 P n − 1 P_{n-1} Pn1计算出 P n ′ P'_n Pn,再算出 K n K_n Kn,结合测量值算出 x n x_n xn,再利用 K n K_n Kn更新 P n P_n Pn

需要使用的公式

x k ′ ^     = A x ^ k − 1 + B u k \huge \hat{x'_k}\;\,=A\hat{x}_{k-1}+Bu_k xk^=Ax^k1+Buk
P k ′   = A P k − 1 A T + Q \huge P'_k\,=AP_{k-1}A^T+Q Pk=APk1AT+Q
K k = P k ′ H T ( H P k ′ H T + R ) − \huge K_k=P'_kH^T(HP'_kH^T+R)^- Kk=PkHT(HPkHT+R)
z k ^      = H x k ′ ^ + ν \huge \hat{z_k}\;\;=H\hat{x'_k}+\nu zk^=Hxk^+ν
x k ^ = x k ′ ^ + K k ( z k − z k ^ ) \huge \hat{x_k}=\hat{x'_k}+K_k(z_k-\hat{z_k}) xk^=xk^+Kk(zkzk^)
P k    = ( I − K k H ) P k ′ \huge P_k\;=(I-K_kH)P'_k Pk=(IKkH)Pk
其中:
p ( ϵ ) ∼ N ( 0 , Q ) p ( ν ) ∼ N ( 0 , R ) \huge p(\epsilon)\thicksim N(0,Q)\\p(\nu)\thicksim N(0,R) p(ϵ)N(0,Q)p(ν)N(0,R)

例子

一辆匀速直线运动的车,从原点出发 S 0 = 0 m S_0=0m S0=0m,初始速度 V 0 = 0 m / s V_0=0m/s V0=0m/s求出车与原点的位移,加速度 a = 2 m / s a=2m/s a=2m/s,每次的测量时间间隔 Δ t = 0.2 s \Delta t=0.2s Δt=0.2s Q = 0.02 Q=0.02 Q=0.02 R = 10 R=10 R=10,对于 P k ′ P'_k Pk的初值自己设定,本例中设为 [ 0 0 0 0 ] \begin{bmatrix}0&0\\0&0\end{bmatrix} [0000],噪声也是自己设定的

import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt

#预测方程噪声的协方差矩阵
Q=np.array([(0,0),(0,0.02)])
#测量方程噪声的方差
R=np.array([10]);
#采样时间
deltaT = 0.1
#生成所有的时间
t=np.arange(0,5,deltaT)
N=t.size
#加速度
a = 2
#真实位移
x=1/2*a*t*t
np.random.seed(0)
noise = np.random.normal(0,np.sqrt(10),N)
#生成测量数据
z=x+noise
#A,B,H矩阵
A=np.array([(1,deltaT),(0,1)])
B=np.array([(1/2*deltaT*deltaT),(deltaT)])
H=np.array([(1,0)])
#估计值
xhat=np.zeros([2,t.shape[0]])
#预测值
xhatminus=np.zeros([2,t.shape[0]])
#估计值和真实值协方差矩阵
P=np.zeros(Q.shape)
#预测值和真实值协方差矩阵
Pminus=np.zeros(Q.shape)
#单位矩阵
I=np.eye(Q.shape[0])

#进行卡尔曼滤波
for k in range(9,N):
    xhatminus[:,k]=np.dot(A,xhat[:,k-1])+np.dot(B,a)
    Pminus = np.dot(np.dot(A,P),A.T)+Q   
    K=np.dot(np.dot(Pminus,H.T),np.linalg.inv(np.dot(np.dot(H,Pminus),H.T)+R)) 
    xhat[:,k]=xhatminus[:,k]+ np.dot(K,z[k]-np.dot(H,xhatminus[:,k]))
    P=np.dot((I-np.dot(K,H)),Pminus)

plt.rcParams['font.sans-serif']=['Simhei'] 
plt.plot(z,'r',label=u'测量数据')
plt.plot(x,'g',label=u'真值')
plt.plot(xhat[0,:],'b',label=u'估计值')
plt.legend(loc = 0)
plt.show()

效果图
参考:
卡尔曼滤波 – 从推导到应用(一)
卡尔曼滤波 – 从推导到应用(二)
无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪
卡尔曼滤波算法详细推导

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值