Kalman filter 卡尔曼公式推导

Kalman filter

前言

最近学习了卡尔曼滤波器,所以整理在上面,之后如果有用到的话再看,这里就不再做前沿的介绍或者别的说明了,如果之后有空的话再做补充吧。最后附上一个扩展卡尔曼滤波器的例子,并附上 Matlab 代码。

公式推导

状态方程

状态方程的例子可以套在绝大多数情况(话不能说满),所以这里也就没有举具体的例子,如果大家想参考相关的例子,可以看最下面的参考连接,推荐哔哩哔哩 Up主 Dr_Can 的视频。

在自动控制原理中,连续系统状态方程表示如下:
X ˙ = A X + B u Y = C X + D u \begin{aligned} \dot{X} &= AX+Bu\\ Y&=CX+Du \end{aligned} X˙Y=AX+Bu=CX+Du
其中 X X X 为状态变量, Y Y Y 为输出值或是待观测的变量, u u u 为输入, D D D 为输入对输出的直接影响,可以为 0 矩阵,所以上式也通常写为:

X ˙ = A X + B u Y = C X \begin{aligned} \dot{X} &= AX+Bu\\ Y&=CX \end{aligned} X˙Y=AX+Bu=CX

为了实际处理,我们需要将状态方程离散化,离散化后为:

X k = A k X k − 1 + B k u k − 1 Z k = H k X k \begin{aligned} X_k &= A_{k}X_{k-1}+B_ku_{k-1}\\ Z_k &= H_{k}X_{k} \end{aligned} XkZk=AkXk1+Bkuk1=HkXk

注意:这里的 A k , B k {A_k},{B_k} Ak,Bk 与离散化之前的值并不相同,要根据实际情况进行离散化。

实际情况中,无论是系统本身,还是观测器都伴随有噪声的影响,这也是要进行卡尔曼滤波的原因,加入噪声后得到如下公式:

真实值:

X k = A k X k − 1 + B k u k − 1 + w k − 1 (1) \tag{1} X_k = A_{k}X_{k-1}+B_ku_{k-1} +w_{k-1} Xk=AkXk1+Bkuk1+wk1(1)

观测值:

Z k = H k X k + V k (2) \tag{2} Z_k = H_{k}X_{k}+V_k Zk=HkXk+Vk(2)

其中

w k − 1 w_{k-1} wk1 为系统的噪声,符合高斯分布 w k ∼ N ( 0 , Q k ) w_k \sim N(0,Q_k) wkN(0,Qk)

v k v_k vk 为测量噪声,符合高斯分布 v k ∼ N ( 0 , R k ) v_k \sim N(0,R_k) vkN(0,Rk)

预测值:

X ^ k − = A k X ^ k − 1 + B k u k (3) \tag{3} {\mathbf{\hat{X}}_k^-} = {A_k}{\mathbf{\hat{X}}_{k-1}} + {B_k}{u_k} X^k=AkX^k1+Bkuk(3)

注: 因为无法知道 w k w_{k} wk 的值,所以我们无法知道真实值 X k X_k Xk 的具体位置,但忽略噪声影响的预测值(先验估计值) X ^ k − {\mathbf{\hat{X}}_k^-} X^k ,可以通过带入上一次的计算值(后验估计值) X ^ k − 1 {\hat{X}}_{k-1} X^k1得出。我们通过预测值,就得到了关于 真实值 X k X_k Xk 的高斯分布预测 真实值 X k ∼ N ( X ^ k − , P k − ) X_k\sim N({{\hat{X}}_k^-},P_k^-) XkN(X^k,Pk)

其中 P k − P_k^- Pk先验估计的协方差矩阵
P k − = E ( e k − , e k − T ) e k − = ( X k − X ^ k − ) \begin{aligned} {P_k^-} &= E(e_k^-,e_k^{-T})\\ e{_k^-} &= (X_{k}-{\hat{X}_k^-})\\ \end{aligned} Pkek=E(ek,ekT)=(XkX^k)

