博主参考严恭敏老师的讲义进行学习卡尔曼滤波,在讲义的基础上加以详细推导与说明。
首先给出随机系统状态空间模型(注意该模型没有给出控制部分):
(1)
{
X
k
=
Φ
k
/
k
−
1
X
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
Z
k
=
H
k
X
k
+
V
k
\tag{1} \begin{cases} X_k = \varPhi_{k/k-1} X_{k-1} + \varGamma_{k/k-1} W_{k-1}\\ Z_k = H_k X_k + V_k \end{cases}
{Xk=Φk/k−1Xk−1+Γk/k−1Wk−1Zk=HkXk+Vk(1)
注意:k/k-1表示从时刻k-1到k时刻的一步转移。
1、k-1时刻
目标:求解k-1时刻真值与状态估计的协方差
真值:
X
k
−
1
X_{k-1}
Xk−1
状态估计:
X
^
k
−
1
\hat X_{k-1}
X^k−1 ,我们求得的状态估计基本不会等于真值,所以我们的状态估计就是最后求得的、可以用的状态;
状态估计误差(为了便于区分,在此用e):
(2)
e
k
−
1
=
X
k
−
1
−
X
^
k
−
1
\tag{2} e_{k-1} = X_{k-1} - \hat X_{k-1} \\
ek−1=Xk−1−X^k−1(2)
真值与k-1时刻状态估计的协方差:
P
k
−
1
P_{k-1}
Pk−1
(3)
P
k
−
1
=
E
[
e
k
−
1
e
k
−
1
T
]
=
E
[
(
X
k
−
1
−
X
^
k
−
1
)
(
X
k
−
1
−
X
^
k
−
1
)
T
]
\tag{3} P_{k-1}=E[e_{k-1} e_{k-1}^T] = E[(X_{k-1} - \hat X_{k-1}) ( X_{k-1} - \hat X_{k-1})^T]
Pk−1=E[ek−1ek−1T]=E[(Xk−1−X^k−1)(Xk−1−X^k−1)T](3)
2、由k-1时刻预测k时刻状态
目标:求解真值与一步预测状态的协方差
对k时刻的状态作预测:
(4)
X
^
k
/
k
−
1
=
Φ
k
/
k
−
1
X
^
k
−
1
\tag{4} \hat X_{k/k-1} = \varPhi_{k/k-1} \hat X_{k-1}
X^k/k−1=Φk/k−1X^k−1(4)
零均值白噪声不会影响预测。另外注意
X
^
k
/
k
−
1
\hat X_{k/k-1}
X^k/k−1还不是最终的系统状态,说白了现在预测的这个状态还是不能用的,必须经过后面的修正得到
X
^
k
\hat X_{k}
X^k才能用,这也是他们下标的区别所在了。
预测误差:
(5)
e
k
/
k
−
1
=
X
k
−
X
^
k
/
k
−
1
\tag{5} e_{k/k-1} = X_k - \hat X_{k/k-1} \\
ek/k−1=Xk−X^k/k−1(5)
真值与一步预测状态的协方差:
P
k
/
k
−
1
P_{k/k-1}
Pk/k−1
(6)
P
k
/
k
−
1
=
E
[
e
k
/
k
−
1
e
k
/
k
−
1
T
]
=
E
[
(
X
k
−
X
^
k
/
k
−
1
)
(
X
k
−
1
−
X
^
k
/
k
−
1
)
T
]
\tag{6} \begin{aligned} P_{k/k-1} &= E[e_{k/k-1} e_{k/k-1}^T] \\ &= E[(X_k - \hat X_{k/k-1}) ( X_{k-1} - \hat X_{k/k-1})^T] \end{aligned}
Pk/k−1=E[ek/k−1ek/k−1T]=E[(Xk−X^k/k−1)(Xk−1−X^k/k−1)T](6)
由公式(1)和公式(4),并结合公式(2)可知:
X
k
−
X
^
k
/
k
−
1
=
Φ
k
/
k
−
1
X
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
−
Φ
k
/
k
−
1
X
^
k
−
1
=
Φ
k
/
k
−
1
e
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
\begin{aligned} X_k - \hat X_{k/k-1} &= \varPhi_{k/k-1} X_{k-1} + \varGamma_{k/k-1} W_{k-1} - \varPhi_{k/k-1} \hat X_{k-1}\\ &= \varPhi_{k/k-1} e_{k-1} + \varGamma_{k/k-1} W_{k-1} \end{aligned}
Xk−X^k/k−1=Φk/k−1Xk−1+Γk/k−1Wk−1−Φk/k−1X^k−1=Φk/k−1ek−1+Γk/k−1Wk−1
注意:是 e k − 1 e_{k-1} ek−1而不是 e k / k − 1 e_{k/k-1} ek/k−1
所以:
(
X
k
−
X
^
k
/
k
−
1
)
(
X
k
−
1
−
X
^
k
/
k
−
1
)
T
=
(
Φ
k
/
k
−
1
e
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
)
(
Φ
k
/
k
−
1
e
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
)
T
=
(
Φ
k
/
k
−
1
e
k
−
1
+
Γ
k
/
k
−
1
W
k
−
1
)
(
e
k
−
1
T
Φ
k
/
k
−
1
T
+
W
k
−
1
T
Γ
k
/
k
−
1
T
)
=
Φ
k
/
k
−
1
e
k
−
1
e
k
−
1
T
Φ
k
/
k
−
1
T
+
Φ
k
/
k
−
1
e
k
−
1
W
k
−
1
T
Γ
k
/
k
−
1
T
+
Γ
k
/
k
−
1
W
k
−
1
e
k
−
1
T
Φ
k
/
k
−
1
T
+
Γ
k
/
k
−
1
W
k
−
1
W
k
−
1
T
Γ
k
/
k
−
1
T
\begin{aligned} (X_k - \hat X_{k/k-1}) ( X_{k-1} -\hat X_{k/k-1})^T &= (\varPhi_{k/k-1} e_{k-1} + \varGamma_{k/k-1} W_{k-1})(\varPhi_{k/k-1} e_{k-1} + \varGamma_{k/k-1} W_{k-1})^T\\ &= (\varPhi_{k/k-1} e_{k-1} + \varGamma_{k/k-1} W_{k-1}) (e_{k-1}^T \varPhi_{k/k-1}^T + W_{k-1}^T \varGamma_{k/k-1}^T)\\ &= \varPhi_{k/k-1} e_{k-1} e_{k-1}^T \varPhi_{k/k-1}^T + \varPhi_{k/k-1} e_{k-1} W_{k-1}^T \varGamma_{k/k-1}^T \\ &+ \varGamma_{k/k-1} W_{k-1}e_{k-1}^T \varPhi_{k/k-1}^T + \varGamma_{k/k-1} W_{k-1}W_{k-1}^T \varGamma_{k/k-1}^T \end{aligned}
(Xk−X^k/k−1)(Xk−1−X^k/k−1)T=(Φk/k−1ek−1+Γk/k−1Wk−1)(Φk/k−1ek−1+Γk/k−1Wk−1)T=(Φk/k−1ek−1+Γk/k−1Wk−1)(ek−1TΦk/k−1T+Wk−1TΓk/k−1T)=Φk/k−1ek−1ek−1TΦk/k−1T+Φk/k−1ek−1Wk−1TΓk/k−1T+Γk/k−1Wk−1ek−1TΦk/k−1T+Γk/k−1Wk−1Wk−1TΓk/k−1T
偷偷地把下标去掉再看一看:
( X k − X ^ k / k − 1 ) ( X k − 1 − X ^ k / k − 1 ) T = ( Φ e + Γ W ) ( Φ e + Γ W ) T = ( Φ e + Γ W ) ( e T Φ T + W T Γ T ) = Φ e e T Φ T + Φ e W T Γ T + Γ W e T Φ T + Γ W W T Γ T \begin{aligned} (X_k - \hat X_{k/k-1}) ( X_{k-1} -\hat X_{k/k-1})^T &= (\varPhi e + \varGamma W)(\varPhi e + \varGamma W)^T\\ &= (\varPhi e + \varGamma W)(e^T \varPhi^T + W^T \varGamma^T )\\ &= \varPhi e e^T \varPhi^T + \varPhi e W^T \varGamma^T + \varGamma W e^T \varPhi^T + \varGamma W W^T \varGamma^T \end{aligned} (Xk−X^k/k−1)(Xk−1−X^k/k−1)T=(Φe+ΓW)(Φe+ΓW)T=(Φe+ΓW)(eTΦT+WTΓT)=ΦeeTΦT+ΦeWTΓT+ΓWeTΦT+ΓWWTΓT
再考虑公式(3),并设噪声W的协方差阵为Q,这样公式(6)便有:
(7)
P
k
/
k
−
1
=
Φ
k
/
k
−
1
E
[
e
k
−
1
e
k
−
1
T
]
Φ
k
/
k
−
1
T
+
Γ
k
/
k
−
1
E
[
W
k
−
1
W
k
−
1
T
]
Γ
k
/
k
−
1
T
=
Φ
k
/
k
−
1
P
k
−
1
Φ
k
/
k
−
1
T
+
Γ
k
/
k
−
1
Q
k
−
1
Γ
k
/
k
−
1
T
\tag{7} \begin{aligned} P_{k/k-1} &= \varPhi_{k/k-1} E[e_{k-1} e_{k-1}^T] \varPhi_{k/k-1}^T + \varGamma_{k/k-1} E[W_{k-1} W_{k-1}^T] \varGamma_{k/k-1}^T\\ &= \varPhi_{k/k-1} P_{k-1} \varPhi_{k/k-1}^T + \varGamma_{k/k-1} Q_{k-1} \varGamma_{k/k-1}^T\\ \end{aligned}
Pk/k−1=Φk/k−1E[ek−1ek−1T]Φk/k−1T+Γk/k−1E[Wk−1Wk−1T]Γk/k−1T=Φk/k−1Pk−1Φk/k−1T+Γk/k−1Qk−1Γk/k−1T(7)
注意:不相关的量期望为0
3、量测方程修正状态估计
目标:建立状态修正方程
利用公式(1)-2中的量测方程k-1时刻预测k时刻的量测向量:
(8)
Z
^
k
/
k
−
1
=
H
k
X
^
k
/
k
−
1
\tag{8} \hat Z_{k/k-1} = H_k \hat X_{k/k-1}
Z^k/k−1=HkX^k/k−1(8)
相对于量测值,预测有误差:
(9)
Z
~
k
/
k
−
1
=
Z
k
−
Z
^
k
/
k
−
1
\tag{9} \tilde Z_{k/k-1} = Z_k - \hat Z_{k/k-1}
Z~k/k−1=Zk−Z^k/k−1(9)
构造:
X
^
k
=
X
^
k
/
k
−
1
+
K
k
Z
~
k
/
k
−
1
\hat X_k=\hat X_{k/k-1} + K_k \tilde Z_{k/k-1}
X^k=X^k/k−1+KkZ~k/k−1
注意: Z ~ k / k − 1 \tilde Z_{k/k-1} Z~k/k−1是误差
将公式(9)代入上式,并结合公式(4)和公式(8)可得状态修正方程:
(10)
X
^
k
=
X
^
k
/
k
−
1
+
K
k
(
Z
k
−
Z
^
k
/
k
−
1
)
=
X
^
k
/
k
−
1
+
K
k
(
Z
k
−
H
k
X
^
k
/
k
−
1
)
=
(
I
−
K
k
H
k
)
X
^
k
/
k
−
1
+
K
k
Z
k
=
(
I
−
K
k
H
k
)
Φ
k
/
k
−
1
X
^
k
−
1
+
K
k
Z
k
\tag{10} \begin{aligned} \hat X_k &= \hat X_{k/k-1} + K_k (Z_k - \hat Z_{k/k-1}) \\ &= \hat X_{k/k-1} + K_k (Z_k - H_k \hat X_{k/k-1}) \\ &= (I - K_k H_k)\hat X_{k/k-1} + K_k Z_k \\ &= (I - K_k H_k)\varPhi_{k/k-1} \hat X_{k-1} + K_k Z_k \\ \end{aligned}
X^k=X^k/k−1+Kk(Zk−Z^k/k−1)=X^k/k−1+Kk(Zk−HkX^k/k−1)=(I−KkHk)X^k/k−1+KkZk=(I−KkHk)Φk/k−1X^k−1+KkZk(10)
4、k时刻
目标:求解k时刻真值与状态估计的协方差
状态方程k时刻的状态误差为:
e
k
=
X
k
−
X
^
k
e_k = X_k - \hat X_k
ek=Xk−X^k
将公式(10)第二个等号之后项代入上式并结合公式(5)和公式(1)-2可得:
(11)
e
k
=
X
k
−
[
X
^
k
/
k
−
1
+
K
k
(
Z
k
−
H
k
X
^
k
/
k
−
1
)
]
=
e
k
/
k
−
1
−
K
k
[
Z
k
−
H
k
X
^
k
/
k
−
1
]
=
e
k
/
k
−
1
−
K
k
(
H
k
X
k
+
V
k
−
H
k
X
^
k
/
k
−
1
)
=
e
k
/
k
−
1
−
K
k
[
(
H
k
X
k
−
H
k
X
^
k
/
k
−
1
)
+
V
k
]
=
e
k
/
k
−
1
−
K
k
H
k
e
k
/
k
−
1
−
K
k
V
k
=
(
I
−
K
k
H
k
)
e
k
/
k
−
1
−
K
k
V
k
\tag{11} \begin{aligned} e_k &= X_k - [\hat X_{k/k-1} + K_k (Z_k - H_k \hat X_{k/k-1})]\\ &= e_{k/k-1} - K_k[Z_k - H_k \hat X_{k/k-1}]\\ &= e_{k/k-1} - K_k(H_k X_k + V_k - H_k \hat X_{k/k-1})\\ &= e_{k/k-1} - K_k[(H_k X_k - H_k \hat X_{k/k-1}) + V_k ]\\ &= e_{k/k-1} - K_kH_k e_{k/k-1} - K_k V_k \\ &= (I - K_kH_k) e_{k/k-1} - K_k V_k \\ \end{aligned}
ek=Xk−[X^k/k−1+Kk(Zk−HkX^k/k−1)]=ek/k−1−Kk[Zk−HkX^k/k−1]=ek/k−1−Kk(HkXk+Vk−HkX^k/k−1)=ek/k−1−Kk[(HkXk−HkX^k/k−1)+Vk]=ek/k−1−KkHkek/k−1−KkVk=(I−KkHk)ek/k−1−KkVk(11)
结合公式(6)并设噪声V的协方差阵为R,k时刻真值与状态估计的协方差阵为:
(12)
P
k
=
E
[
e
k
e
k
T
]
=
E
{
[
(
I
−
K
k
H
k
)
e
k
/
k
−
1
−
K
k
V
k
]
[
(
I
−
K
k
H
k
)
e
k
/
k
−
1
−
K
k
V
k
]
T
}
=
(
I
−
K
k
H
k
)
E
[
e
k
/
k
−
1
e
k
/
k
−
1
T
]
(
I
−
K
k
H
k
)
T
+
K
k
E
[
V
k
V
k
T
]
K
k
T
=
(
I
−
K
k
H
k
)
P
k
/
k
−
1
(
I
−
K
k
H
k
)
T
+
K
k
R
k
K
k
T
\tag{12} \begin{aligned} P_k &= E[e_{k}e_{k}^T]\\ &= E \lbrace{ [(I - K_kH_k) e_{k/k-1} - K_k V_k] [(I - K_kH_k) e_{k/k-1} - K_k V_k]^T \rbrace}\\ &= (I - K_kH_k) E[e_{k/k-1} e_{k/k-1}^T] (I - K_kH_k)^T + K_k E[V_k V_k^T] K_k^T\\ &= (I - K_kH_k) P_{k/k-1} (I - K_kH_k)^T + K_k R_k K_k^T\\ \end{aligned}
Pk=E[ekekT]=E{[(I−KkHk)ek/k−1−KkVk][(I−KkHk)ek/k−1−KkVk]T}=(I−KkHk)E[ek/k−1ek/k−1T](I−KkHk)T+KkE[VkVkT]KkT=(I−KkHk)Pk/k−1(I−KkHk)T+KkRkKkT(12)
5、增益矩阵 K k K_k Kk
目标:求解增益矩阵 K k K_k Kk
将公式(12)展开为:
(13)
P
k
=
(
I
−
K
k
H
k
)
P
k
/
k
−
1
(
I
−
K
k
H
k
)
T
+
K
k
R
k
K
k
T
=
P
k
/
k
−
1
−
K
k
H
k
P
k
/
k
−
1
−
(
K
k
H
k
P
k
/
k
−
1
)
T
+
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
K
k
T
\tag{13} \begin{aligned} P_k &= (I - K_k H_k) P_{k/k-1} (I - K_k H_k)^T + K_k R_k K_k^T\\ &= P_{k/k-1}- K_k H_k P_{k/k-1} - (K_k H_k P_{k/k-1})^T \\ &+ K_k(H_k P_{k/k-1} H_k^T + R_k)K_k^T \end{aligned}
Pk=(I−KkHk)Pk/k−1(I−KkHk)T+KkRkKkT=Pk/k−1−KkHkPk/k−1−(KkHkPk/k−1)T+Kk(HkPk/k−1HkT+Rk)KkT(13)
两边求迹运算:
t
r
(
P
k
)
=
t
r
(
P
k
/
k
−
1
)
−
t
r
(
K
k
H
k
P
k
/
k
−
1
)
−
t
r
(
(
K
k
H
k
P
k
/
k
−
1
)
T
)
+
t
r
(
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
K
k
T
)
tr(P_k )=tr(P_{k/k-1})-tr(K_k H_k P_{k/k-1})-tr((K_k H_k P_{k/k-1})^T)+tr(K_k(H_k P_{k/k-1} H_k^T + R_k)K_k^T)
tr(Pk)=tr(Pk/k−1)−tr(KkHkPk/k−1)−tr((KkHkPk/k−1)T)+tr(Kk(HkPk/k−1HkT+Rk)KkT)
将上式看作关于K的一元二次函数,求极小值:
d
d
K
k
[
t
r
(
P
k
)
]
=
0
−
(
H
k
P
k
/
k
−
1
)
T
−
(
H
k
P
k
/
k
−
1
)
T
+
2
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
=
2
[
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
−
P
k
/
k
−
1
H
k
T
]
=
0
\begin{aligned} \frac d {dK_k} [tr(P_k)] &= 0-(H_k P_{k/k-1})^T-(H_k P_{k/k-1})^T+2K_k(H_k P_{k/k-1} H_k^T + R_k)\\ &= 2[K_k(H_k P_{k/k-1} H_k^T + R_k)-P_{k/k-1} H_k^T]\\ &= 0 \end{aligned}
dKkd[tr(Pk)]=0−(HkPk/k−1)T−(HkPk/k−1)T+2Kk(HkPk/k−1HkT+Rk)=2[Kk(HkPk/k−1HkT+Rk)−Pk/k−1HkT]=0
所以:
P
k
/
k
−
1
H
k
T
=
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
P_{k/k-1} H_k^T = K_k(H_k P_{k/k-1} H_k^T + R_k)
Pk/k−1HkT=Kk(HkPk/k−1HkT+Rk)
增益矩阵即为:
(14)
K
k
=
P
k
/
k
−
1
H
k
T
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
−
1
\tag{14} K_k = P_{k/k-1} H_k^T(H_k P_{k/k-1} H_k^T + R_k)^{-1}
Kk=Pk/k−1HkT(HkPk/k−1HkT+Rk)−1(14)
6、总结
目标:汇总卡尔曼滤波计算公式
将公式(14)代入公式(13)可得:
P
k
=
P
k
/
k
−
1
−
K
k
H
k
P
k
/
k
−
1
−
(
K
k
H
k
P
k
/
k
−
1
)
T
+
K
k
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
K
k
T
=
P
k
/
k
−
1
−
K
k
H
k
P
k
/
k
−
1
−
P
k
/
k
−
1
T
H
k
T
K
k
T
+
P
k
/
k
−
1
H
k
T
K
k
T
=
P
k
/
k
−
1
−
K
k
H
k
P
k
/
k
−
1
=
(
I
−
K
k
H
k
)
P
k
/
k
−
1
\begin{aligned} P_k &= P_{k/k-1}- K_k H_k P_{k/k-1} - (K_k H_k P_{k/k-1})^T \\ &+ K_k(H_k P_{k/k-1} H_k^T + R_k)K_k^T \\ &= P_{k/k-1} - K_k H_k P_{k/k-1} - P_{k/k-1}^T H_k^T K_k^T + P_{k/k-1} H_k^T K_k^T \\ &= P_{k/k-1} - K_k H_k P_{k/k-1} \\ &= (I - K_k H_k ) P_{k/k-1} \end{aligned}
Pk=Pk/k−1−KkHkPk/k−1−(KkHkPk/k−1)T+Kk(HkPk/k−1HkT+Rk)KkT=Pk/k−1−KkHkPk/k−1−Pk/k−1THkTKkT+Pk/k−1HkTKkT=Pk/k−1−KkHkPk/k−1=(I−KkHk)Pk/k−1
注: P k / k − 1 T P_{k/k-1}^T Pk/k−1T= P k / k − 1 P_{k/k-1} Pk/k−1
综上所述,卡尔曼滤波计算公式:
①状态一步预测:
X
^
k
/
k
−
1
=
Φ
k
/
k
−
1
X
^
k
−
1
\hat X_{k/k-1} = \varPhi_{k/k-1} \hat X_{k-1}
X^k/k−1=Φk/k−1X^k−1
②状态一步预测协方差阵:
P
k
/
k
−
1
=
Φ
k
/
k
−
1
P
k
−
1
Φ
k
/
k
−
1
T
+
Γ
k
/
k
−
1
Q
k
−
1
Γ
k
/
k
−
1
T
P_{k/k-1} = \varPhi_{k/k-1} P_{k-1} \varPhi_{k/k-1}^T + \varGamma_{k/k-1} Q_{k-1} \varGamma_{k/k-1}^T
Pk/k−1=Φk/k−1Pk−1Φk/k−1T+Γk/k−1Qk−1Γk/k−1T
③增益矩阵:
K
k
=
P
k
/
k
−
1
H
k
T
(
H
k
P
k
/
k
−
1
H
k
T
+
R
k
)
−
1
K_k = P_{k/k-1} H_k^T(H_k P_{k/k-1} H_k^T + R_k)^{-1}
Kk=Pk/k−1HkT(HkPk/k−1HkT+Rk)−1
④状态估计:
X
^
k
=
X
^
k
/
k
−
1
+
K
k
(
Z
k
−
H
k
X
^
k
/
k
−
1
)
\hat X_k = \hat X_{k/k-1} + K_k (Z_k - H_k \hat X_{k/k-1}) \\
X^k=X^k/k−1+Kk(Zk−HkX^k/k−1)
⑤状态估计协方差阵:
P
k
=
(
I
−
K
k
H
k
)
P
k
/
k
−
1
P_k = (I - K_k H_k ) P_{k/k-1}
Pk=(I−KkHk)Pk/k−1
7、示例
Z = (1:100);
noise = randn(1, 100);
Z = Z +noise;
X = [0; 0]; %状态
P = [1 0; 0 1]; %状态协方差矩阵
F = [1 1; 0 1]; %状态转移矩阵
Q = [0.0001 0; 0 0.0001]; %状态转移协方差矩阵
H = [1 0]; %观测矩阵
R = 1;
figure;
hold on;
for i = 1:100
X_ = F*X;
P_ = F*P*F' + Q;
K = P_*H'/(H*P_*H' + R);
X = X_ + K*( Z(i) - H*X );
P = ( eye(2) - K*H ) * P_;
plot(X(1), X(2), '.'); %横轴表示位置,纵轴表示速度
end
资源:一个轻松理解卡尔曼滤波的教学视频
卡尔曼滤波的原理以及在MATLAB中的实现-资源汇总页中下载