先验估计误差 e k − e{_k^-} ek
e k − = X k − X ^ k − = A X k − 1 + B u k − 1 + w k − 1 − ( A X ^ k − 1 + B u k − 1 ) = A ( X k − 1 − X ^ k − 1 ) + w k − 1 = A e k − 1 + w k − 1 \begin{aligned} e{_k^-}&=X_{k}-{\hat{X}_k^-}\\ &= AX_{k-1}+Bu_{k-1}+w_{k-1}-(A\hat{X}_{k-1}+Bu_{k-1})\\ &= A(X_{k-1}-\hat{X}_{k-1})+w_{k-1}\\ &= Ae_{k-1}+w_{k-1} \end{aligned} ek=XkX^k=AXk1+Buk1+wk1(AX^k1+Buk1)=A(Xk1X^k1)+wk1=Aek1+wk1
其中 e k − 1 − e^-_{k-1} ek1后验误差

先验估计误差的协方差矩阵 P k − {P_k^-} Pk
P k − = E ( e k − , e k − T ) = E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 + w k − 1 ) T ] = E [ ( A e k − 1 + w k − 1 ) ( e k − 1 T A T + w k − 1 T ) ] = E [ A e k − 1 e k − 1 T A T + A e k − 1 w k − 1 T + w k − 1 e k − 1 T A T + w k − 1 w k − 1 T ] = A E ( e k − 1 e k − 1 T ) A T + A E ( e k − 1 w k − 1 T ) + E ( w k − 1 e k − 1 T ) A T + E ( w k − 1 w k − 1 T ) \begin{aligned} {P_k^-}&= E(e_k^-,e_k^{-T})\\ &= E[(Ae_{k-1}+w_{k-1})(Ae_{k-1}+w_{k-1})^T]\\ &= E[(Ae_{k-1}+w_{k-1})({e^T_{k-1}}A^T+w^T_{k-1})]\\ &= E[Ae_{k-1}{e^T_{k-1}}A^T+Ae_{k-1}w^T_{k-1}+w_{k-1}{e^T_{k-1}}A^T+w_{k-1}w^T_{k-1}]\\ &= AE(e_{k-1}{e^T_{k-1}})A^T+AE(e_{k-1}w^T_{k-1})+E(w_{k-1}{e^T_{k-1}})A^T+E(w_{k-1}w^T_{k-1})\\ \end{aligned} Pk=E(ek,ekT)=E[(Aek1+wk1)(Aek1+wk1)T]=E[(Aek1+wk1)(ek1TAT+wk1T)]=E[Aek1ek1TAT+Aek1wk1T+wk1ek1TAT+wk1wk1T]=AE(ek1ek1T)AT+AE(ek1wk1T)+E(wk1ek1T)AT+E(wk1wk1T)
其中 由于 e k − 1 e_{k-1} ek1 w k − 1 w_{k-1} wk1 相互独立,所以 A E ( e k − 1 w k − 1 T ) AE(e_{k-1}w^T_{k-1}) AE(ek1wk1T) E ( w k − 1 e k − 1 T ) A T E(w_{k-1}{e^T_{k-1}})A^T E(wk1ek1T)AT 两项为 0 0 0 E ( w k − 1 w k − 1 T ) = Q k − 1 E(w_{k-1}w^T_{k-1}) = Q_{k-1} E(wk1wk1T)=Qk1 E ( e k − 1 e k − 1 T ) = P k − 1 E(e_{k-1}{e^T_{k-1}}) = P_{k-1} E(ek1ek1T)=Pk1 ,所以上式可简化为:
P k − = A P k − 1 A T + Q k − 1 (4) \tag{4} {P_k^-}= AP_{k-1}A^T+Q_{k-1} Pk=APk1AT+Qk1(4)
对于观测值 Z k = H k X k + V k Z_k = H_{k}X_{k}+V_k Zk=HkXk+Vk
Z k = H k X k + V k H k X k = Z k − V k X k = H k − 1 ( Z k − V k ) \begin{aligned} Z_k &= H_{k}X_{k}+V_k\\ H_{k}X_{k} &= Z_k-V_k\\ X_{k} &= {H_{k}^{-1}}(Z_k-V_k)\\ \end{aligned} ZkHkXkXk=HkXk+Vk=ZkVk=Hk1(ZkVk)
由于无法建模观测噪声 V k V_k Vk 的影响,所以
X m e a _ k = H k − 1 Z k X_{mea\_k} = {H_{k}^{-1}}Z_k Xmea_k=Hk1Zk


数据融合

至此,我们就知道了两个数据来源,一个是我们根据 公式 3 进行的预测值,一个是我们根据观测获得的测量值,这两个值都有误差,且误差都服从高斯分布,这就需要我们通过数据融合的思想,来获取更为精确的数据。

后验估计

采用数据融合的思想,新的预测数据 X ^ k \hat{X}_{k} X^k 由下式获得:
X ^ k = X ^ k − + G k ( X m e a _ k − X ^ k − ) = X ^ k − + G k ( H k − 1 Z k − X ^ k − ) 令 G k = K k H k = X ^ k − + K k H k ( H k − 1 Z k − X ^ k − ) = X ^ k − + K k ( Z k − H k X ^ k − ) \begin{aligned} {\hat{X}_{k}}&={\hat{X}_k^-}+{G_k}(X_{mea\_k}-{\hat{X}_k^-})\\ &={\hat{X}_k^-}+{G_k}({H_{k}^{-1}}Z_k-{\hat{X}_k^-})\\\\ &令 G_k = {K_k}{H_{k}}\\ &={\hat{X}_k^-}+{K_k}{H_{k}}({H_{k}^{-1}}Z_k-{\hat{X}_k^-})\\ &={\hat{X}_k^-}+{K_k}(Z_k-{H_{k}}{\hat{X}_k^-})\\ \end{aligned} X^k=X^k+Gk(Xmea_kX^k)=X^k+Gk(Hk1ZkX^k)Gk=KkHk=X^k+KkHk(Hk1ZkX^k)=X^k+Kk(ZkHkX^k)

X ^ k = X ^ k − + K k ( Z k − H k X ^ k − ) (5) \tag{5} {\hat{X}_{k}}={\hat{X}_k^-}+{K_k}(Z_k-{H_{k}}{\hat{X}_k^-})\\ X^k=X^k+Kk(ZkHkX^k)(5)

Kalman Gain K k K_k Kk 的取值范围为:
K k ∈ [ 0 , H k − 1 ] w h e n : K k = 0 , X ^ k = X ^ k − w h e n : K k = H k − 1 , X ^ k = X m e a _ k \begin{aligned} &K_k\in[0,H{_k^{-1}}]\\ when:&K_k = 0,&\hat{X}_{k}&={\hat{X}_k^-}\\ when :&K_k = H{_k^{-1}},&\hat{X}_{k}&=X_{mea\_k} \end{aligned} when:when:Kk[0,Hk1]Kk=0,Kk=Hk1,X^kX^k=X^k=Xmea_k

这样就变成如下目标,寻找 K k K_k Kk 值,使得后验误差 X k − X ^ k X_k-\hat{X}_k XkX^k 误差最小。
e k = X k − X ^ k e_k=X_k-\hat{X}_k ek=XkX^k

后验误差的协方差矩阵

P k = E ( e , e T ) = [ σ e 1 2 σ e 1 e 2 σ e 2 e 1 σ e 2 2 ] P_k=E(e,e^T)= \begin{bmatrix} \sigma_{e_1}^2 & \sigma_{e_1e_2} \\ \sigma_{e_2e_1} & \sigma_{e_2}^2 \\ \end{bmatrix} Pk=E(e,eT)=[σe12σe2e1σe1e2σe22]

希望误差最小,既 X ^ k \hat{X}_k X^k 越接近 X k X_k Xk ,既方差最小,既 P k P_k Pk t r ( P k ) tr(P_k) tr(Pk) 最小。
X k − X ^ k = X k − X ^ k − − K k ( Z k − H k X ^ k − ) = X k − X ^ k − − K k Z k + K k H k X ^ k − = X k − X ^ k − − K k ( H k X k + V k ) + K k H k X ^ k − = X k − X ^ k − − K k H k X k − K k V k + K k H k X ^ k − = ( X k − X ^ k − ) − K k H k ( X k − X ^ k − ) − K k V k = ( I − K k H k ) ( X k − X ^ k − ) − K k V k = ( I − K k H k ) e k − − K k V k \begin{aligned} X_k-\hat{X}_k&= X_k-{\hat{X}_k^-}-{K_k}({Z_k}-{H_k}{\hat{X}_k^-})\\ &= X_k-{\hat{X}_k^-}-{K_k}{Z_k}+{K_k}{H_k}{\hat{X}_k^-}\\ &= X_k-{\hat{X}_k^-}-{K_k}({H_k}{X_k}+{V_k})+{K_k}{H_k}{\hat{X}_k^-}\\ &= X_k-{\hat{X}_k^-}-{K_k}{H_k}{X_k}-{K_k}{V_k}+{K_k}{H_k}{\hat{X}_k^-}\\ &= (X_k-{\hat{X}_k^-})-{K_k}{H_k}({X_k}-{\hat{X}_k^-})-{K_k}{V_k}\\ &= (I-{K_k}{H_k})({X_k}-{\hat{X}_k^-})-{K_k}{V_k}\\ &= (I-{K_k}{H_k}){e_k^-}-{K_k}{V_k}\\ \end{aligned} XkX^k=XkX^kKk(ZkHkX^k)=XkX^kKkZk+KkHkX^k=XkX^kKk(HkXk+Vk)+KkHkX^k=XkX^kKkHkXkKkVk+KkHkX^k=(XkX^k)KkHk(XkX^k)KkVk=(IKkHk)(XkX^k)KkVk=(IKkHk)ekKkVk

协方差矩阵:
P k = E ( e , e T ) = E ( ( X k − X ^ k ) ( X k − X ^ k ) T ) = E ( ( I − K k H k ) e k − − K k V k ) ( ( I − K k H k ) e k − − K k V k ) T ) = E ( ( I − K k H k ) e k − − K k V k ) ( e k − T ( I − K k H k ) T − V k T K k T ) T ) = E ( ( I − K k H k ) e k − e k − T ( I − K k H k ) T − ( I − K k H k ) e k − V k T K k T − K k V k e k − T ( I − K k H k ) T + K k V k V k T K k T ) = E ( ( I − K k H k ) e k − e k − T ( I − K k H k ) T ) − E ( ( I − K k H k ) e k − V k T K k T ) − E ( K k V k e k − T ( I − K k H k ) T ) + E ( K k V k V k T K k T ) \begin{aligned} P_k &= E(e,e^T)\\ &= E(({X_k}-{\hat{X}_k})({X_k}-{\hat{X}_k})^T)\\ &= E((I-{K_k}{H_k}){e_k^-}-{K_k}{V_k})((I-{K_k}{H_k}){e_k^-}-{K_k}{V_k})^T)\\ &= E((I-{K_k}{H_k}){e_k^-}-{K_k}{V_k})({{e_k^-}^T}(I-{K_k}{H_k})^T-{V_k^T}{K_k^T})^T)\\ &= E((I-{K_k}{H_k}){e_k^-}{{e_k^-}^T}(I-{K_k}{H_k})^T-(I-{K_k}{H_k}){e_k^-}{V_k^T}{K_k^T} -{K_k}{V_k}{{e_k^-}^T}(I-{K_k}{H_k})^T+{K_k}{V_k}{V_k^T}{K_k^T})\\ &= E((I-{K_k}{H_k}){e_k^-}{{e_k^-}^T}(I-{K_k}{H_k})^T) - E((I-{K_k}{H_k}){e_k^-}{V_k^T}{K_k^T}) - E({K_k}{V_k}{{e_k^-}^T}(I-{K_k}{H_k})^T) + E({K_k}{V_k}{V_k^T}{K_k^T})\\ \end{aligned} Pk=E(e,eT)=E((XkX^k)(XkX^k)T)=E((IKkHk)ekKkVk)((IKkHk)ekKkVk)T)=E((IKkHk)ekKkVk)(ekT(IKkHk)TVkTKkT)T)=E((IKkHk)ekekT(IKkHk)T(IKkHk)ekVkTKkTKkVkekT(IKkHk)T+KkVkVkTKkT)=E((IKkHk)ekekT(IKkHk)T)E((IKkHk)ekVkTKkT)E(KkVkekT(IKkHk)T)+E(KkVkVkTKkT)
其中:
E ( ( I − K k H k ) e k − V k T K k T ) = ( I − K k H k ) E ( e k − V k T ) K k T E ( K k V k e k − T ( I − K k H k ) T ) = K k E ( V k e k − T ) ( I − K k H k ) T E((I-{K_k}{H_k}){e_k^-}{V_k^T}{K_k^T}) = (I-{K_k}{H_k})E({e_k^-}{V_k^T}){K_k^T}\\ E({K_k}{V_k}{{e_k^-}^T}(I-{K_k}{H_k})^T) ={K_k}E({V_k}{{e_k^-}^T})(I-{K_k}{H_k})^T E((IKkHk)ekVkTKkT)=(IKkHk)E(ekVkT)KkTE(KkVkekT(IKkHk)T)=KkE(VkekT)(IKkHk)T
E ( V k e k − T ) E({V_k}{{e_k^-}^T}) E(VkekT) V k 与 e k − T {V_k}与{{e_k^-}^T} VkekT 相互独立,故上面两个式子都为0.
P k = E ( e , e T ) = E ( ( I − K k H k ) e k − e k − T ( I − K k H k ) T ) + E ( K k V k V k T K k T ) = ( I − K k H k ) P k − ( I − K k H k ) T + K k R k K k T = ( P k − − K k H k P k − ) ( I − K k H k ) T + K k R k 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 K k T + K k R k K k T \begin{aligned} P_k &= E(e,e^T)\\ &= E((I-{K_k}{H_k}){e_k^-}{{e_k^-}^T}(I-{K_k}{H_k})^T) + E({K_k}{V_k}{V_k^T}{K_k^T})\\ &= (I-{K_k}{H_k}){P_k^-}(I-{K_k}{H_k})^T + {K_k}{R_k}{K_k^T}\\ &= ({P_k^-}-{K_k}{H_k}{P_k^-})(I-{K_k}{H_k})^T + {K_k}{R_k}{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}{K_k^T} + {K_k}{R_k}{K_k^T} \end{aligned} Pk=E(e,eT)=E((IKkHk)ekekT(IKkHk)T)+E(KkVkVkTKkT)=(IKkHk)Pk(IKkHk)T+KkRkKkT=(PkKkHkPk)(IKkHk)T+KkRkKkT=PkKkHkPkPkHkTKkT+KkHkPkHkTKkT+KkRkKkT

协方差矩阵的迹

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 K k T ) + t r ( K k R k 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 K k T ) + t r ( K k R k K k T ) 因为: t r ( A ) = t r ( A T ) ( ( P k − H k T ) K k T ) T = K k H k P k − T P k − 是对称矩阵 P k − = P k − T \begin{aligned} & tr(P_k) &&\\ =& tr({P_k^-}) - tr({K_k}{H_k}{P_k^-}) - tr({P_k^-}{H_k^T}{K_k^T})+ tr({K_k}{H_k}{P_k^-}{H_k^T}{K_k^T}) + tr({K_k}{R_k}{K_k^T})\\ =& tr({P_k^-}) - 2tr({K_k}{H_k}{P_k^-}) + tr({K_k}{H_k}{P_k^-}{H_k^T}{K_k^T}) + tr({K_k}{R_k}{K_k^T})\\ \end{aligned} \begin{aligned} &因为:\\ &tr(A) = tr(A^T)\\ &{(({P_k^-}{H_k^T}){K_k^T})^T}={K_k}{H_k}{{P_k^-}^T}\\ &{P_k^-}是对称矩阵{P_k^-}={{P_k^-}^T} \end{aligned} ==tr(Pk)tr(Pk)tr(KkHkPk)tr(PkHkTKkT)+tr(KkHkPkHkTKkT)+tr(KkRkKkT)tr(Pk)2tr(KkHkPk)+tr(KkHkPkHkTKkT)+tr(KkRkKkT)因为:tr(A)=tr(AT)((PkHkT)KkT)T=KkHkPkTPk是对称矩阵Pk=PkT

K k K_k Kk 的最小值,即 t r ( P k ) tr(P_k) tr(Pk) K k K_k Kk 求导:
d ( t r ( P k ) ) d ( K k ) = 0 − 2 ( H k P k − ) T + 2 K k H k P k − H k T + 2 K k R k 因为: d ( t r ( A B ) ) d ( A ) = B T d ( t r ( A B A T ) ) d ( A ) = 2 A B \begin{aligned} &\frac{d(tr(P_k))}{d(K_k)}=0 - 2({H_k}{{P_k^-}})^T+2{K_k}{H_k}{P_k^-}{H_k^T}+2{K_k}{R_k}&&&\\ \end{aligned} \begin{aligned} 因为:&\\ &\frac{d(tr(AB))}{d(A)}=B^T\\ &\frac{d(tr(AB{A^T}))}{d(A)}=2AB\\ \end{aligned}\\ d(Kk)d(tr(Pk))=02(HkPk)T+2KkHkPkHkT+2KkRk因为:d(A)d(tr(AB))=BTd(A)d(tr(ABAT))=2AB
d ( t r ( P k ) ) d ( K k ) = 0 \frac{d(tr(P_k))}{d(K_k)}=0 d(Kk)d(tr(Pk))=0
− 2 ( H k P k − ) T + 2 K k H k P k − H k T + 2 K k R k = 0 K k H k P k − H k T + K k R k = ( H k P k − ) T K k ( H k P k − H k T + R k ) = P k − T H k T \begin{aligned} -2({H_k}{{P_k^-}})^T+2{K_k}{H_k}{P_k^-}{H_k^T}+2{K_k}{R_k}&=0&&&&&&&&&&\\ {K_k}{H_k}{P_k^-}{H_k^T}+{K_k}{R_k}&=({H_k}{{P_k^-}})^T\\ {K_k}({H_k}{P_k^-}{H_k^T}+{R_k})&={{P_k^-}^T}{H_k^T}\\ \end{aligned} 2(HkPk)T+2KkHkPkHkT+2KkRkKkHkPkHkT+KkRkKk(HkPkHkT+Rk)=0=(HkPk)T=PkTHkT

卡尔曼增益

K k = P k − T H k T H k P k − H k T + R k (6) \tag{6} {K_k}=\frac{{{P_k^-}^T}{H_k^T}}{{H_k}{P_k^-}{H_k^T}+{R_k}}\\ Kk=HkPkHkT+RkPkTHkT(6)

同时:
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 K k T + K k R k 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 + K k R k ) K k T = P k − − K k H k P k − − P k − H k T K k T + P k − H k T K k T = P k − − K k H k P k − = ( I − K k H k ) P k − \begin{aligned} 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}{K_k^T} + {K_k}{R_k}{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} + {K_k}{R_k}){K_k^T}\\ &= {P_k^-} - {K_k}{H_k}{P_k^-} - {P_k^-}{H_k^T}{K_k^T} + {P_k^-}{H_k^T}{K_k^T}\\ &= {P_k^-} - {K_k}{H_k}{P_k^-}\\ &= (I - {K_k}{H_k}){P_k^-}\\ \end{aligned} Pk=PkKkHkPkPkHkTKkT+KkHkPkHkTKkT+KkRkKkT=PkKkHkPkPkHkTKkT+Kk(HkPkHkT+KkRk)KkT=PkKkHkPkPkHkTKkT+PkHkTKkT=PkKkHkPk=(IKkHk)Pk

P k = ( I − K k H k ) P k − (7) \tag{7} P_k = (I - {K_k}{H_k}){P_k^-}\\ Pk=(IKkHk)Pk(7)

至此,公式推导结束。

卡尔曼滤波器的使用

  1. 计算先验估计值
    X ^ k − = A k X ^ k − 1 + B k u k {\mathbf{\hat{X}}_k^-} = {A_k}{\mathbf{\hat{X}}_{k-1}} + {B_k}{u_k} X^k=AkX^k1+Bkuk

  2. 更新先验误差的协方差矩阵
    P k − = A P k − 1 A T + Q k − 1 {P_k^-}= AP_{k-1}A^T+Q_{k-1} Pk=APk1AT+Qk1

  3. 计算Kalman Gain
    K k = P k − T H k T H k P k − H k T + R k {K_k}=\frac{{{P_k^-}^T}{H_k^T}}{{H_k}{P_k^-}{H_k^T}+{R_k}}\\ Kk=HkPkHkT+RkPkTHkT

  4. 计算后验估计
    X ^ k = X ^ k − + K k ( Z k − H k X ^ k − ) {\hat{X}_{k}}={\hat{X}_k^-}+{K_k}(Z_k-{H_{k}}{\hat{X}_k^-}) X^k=X^k+Kk(ZkHkX^k)

  5. 更新误差协方差矩阵

P k = ( I − K k H k ) P k − P_k = (I - {K_k}{H_k}){P_k^-} Pk=(IKkHk)Pk

参考

【1】【卡尔曼滤波器】3_卡尔曼增益超详细数学推导 ~全网最完整_哔哩哔哩_bilibili

【2】通过简单直观的推导理解卡尔曼基础)Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation_tuszhangs的博客-CSDN博客

【3】Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation (Lecture Note | IEEE Journals & Magazine | IEEE Xplore )

【4】轻松理解卡尔曼滤波 - 知乎

【5】How a Kalman filter works, in pictures | Bzarg

【6】kalman滤波理解一:理论框架_还差得远呢的博客-CSDN博客

【7】probability - Is the product of two Gaussian random variables also a Gaussian? - Mathematics Stack Exchange

例子

这是一个基于扩展卡尔曼滤波器的例子
在这里插入图片描述

clear
clc
%初始参数
%状态函数:
[ x_k v_xk y_k v_yk]'
X = [0 10 200 0]';
t = 10;
T = 0.1;
m = 1;
kx = 0.01;
ky = 0.05;
g = -9.8;
Status = [T,g,m,kx,ky];
I = eye(4);

H = zeros(2,4);


% 初始的误差协方差矩阵
P_k1  = zeros(4,4);
% 噪声
Q = zeros(4,4);
Q(2,2) = 5;
Q(4,4) = 5;
R = eye(2);
R(1,1) = 0.0004;
R(2,2) = 3;
P_k1,Q,R
X_real = X;
X_real1 = X;
X_head1 = X;
X_headp = zeros(4,1);
X_head = zeros(4,1);


XY = zeros(t/T,4);
ZZ = zeros(t/T,2);

%生成 A,H 矩阵
A = [1          T               0       0; 
     0   1-2*T/m*kx*X(2)        0       0; 
     0          0               1       T;
     0          0               0   1+2*T/m*ky*X(4)];
H = zeros(2,4);

%迭代计算
rng(10);
for i = 1: t/T
    % 构造真实值
    X_real = CreatRealDatas(X_real1, Status, Q);
    % 构造观测值
    Zk = CreatObserveDatas(X_real, R);
    % 计算先验值
    X_headp = CalculatePriorValue(X_head1, Status);
    % 更新 A H 矩阵
    [A, H] = UpdateAHmatrix(X_head1, Status);
    % 误差协方差矩阵 Pk 的先验值
    Pkp = A*P_k1*A' + Q;
    % 计算 Kalman Gain
    Kk = Pkp*H'*(H*Pkp*H'+ R)^-1;
    % 计算 后验估计
    

    ZZ_a = atan(X_headp(1)/X_headp(3));
    ZZ_r = sqrt(X_headp(1)^2 + X_headp(3)^2);
    abc = [ZZ_a,ZZ_r]';
    

    % X_head = X_headp + Kk*(Zk - H*X_headp);
    X_head = X_headp + Kk*(Zk - abc);
    % 更新误差的协方差矩阵
    Pk = (I - Kk*H)*Pkp;
%数据更新
   
    X_real1 = X_real;
    X_head1 = X_head;
    P_k1 = Pk;
    
    XY(i,:) = X_real;
    Xh(i,:) = X_head;
    ZZ(i,:) = Zk;
end

%绘制图像
figure(1)
hold on
ZZ2 = [ZZ(:,2).*sin(ZZ(:,1)),ZZ(:,2).*cos(ZZ(:,1))];
plot(XY(:,1),XY(:,3),'r');
plot(ZZ2(:,1),ZZ2(:,2),'*');
plot(Xh(:,1),Xh(:,3),'g');

figure(2)
hold on
plot(XY(:,2),'r')
plot(XY(:,4),'b')

函数创建

  1. 构造真实值
function X_real = CreatRealDatas(X_real1, Status, Q)
    X_k1 = X_real1(1); V_xk1 = X_real1(2); Y_k1 = X_real1(3); V_yk1 = X_real1(4);
    T = Status(1); g = Status(2); m = Status(3); kx =Status(4); ky = Status(5);
    
    X_k = X_k1 + T*V_xk1;
    if V_xk1 >= 0
        V_xk = V_xk1 - T/m*kx * V_xk1*V_xk1 + Q(2,2)^0.5*randn(1)*T;
    else
        V_xk = V_xk1 + T/m*kx * V_xk1*V_xk1 + Q(2,2)^0.5*randn(1)*T;
    end
    
    Y_k = Y_k1 + T*V_yk1;
    if V_yk1 >= 0
        V_yk = V_yk1 + T*g - T/m*ky * V_yk1*V_yk1  + Q(4,4)^0.5*randn(1)*T;
    else
        V_yk = V_yk1 + T*g + T/m*ky * V_yk1*V_yk1  + Q(4,4)^0.5*randn(1)*T;
    end
    X_real = [X_k V_xk Y_k V_yk]';
end
  1. 构造观测值
function Zk = CreatObserveDatas(X_real, R)

    X_k = X_real(1); Y_k = X_real(3);
 
    Z_a = atan(X_k/Y_k) + R(1,1)^0.5*randn(1);
    Z_r = sqrt(X_k^2 + Y_k^2) + R(2,2)^0.5*randn(1);
    Zk = [Z_a;Z_r];
end
  1. 计算先验值
function X_headp = CalculatePriorValue(X_head1, Status)

    T = Status(1); g = Status(2); m = Status(3); kx =Status(4); ky = Status(5);
    
    X_k = X_head1(1) + T*X_head1(2);
    if X_head1(2) >= 0
        V_xk = X_head1(2) - T/m*kx * X_head1(2)*X_head1(2);
    else
        V_xk = X_head1(2) + T/m*kx * X_head1(2)*X_head1(2);
    end
    
    Y_k = X_head1(3) + T*X_head1(4);
    if X_head1(4) >= 0
        V_yk = X_head1(4) + T*g - T/m*ky * X_head1(4)*X_head1(4);
    else
        V_yk = X_head1(4) + T*g + T/m*ky * X_head1(4)*X_head1(4);
    end
    X_headp = [X_k V_xk Y_k V_yk]';
end
  1. 更新 A,H 矩阵
function [A, H] = UpdateAHmatrix(X_head1, Status)
    
    T = Status(1); g = Status(2); m = Status(3); kx =Status(4); ky = Status(5);
    
    A = zeros(4);
    
    A(1,1) = 1;
    A(1,2) = T;
    A(2,2) = 1-2*T/m*kx*X_head1(2);
    A(3,3) = 1;
    A(3,4) = T;
    A(4,4) = 1+2*T/m*ky*X_head1(4);
    
    H = zeros(2,4);
    
    H(1,1) = X_head1(3)/(X_head1(1)^2 + X_head1(3)^2);
    H(1,3) = X_head1(1)/(X_head1(1)^2 + X_head1(3)^2);
    H(2,1) = X_head1(1)/sqrt(X_head1(1)^2 + X_head1(3)^2);
    H(2,3) = X_head1(3)/sqrt(X_head1(1)^2 + X_head1(3)^2);
end

结果

红色 为真实值
* 为观测值
绿色 为滤波后的输出值。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值