本教程来源于bibili up主DR_CAN的笔记整理,建议读者配合视频食用,视频链接如下:
【卡尔曼滤波器】1_递归算法_Recursive Processing_哔哩哔哩_bilibili
在此非常感谢DR_CAN老师精彩讲解,在此表示崇高的敬意。
1 卡尔曼滤波介绍
卡尔曼滤波算法实际是一个观测器,可以用来估计下一个状态,具有非常好的实时性。
其公式为:
假定我们要对一个未知长度的物体进行测量,每次的测量值为 Z k Z_k Zk,取前 k k k次的平均值作为当前的估计值(最优估计),则可得到以下公式:
x
k
^
=
Z
1
+
Z
2
+
.
.
.
.
+
Z
k
k
=
1
k
(
Z
1
+
Z
2
+
.
.
.
.
+
Z
k
−
1
+
1
k
Z
k
=
1
k
k
−
1
k
−
1
(
z
1
+
z
2
+
.
.
.
.
+
z
k
−
1
)
+
1
k
z
k
=
k
−
1
k
x
k
−
1
^
+
1
k
z
k
=
x
k
−
1
^
−
1
k
x
k
−
1
^
+
1
k
z
k
\begin{aligned} \hat{x_k}&=\frac{Z_1+Z_2+....+Z_k}{k}\\ &=\frac{1}{k}(Z_1+Z_2+....+Z_{k-1}+\frac{1}{k}Z_k\\ &=\frac{1}{k}\frac{k-1}{k-1}(z_1+z_2+....+z_{k-1})+\frac{1}{k}z_k\\ &=\frac{k-1}{k}\hat{x_{k-1}}+\frac{1}{k}z_k\\ &=\hat{x_{k-1}}-\frac{1}{k}\hat{x_{k-1}}+\frac{1}{k}z_k \end{aligned}
xk^=kZ1+Z2+....+Zk=k1(Z1+Z2+....+Zk−1+k1Zk=k1k−1k−1(z1+z2+....+zk−1)+k1zk=kk−1xk−1^+k1zk=xk−1^−k1xk−1^+k1zk
整理之后可以得到:
x
k
^
=
x
k
−
1
^
+
K
k
(
Z
k
−
x
k
−
1
^
)
(1.1)
\hat{x_k}=\hat{x_{k-1}}+K_k(Z_k-\hat{x_{k-1}})\tag{1.1}
xk^=xk−1^+Kk(Zk−xk−1^)(1.1)
其中
K
k
=
1
k
K_k=\frac{1}{k}
Kk=k1(仅在本示例中等号成立),被称作卡尔曼增益(卡尔曼系数),随着测量次数
k
k
k的增加可以看到
x
k
^
→
x
k
−
1
^
\hat{x_k}\to{\hat{x_{k-1}}}
xk^→xk−1^,即随着测量次数增加,每次的测量值对最后的最优估计值起作用的效果越来越低,符合基本常识。
在广义的卡尔曼滤波中,卡尔曼增益 K k K_k Kk的值应被如下定义:
K k = e E S T k − 1 e E S T k − 1 − e M E A k (1.2) K_k=\frac{e_{EST_{k-1}}}{e_{EST_{k-1}}-e_{MEA_k}}\tag{1.2} Kk=eESTk−1−eMEAkeESTk−1(1.2)
式中: e E S T k − 1 e_{EST_{k-1}} eESTk−1为上一次的估计误差, e M E A k e_{MEA_{k}} eMEAk为当前的测量误差。
可以对式1.2做一个分析,
{
当
e
E
S
T
k
−
1
≫
e
M
E
A
k
时
K
k
→
1
x
k
^
=
x
k
−
1
^
+
Z
k
−
x
k
−
1
^
=
z
k
①
当
e
E
S
T
k
−
1
≪
e
M
E
A
k
时
K
k
→
0
x
k
^
=
x
k
−
1
^
②
\begin{cases} & \text{ 当 } e_{EST_{k-1}}\gg e_{MEA_{k}}\text{时} &K_k\to1 & \hat{x_k}=\hat{x_{k-1}}+Z_k-\hat{x_{k-1}}=z_k &①\\ & \text{ 当 } e_{EST_{k-1}}\ll e_{MEA_{k}}\text{时} &K_k\to0 &\hat{x_k}=\hat{x_{k-1}} &② \end{cases}
{ 当 eESTk−1≫eMEAk时 当 eESTk−1≪eMEAk时Kk→1Kk→0xk^=xk−1^+Zk−xk−1^=zkxk^=xk−1^①②
①式表明,当前一次(或前几次)的估计误差远大于当前测量误差时候,则其最优估计以当前测量值为准;
②式表明,当前一次(或前几次)的估计误差远小于当前测量误差时候,则其最优估计以前一次(或前几次)的估计值为准。
2 卡尔曼滤波计算过程
step1:计算卡尔曼增益 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=eESTk−1−eMEAkeESTk−1
step2:计算当前最优估计 x k ^ = x k − 1 ^ + K k ( Z k − x k − 1 ^ ) \hat{x_k}=\hat{x_{k-1}}+K_k(Z_k-\hat{x_{k-1}}) xk^=xk−1^+Kk(Zk−xk−1^)
step3:更新当前估计误差 e E S T k e_{EST_k} eESTk, e E S T k = ( 1 − K k ) × e E S T k − 1 e_{EST_k}=(1-K_k)\times e_{EST_{k-1}} eESTk=(1−Kk)×eESTk−1,(后面会进行详细推导这个公式)
例如,对一个实际长度 x = 50 m m x=50mm x=50mm(此长度认为是真实长度,是未知的)的物体进行测量,第一次测量的测量值 Z 1 = 51 m m Z_1=51mm Z1=51mm,第0次的最优估计为 x 0 ^ = 40 m m \hat{x_0}=40mm x0^=40mm,第0次的估计误差为 5 m m 5mm 5mm,测量误差为常值 e M E A 1 = 3 m m e_{MEA_1}=3mm eMEA1=3mm。则第一次迭代可得:
k = 1 K k = e E S T 0 e E S T 0 + e M E A 1 = 5 5 + 3 = 0.625 x k ^ = 40 + 0.625 × ( 51 − 40 ) = 46.875 e E S T k = ( 1 − 0.625 ) × 5 = 1.875 \begin{aligned} k=1\qquad K_k&=\frac{e_{EST_0}}{e_{EST_0}+e_{MEA_1}}=\frac{5}{5+3}=0.625\\ \hat{x_k}&=40+0.625\times(51-40)=46.875\\ e_{EST_k}&=(1-0.625)\times5=1.875 \end{aligned} k=1Kkxk^eESTk=eEST0+eMEA1eEST0=5+35=0.625=40+0.625×(51−40)=46.875=(1−0.625)×5=1.875
第二次迭代可得:
k
=
2
K
k
=
e
E
S
T
1
e
E
S
T
1
+
e
M
E
A
2
=
1.875
1.875
+
3
=
0.3846
x
k
^
=
46.875
+
0.3846
×
(
48
−
46.875
)
=
47.308
e
E
S
T
k
=
(
1
−
0.3846
)
×
1.875
=
1.154
\begin{aligned} k=2\qquad K_k&=\frac{e_{EST_1}}{e_{EST_1}+e_{MEA_2}}=\frac{1.875}{1.875+3}=0.3846\\ \hat{x_k}&=46.875+0.3846\times(48-46.875)=47.308\\ e_{EST_k}&=(1-0.3846)\times1.875=1.154 \end{aligned}
k=2Kkxk^eESTk=eEST1+eMEA2eEST1=1.875+31.875=0.3846=46.875+0.3846×(48−46.875)=47.308=(1−0.3846)×1.875=1.154
多次测量,可得到如下表格:
可以看到 k < 16 k<16 k<16时候,随着测量次数增大,最优估计 x k ^ \hat{x_k} xk^趋近于真实值50,但当实际测量值增大时(真实值也增大),此时最优估计值无法跟踪,当增大的测量值趋于稳定后(真实值趋于稳定)此时重新设置 x 22 ^ = 86 \hat{x_{22}}=86 x22^=86后,后续的卡尔曼滤波才可以趋于稳定,继续跟踪,这是因为,目前只涉及到卡尔曼滤波的的第一个方程,状态改变的情况暂时未考虑进内,所以呈现目前这种趋势。
3 前期知识准备
3.1 数据融合
举例:假设用两个不同的称来称一个的物体质量。测得其测量值为:
Z
1
=
30
g
σ
1
=
2
g
Z
2
=
32
g
σ
2
=
4
g
\begin{aligned} Z_1&=30g \qquad \sigma1=2g\\ Z_2&=32g \qquad \sigma2=4g\\ \end{aligned}
Z1Z2=30gσ1=2g=32gσ2=4g
其中
σ
\sigma
σ为标准差(standard Deviatim),则其测量值满足正态分布。接下来用这两组数据估计真实值
Z
^
\hat{Z}
Z^。
利用第2节的卡尔曼滤波公式不难求得: Z ^ = Z 1 + K ( Z 2 − Z 1 ) \hat{Z}=Z_1+K(Z_2-Z_1) Z^=Z1+K(Z2−Z1)。
K ∈ [ 0 , 1 ] K = 0 , Z ^ = Z 1 K = 1 , Z ^ = Z 2 \begin{aligned} K\in[0,1] \qquad K&=0,\hat{Z}=Z_1\\ K&=1,\hat{Z}=Z_2 \end{aligned} K∈[0,1]KK=0,Z^=Z1=1,Z^=Z2
若得到最优估计,则要使得
Z
^
\hat{Z}
Z^的标准差最小,或者说
Z
^
\hat{Z}
Z^的方差(Var)最小,则可得出
Z
^
\hat{Z}
Z^的方差为:
σ
z
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
V
a
r
(
Z
1
)
+
K
2
V
a
r
(
Z
2
)
=
(
1
−
K
)
2
σ
1
2
+
K
2
σ
2
2
\begin{aligned} \sigma^2_z&=Var(Z_1+K(Z_2-Z_1)\\&=Var[(1-K)Z_1]+Var(KZ_2)\\&=(1-K)^2Var(Z_1)+K^2Var(Z_2)\\ &=(1-K)^2\sigma^2_1+K^2\sigma^2_2 \end{aligned}
σz2=Var(Z1+K(Z2−Z1)=Var[(1−K)Z1]+Var(KZ2)=(1−K)2Var(Z1)+K2Var(Z2)=(1−K)2σ12+K2σ22
上式对K求导可得:
d
σ
z
2
d
K
=
−
2
(
1
−
K
)
σ
1
2
+
2
K
σ
2
2
=
0
K
=
σ
1
2
σ
1
2
+
σ
2
2
\frac{\mathrm{d} \sigma^2_z}{\mathrm{d} K} = -2(1-K)\sigma^2_1+2K\sigma_2^2=0\qquad K=\frac{\sigma_1^2}{\sigma_1^2+\sigma^2_2}
dKdσz2=−2(1−K)σ12+2Kσ22=0K=σ12+σ22σ12
带入可得到
K
=
0.2
K=0.2
K=0.2,
σ
z
2
=
3.2
\sigma_z^2=3.2
σz2=3.2,
σ
z
=
1.79
\sigma_z=1.79
σz=1.79,
Z
^
=
30.4
\hat{Z}=30.4
Z^=30.4。在最小方差的基础上我们得到了最优估计为30.4mm。表示在下图,蓝线表示
Z
1
Z_1
Z1的正态分布,红线表示
Z
2
Z_2
Z2的正态分布。黑线表示
Z
^
\hat{Z}
Z^的正态分布,可以看到方差/标准差明显减小。
3.2 协方差矩阵
3.2.1 简要介绍
方差、协方差表示的是变量之间的联动关系。
举例:计算球员身高、体重、年龄的方差和协方差。
球员 | 身高(x) | 体重(y) | 年龄(z) |
---|---|---|---|
瓦尔迪 | 179 | 74 | 33 |
奥巴梅杨 | 187 | 80 | 31 |
萨拉赫 | 175 | 71 | 28 |
平均值 | 180.3 | 75 | 30.7 |
则方差为:
σ
x
2
=
1
3
[
(
179
−
180.3
)
2
+
(
187
−
180.3
)
2
+
(
175
−
180.3
)
2
=
24.89
σ
y
2
=
14
σ
z
2
=
4.22
\begin{aligned} \sigma_x^2&=\frac{1}{3}[(179-180.3)^2+(187-180.3)^2+(175-180.3)^2=24.89\\ \sigma_y^2&=14\\ \sigma_z^2&=4.22 \end{aligned}
σx2σy2σz2=31[(179−180.3)2+(187−180.3)2+(175−180.3)2=24.89=14=4.22
协方差为:
σ
x
σ
y
=
1
3
[
(
179
−
180.3
)
(
74
−
75
)
+
(
187
−
180.3
)
(
80
−
75
)
+
(
175
−
180.3
)
(
71
−
75
)
]
=
18.7
=
σ
y
σ
x
σ
x
σ
z
=
4.4
=
σ
z
σ
x
σ
y
σ
z
=
3.3
=
σ
z
σ
y
\begin{aligned} \sigma_x\sigma_y&=\frac{1}{3}[(179-180.3)(74-75)+(187-180.3)(80-75)+(175-180.3)(71-75)]=18.7=\sigma_y\sigma_x\\ \sigma_x\sigma_z&=4.4=\sigma_z\sigma_x\\ \sigma_y\sigma_z&=3.3=\sigma_z\sigma_y \end{aligned}
σxσyσxσzσyσz=31[(179−180.3)(74−75)+(187−180.3)(80−75)+(175−180.3)(71−75)]=18.7=σyσx=4.4=σzσx=3.3=σzσy
协方差表示的是两个元素的相关性,如果数值越大,说明两个变量相关性越大。
上述协方差矩阵可以表示为:
P
=
[
σ
x
2
σ
x
σ
y
σ
x
σ
z
σ
y
σ
x
σ
y
2
σ
y
σ
z
σ
z
σ
x
σ
z
σ
y
σ
z
2
]
=
[
24.89
18.7
4.4
18.7
14
3.3
4.4
3.3
4.22
]
P= \begin{bmatrix} \sigma_x^2&\sigma_x\sigma_y&\sigma_x\sigma_z\\ \sigma_y\sigma_x&\sigma_y^2&\sigma_y\sigma_z\\ \sigma_z\sigma_x&\sigma_z\sigma_y&\sigma_z^2\\ \end{bmatrix}= \begin{bmatrix} 24.89&18.7&4.4\\ 18.7&14&3.3\\ 4.4&3.3&4.22\\ \end{bmatrix}
P=⎣⎡σx2σyσxσzσxσxσyσy2σzσyσxσzσyσzσz2⎦⎤=⎣⎡24.8918.74.418.7143.34.43.34.22⎦⎤
3.2.2 期望,方差、协方差重要公式
数学期望的标准定义为:
E
(
x
)
=
∫
−
∞
+
∞
x
f
(
x
)
d
x
E(x)=\int_{-\infty}^{+\infty}xf(x)dx
E(x)=∫−∞+∞xf(x)dx
其中
f
(
x
)
f(x)
f(x)称作是x的概率密度。
数学期望的性质:
①如果C是常数,则有 E ( C ) = C E(C)=C E(C)=C。
②设X为随机变量,C是常数,则 E ( C X ) = C E ( X ) E(CX)=CE(X) E(CX)=CE(X)。
③设X,Y为两个随机变量,则有 E ( X + Y ) = E ( X ) + E ( Y ) E(X+Y)=E(X)+E(Y) E(X+Y)=E(X)+E(Y)。
④设X,Y为两个相互独立的随机变量,则有 E ( X Y ) = E ( X ) E ( Y ) E(XY)=E(X)E(Y) E(XY)=E(X)E(Y)。第④条性质用数学期望的定义来证明。
方差D(X)或者叫做Var(X)的标准定义为:
D
(
X
)
=
E
{
[
X
−
E
(
X
)
]
2
}
=
E
[
X
2
−
2
X
E
(
X
)
+
E
2
(
X
)
]
=
E
(
X
2
)
−
2
E
(
X
)
E
(
X
)
+
E
2
(
X
)
=
E
(
X
2
)
−
E
2
(
X
)
\begin{aligned} D(X)&=E\left \{[X-E(X)]^2\right\}\\ &=E[X^2-2XE(X)+E^2(X)]\\ &=E(X^2)-2E(X)E(X)+E^2(X)\\ &=E(X^2)-E^2(X) \end{aligned}
D(X)=E{[X−E(X)]2}=E[X2−2XE(X)+E2(X)]=E(X2)−2E(X)E(X)+E2(X)=E(X2)−E2(X)
协方差的标准定义为:
C
o
v
(
X
,
Y
)
=
E
{
[
X
−
E
(
X
)
]
[
Y
−
E
(
Y
)
]
}
=
E
[
X
Y
−
X
E
(
Y
)
−
Y
E
(
X
)
+
E
(
X
)
E
(
Y
)
]
=
E
(
X
Y
)
−
E
(
X
)
E
(
Y
)
−
E
(
X
)
E
(
Y
)
+
E
(
X
)
E
(
Y
)
=
E
(
X
Y
)
−
E
(
X
)
E
(
Y
)
\begin{aligned} Cov(X,Y)&=E\left\{[X-E(X)][Y-E(Y)]\right\}\\ &=E[XY-XE(Y)-YE(X)+E(X)E(Y)]\\ &=E(XY)-E(X)E(Y)-E(X)E(Y)+E(X)E(Y)\\ &=E(XY)-E(X)E(Y) \end{aligned}
Cov(X,Y)=E{[X−E(X)][Y−E(Y)]}=E[XY−XE(Y)−YE(X)+E(X)E(Y)]=E(XY)−E(X)E(Y)−E(X)E(Y)+E(X)E(Y)=E(XY)−E(X)E(Y)
3.2.3 通过矩阵运算计算协方差
首先求出过渡矩阵:
a
=
[
x
1
y
1
z
1
x
2
y
2
z
2
x
3
y
3
z
3
]
−
1
3
[
1
1
1
1
1
1
1
1
1
]
[
x
1
y
1
z
1
x
2
y
2
z
2
x
3
y
3
z
3
]
a= \begin{bmatrix} x_1&y_1&z_1\\ x_2&y_2&z_2\\ x_3&y_3&z_3\\ \end{bmatrix} -\frac{1}{3} \begin{bmatrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{bmatrix} \begin{bmatrix} x_1&y_1&z_1\\ x_2&y_2&z_2\\ x_3&y_3&z_3\\ \end{bmatrix}
a=⎣⎡x1x2x3y1y2y3z1z2z3⎦⎤−31⎣⎡111111111⎦⎤⎣⎡x1x2x3y1y2y3z1z2z3⎦⎤
其中
1
3
[
1
1
1
1
1
1
1
1
1
]
[
x
1
y
1
z
1
x
2
y
2
z
2
x
3
y
3
z
3
]
\frac{1}{3} \begin{bmatrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{bmatrix} \begin{bmatrix} x_1&y_1&z_1\\ x_2&y_2&z_2\\ x_3&y_3&z_3\\ \end{bmatrix}
31⎣⎡111111111⎦⎤⎣⎡x1x2x3y1y2y3z1z2z3⎦⎤
表示的是x,y,z的平均值。
则可得到协方差矩阵为:
P = 1 3 a T a P=\frac{1}{3}a^Ta P=31aTa
3.3 状态空间方程
举例:对于一个弹簧阻尼系统。
可得到其动力学方程为:
m
x
¨
+
B
x
˙
+
k
x
=
F
m\ddot{x}+B\dot{x}+kx=F
mx¨+Bx˙+kx=F,令F作为输入u,则上式可以表示为:
m
x
¨
=
u
−
B
x
˙
−
k
x
m\ddot{x}=u-B\dot{x}-kx
mx¨=u−Bx˙−kx
设置两个状态变量,
x
1
=
x
,
x
2
=
x
˙
x_1=x,x_2=\dot{x}
x1=x,x2=x˙,同时我们定义测量值,
z
1
=
x
=
x
1
z_1=x=x_1
z1=x=x1(测位置),
z
2
=
x
˙
=
x
2
z_2= \dot{x} =x_2
z2=x˙=x2(测速度),则可得到以下公式:
x
1
˙
=
x
2
x
2
˙
=
1
m
u
−
B
m
x
2
−
k
m
x
1
z
1
=
x
=
x
1
z
2
=
x
˙
=
x
2
\begin{aligned} \dot{x_1}&=x_2\\ \dot{x_2}&=\frac{1}{m}u-\frac{B}{m}x_2-\frac{k}{m}x_1\\ z_1&=x=x_1\\ z_2&=\dot{x}=x_2 \end{aligned}
x1˙x2˙z1z2=x2=m1u−mBx2−mkx1=x=x1=x˙=x2
可以得到矩阵形式为:
[
x
1
˙
x
2
˙
]
=
[
0
1
−
k
m
−
B
m
]
[
x
1
x
2
]
+
[
0
1
m
]
u
[
z
1
z
2
]
=
[
1
0
0
1
]
[
x
1
x
2
]
\begin{aligned} \begin{bmatrix} \dot{x_1}\\ \dot{x_2}\\ \end{bmatrix} &= \begin{bmatrix} 0&1\\ -\frac{k}{m}&-\frac{B}{m}\\ \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ \end{bmatrix} + \begin{bmatrix} 0\\ \frac{1}{m} \end{bmatrix} u\\ \begin{bmatrix} z_1\\ z_2\\ \end{bmatrix} &= \begin{bmatrix} 1&0\\ 0&1\\ \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ \end{bmatrix} \end{aligned}
[x1˙x2˙][z1z2]=[0−mk1−mB][x1x2]+[0m1]u=[1001][x1x2]
进而我们可以得到系统状态随时间别的变化趋势为:
x
˙
(
t
)
=
A
x
(
t
)
+
B
u
z
(
t
)
=
H
x
(
t
)
\begin{aligned} \dot{x}(t)&=Ax(t)+Bu\\ z(t)&=Hx(t)\\ \end{aligned}
x˙(t)z(t)=Ax(t)+Bu=Hx(t)
对此方程进行离散化操作(这部分对离散化后的下标是k还是k-1存在疑问),k表示采样的时间单位,则有
x
k
=
A
x
k
−
1
+
B
u
k
−
1
z
k
=
H
x
k
\begin{aligned} x_k&=Ax_{k-1}+Bu_{k-1}\\ z_k&=Hx_k \end{aligned}
xkzk=Axk−1+Buk−1=Hxk
对等式进行进一步叠加,引入过程噪音
w
k
−
1
w_{k-1}
wk−1和测量噪音
v
k
v_k
vk后可以得到下列公式:
计算方程:
x
k
=
A
x
k
−
1
+
B
u
k
−
1
+
ω
k
−
1
测量方程:
z
k
=
H
x
k
+
v
k
\begin{aligned} \text{计算方程:}\qquad x_k&=Ax_{k-1}+Bu_{k-1}+\omega_{k-1}\\ \text{测量方程:}\qquad z_k&=Hx_k+v_k \end{aligned}
计算方程:xk测量方程:zk=Axk−1+Buk−1+ωk−1=Hxk+vk
可以看到在加入过程噪音和测量噪音后,计算方程和测量方程都会变得不准确,在这种情况下,如何计算出尽可能接近真实值的最优估计
x
^
\hat{x}
x^,就是卡尔曼滤波所要解决的问题。
4 卡尔曼滤波算法详细推导
4.1 线性系统
4.1.1 系统分析
设系统的状态空间方程为:
x
k
=
A
x
k
−
1
+
B
u
k
−
1
+
ω
k
−
1
z
k
=
H
x
k
+
v
k
(4.0)
\begin{aligned} x_k&=Ax_{k-1}+Bu_{k-1}+\omega_{k-1}\\ z_k&=Hx_k+v_k\\ \end{aligned} \tag{4.0}
xkzk=Axk−1+Buk−1+ωk−1=Hxk+vk(4.0)
其中
w
w
w为系统噪声,满足正态分布
P
(
ω
)
∼
(
0
,
Q
)
P(\omega)\sim(0,Q)
P(ω)∼(0,Q),期望
E
(
ω
)
=
0
E(\omega)=0
E(ω)=0,协方差矩阵为
Q
=
E
(
w
w
T
)
Q=E(ww^T)
Q=E(wwT),同理
v
v
v为测量噪声,满足正态分布
P
(
v
)
∼
(
0
,
R
)
P(v)\sim(0,R)
P(v)∼(0,R),期望
E
(
v
)
=
0
E(v)=0
E(v)=0,协方差矩阵为
R
=
E
(
v
v
T
)
R=E(vv^T)
R=E(vvT)。
下面先对 Q = E ( w w T ) Q=E(ww^T) Q=E(wwT)进行推导说明:
假设有两个状态 [ x 1 x 2 ] \begin{bmatrix}x_1\\x_2\end{bmatrix} [x1x2],对应的系统噪声为 [ ω 1 ω 2 ] \begin{bmatrix}\omega_1\\\omega_2\end{bmatrix} [ω1ω2],则 [ ω 1 ω 2 ] [ ω 1 ω 2 ] = [ ω 1 2 ω 1 ω 2 ω 2 ω 1 ω 2 2 ] \begin{bmatrix}\omega_1\\\omega_2\end{bmatrix}\begin{bmatrix}\omega_1&\omega_2\end{bmatrix}=\begin{bmatrix}\omega_1^2&\omega_1\omega_2\\\omega_2\omega_1&\omega_2^2\end{bmatrix} [ω1ω2][ω1ω2]=[ω12ω2ω1ω1ω2ω22],对这个式子求期望得到 [ E ( ω 1 2 ) E ( ω 1 ω 2 ) E ( ω 2 ω 1 ) E ( ω 2 2 ) ] \begin{bmatrix}E(\omega_1^2)&E(\omega_1\omega_2)\\E(\omega_2\omega_1)&E(\omega_2^2)\end{bmatrix} [E(ω12)E(ω2ω1)E(ω1ω2)E(ω22)]。
根据方差公式 D ( X ) = E ( X 2 ) − E 2 ( X ) D(X)=E(X^2)-E^2(X) D(X)=E(X2)−E2(X)和协方差公式 C o v ( X , Y ) = E ( X Y ) − E ( X ) E ( Y ) Cov(X,Y)=E(XY)-E(X)E(Y) Cov(X,Y)=E(XY)−E(X)E(Y)。
因为 E ( ω ) = 0 E(\omega)=0 E(ω)=0,所以 [ E ( ω 1 2 ) E ( ω 1 ω 2 ) E ( ω 2 ω 1 ) E ( ω 2 2 ) ] = [ σ ω 1 2 σ ω 1 σ ω 2 σ ω 2 σ ω 1 σ ω 2 2 ] = Q \begin{bmatrix}E(\omega_1^2)&E(\omega_1\omega_2)\\E(\omega_2\omega_1)&E(\omega_2^2)\end{bmatrix}=\begin{bmatrix}\sigma_{\omega_1}^2&\sigma_{\omega_1}\sigma_{\omega_2}\\\sigma_{\omega_2}\sigma_{\omega_1}&\sigma_{\omega_2}^2\end{bmatrix}=Q [E(ω12)E(ω2ω1)E(ω1ω2)E(ω22)]=[σω12σω2σω1σω1σω2σω22]=Q,这里的 σ ω 1 σ ω 2 \sigma_{\omega_1}\sigma_{\omega_2} σω1σω2表示的是协方差,不是两个标准差相乘。
接下来引入估计值:
x
k
^
−
=
A
x
k
−
1
^
+
B
u
k
−
1
(
x
k
^
−
称
为
先
验
估
计
值
)
(4.1)
\hat{x_k}^-=A\hat{x_{k-1}}+Bu_{k-1}(\hat{x_k}^-称为先验估计值)\tag{4.1}
xk^−=Axk−1^+Buk−1(xk^−称为先验估计值)(4.1)
z
k
=
H
x
k
→
x
M
E
A
k
^
=
H
−
1
z
k
(4.2)
z_k=Hx_k\to\hat{x_{MEAk}}=H^{-1}z_k\tag{4.2}
zk=Hxk→xMEAk^=H−1zk(4.2)
其中(4.1)是算出来的估计值,(4.2)是测出来的估计值。利用3.1节数据融合的理论,我们可以得到另一组公式:
x
k
^
=
x
k
^
−
+
G
(
x
M
E
A
k
^
−
x
k
^
−
)
=
x
k
^
−
+
G
(
H
−
1
z
k
−
x
k
^
−
)
\begin{aligned} \hat{x_k}&=\hat{x_k}^-+G(\hat{x_{MEA_k}}-\hat{x_k}^-)\\ &=\hat{x_k}^-+G(H^{-1}z_k-\hat{x_k}^-) \end{aligned}
xk^=xk^−+G(xMEAk^−xk^−)=xk^−+G(H−1zk−xk^−)
可以看到
{
当
G
=
0
时
,
x
k
^
=
x
k
−
^
当
G
=
1
时
,
x
k
^
=
H
−
1
z
k
=
x
M
E
A
k
^
\left\{\begin{matrix} 当G=0时, &\hat{x_k}=\hat{x_k^-} \\ 当G=1时, &\hat{x_k}=H^{-1}z_k=\hat{x_{MEAk}} \end{matrix}\right.
{当G=0时,当G=1时,xk^=xk−^xk^=H−1zk=xMEAk^
我们令
G
=
K
k
H
G=K_kH
G=KkH,则可得到:
x
k
^
=
x
k
^
−
+
K
k
(
z
k
−
H
x
k
^
−
)
,
K
k
∈
[
0
,
H
−
1
]
(4.3)
\hat{x_k}=\hat{x_k}^-+K_k(z_k-H\hat{x_k}^-),K_k\in[0,H^{-1}]\tag{4.3}
xk^=xk^−+Kk(zk−Hxk^−),Kk∈[0,H−1](4.3)
卡尔曼滤波的目标是,找到一个
K
k
K_k
Kk,使得
x
k
^
→
x
k
\hat{x_k}\to{x_k}
xk^→xk,
x
k
x_k
xk指的是真实值。
4.1.2 如何找到满足条件的卡尔曼增益?
设误差
e
k
=
x
k
−
x
k
^
e_k=x_k-\hat{x_k}
ek=xk−xk^,误差满足正态分布
P
(
e
k
)
∼
(
0
,
P
)
P(e_k)\sim(0,P)
P(ek)∼(0,P),若误差最小,则必须误差接近于误差的期望0,意味着方差必须尽可能小。
P
=
E
[
e
e
T
]
=
[
σ
e
1
2
σ
e
1
σ
e
2
σ
e
2
σ
e
1
σ
e
2
2
]
(4.4)
P=E[ee^T]= \begin{bmatrix}\sigma_{e_1}^2&\sigma_{e_1}\sigma_{e_2}\\\sigma_{e_2}\sigma_{e_1}&\sigma_{e_2}^2\end{bmatrix}\tag{4.4}
P=E[eeT]=[σe12σe2σe1σe1σe2σe22](4.4)
要使得误差的方差最小,则要使得矩阵P的迹最小,即
t
r
(
p
)
=
σ
e
1
2
+
σ
e
2
2
tr(p)=\sigma_{e_1}^2+\sigma_{e_2}^2
tr(p)=σe12+σe22最小,将4.0和4.3带入
e
k
e_k
ek计算公式可得
e
k
=
x
k
−
x
k
^
=
x
k
−
[
x
k
^
−
+
K
k
(
z
k
−
H
x
k
^
−
)
]
=
x
k
−
x
k
^
−
−
K
k
z
k
+
K
k
H
x
k
^
−
=
x
k
−
x
k
^
−
−
K
k
H
x
k
−
K
k
v
k
+
K
k
H
x
k
^
−
=
x
k
−
x
k
^
−
−
K
k
H
(
x
k
−
x
k
^
−
)
−
K
k
v
k
=
(
I
−
K
k
H
)
(
x
k
−
x
k
^
−
)
−
K
k
v
k
=
(
I
−
K
k
H
)
e
k
−
−
K
k
v
k
(4.5)
\begin{aligned} e_k=x_k-\hat{x_k}&=x_k-[\hat{x_k}^-+K_k(z_k-H\hat{x_k}^-)]\\ &=x_k-\hat{x_k}^--K_kz_k+K_kH\hat{x_k}^-\\ &=x_k-\hat{x_k}^--K_kHx_k-K_kv_k+K_kH\hat{x_k}^-\\ &=x_k-\hat{x_k}^--K_kH(x_k-\hat{x_k}^-)-K_kv_k\\ &=(I-K_kH)(x_k-\hat{x_k}^-)-K_kv_k\\ &=(I-K_kH)e_k^--K_kv_k \end{aligned} \tag{4.5}
ek=xk−xk^=xk−[xk^−+Kk(zk−Hxk^−)]=xk−xk^−−Kkzk+KkHxk^−=xk−xk^−−KkHxk−Kkvk+KkHxk^−=xk−xk^−−KkH(xk−xk^−)−Kkvk=(I−KkH)(xk−xk^−)−Kkvk=(I−KkH)ek−−Kkvk(4.5)
将4.5带入4.4可得
P
k
=
E
[
e
k
e
k
T
]
=
E
[
(
I
−
K
k
H
)
e
k
−
−
K
k
v
k
]
[
(
I
−
K
k
H
)
e
k
−
−
K
k
v
k
]
T
=
E
[
(
I
−
K
k
H
)
e
k
−
e
k
−
T
(
I
−
K
k
H
)
T
−
(
I
−
K
k
H
)
e
k
−
v
k
T
K
k
T
−
K
k
v
k
e
k
−
T
(
I
−
K
k
H
)
T
+
K
k
v
k
v
k
T
K
k
T
]
\begin{aligned} P_k=E[e_ke_k^T]&=E[(I-K_kH)e_k^--K_kv_k][(I-K_kH)e_k^--K_kv_k]^T\\ &=E[(I-K_kH)e_k^-e_k^{-T}(I-K_kH)^T-(I-K_kH)e_k^-v_k^TK_k^T-K_kv_ke_k^{-T}(I-K_kH)^T+K_kv_kv_k^TK_k^T] \end{aligned}
Pk=E[ekekT]=E[(I−KkH)ek−−Kkvk][(I−KkH)ek−−Kkvk]T=E[(I−KkH)ek−ek−T(I−KkH)T−(I−KkH)ek−vkTKkT−Kkvkek−T(I−KkH)T+KkvkvkTKkT]
把E放进去,因为
e
k
−
e_k^-
ek−和
v
k
v_k
vk相互独立,第二项和第三项中
E
(
e
k
−
v
k
T
)
=
0
E(e_k^-v_k^T)=0
E(ek−vkT)=0,上式继续化简为
P
k
=
(
I
−
K
k
H
)
E
(
e
k
−
e
k
−
T
)
(
I
−
K
k
H
)
T
+
K
k
E
(
V
k
V
k
T
)
K
k
T
P_k=(I-K_kH)E(e_k^-e_k^{-T})(I-K_kH)^T+K_kE(V_kV_k^T)K_k^T
Pk=(I−KkH)E(ek−ek−T)(I−KkH)T+KkE(VkVkT)KkT
因为
P
k
=
E
(
e
k
e
k
T
)
P_k=E(e_ke_k^T)
Pk=E(ekekT),因此,
P
k
−
=
E
(
e
k
−
e
k
−
T
)
P_k^-=E(e_k^-e_k^{-T})
Pk−=E(ek−ek−T),同理
R
=
R
k
=
E
(
V
k
V
k
T
)
R=R_k=E(V_kV_k^T)
R=Rk=E(VkVkT),上式继续化简为
P
k
=
(
I
−
K
k
H
)
P
k
−
(
I
−
K
k
H
)
T
+
K
k
R
K
k
T
=
(
P
k
−
−
K
k
H
P
k
−
)
(
I
−
H
T
K
k
T
)
+
K
k
R
K
k
T
=
P
k
−
−
K
k
H
P
k
−
−
P
k
−
H
T
K
k
T
+
K
k
H
P
k
−
H
T
K
k
T
+
K
k
R
K
k
T
=
P
k
−
−
K
k
H
P
k
−
−
(
K
k
H
P
k
−
)
T
+
K
k
H
P
k
−
H
T
K
k
T
+
K
k
R
K
k
T
(4.6)
\begin{aligned} P_k&=(I-K_kH)P_k^-(I-K_kH)^T+K_kRK_k^T\\ &=(P_k^--K_kHP_k^-)(I-H^TK_k^T)+K_kRK_k^T\\ &=P_k^--K_kHP_k^--P_k^-H^TK_k^T+K_kHP_k^-H^TK_k^T+K_kRK_k^T\\ &=P_k^--K_kHP_k^--(K_kHP_k^-)^T+K_kHP_k^-H^TK_k^T+K_kRK_k^T\\ \end{aligned} \tag{4.6}
Pk=(I−KkH)Pk−(I−KkH)T+KkRKkT=(Pk−−KkHPk−)(I−HTKkT)+KkRKkT=Pk−−KkHPk−−Pk−HTKkT+KkHPk−HTKkT+KkRKkT=Pk−−KkHPk−−(KkHPk−)T+KkHPk−HTKkT+KkRKkT(4.6)
对4.6式处理,求
P
k
P_k
Pk的迹
t
r
(
P
k
)
=
t
r
(
P
k
−
)
−
2
t
r
(
K
k
H
P
k
−
)
+
t
r
(
K
k
H
P
k
−
H
T
K
k
T
)
+
t
r
(
K
k
R
K
k
T
)
(4.7)
tr(P_k)=tr(P_k^-)-2tr(K_kHP_k^-)+tr(K_kHP_k^-H^TK_k^T)+tr(K_kRK_k^T)\tag{4.7}
tr(Pk)=tr(Pk−)−2tr(KkHPk−)+tr(KkHPk−HTKkT)+tr(KkRKkT)(4.7)
此处对两个公式进行说明:
d t r ( A B ) d A = B T d t r ( A B A T ) d A = A ( B + B T ) 当B为对称矩阵时 d t r ( A B A T ) d A = 2 A B \begin{aligned} \frac{dtr(AB)}{dA}&=B^T\\ \frac{dtr(ABA^T)}{dA}&=A(B+B^T)\\ \text{当B为对称矩阵时}\frac{dtr(ABA^T)}{dA}&=2AB\\ \end{aligned} dAdtr(AB)dAdtr(ABAT)当B为对称矩阵时dAdtr(ABAT)=BT=A(B+BT)=2AB
使
t
r
(
P
k
)
tr(P_k)
tr(Pk)对卡尔曼增益
K
k
K_k
Kk进行求导,求极小值,令导数为0,求得最优的
K
k
K_k
Kk
d
t
r
(
P
k
)
d
K
k
=
0
−
2
(
H
P
k
−
)
T
+
2
K
k
H
P
k
−
H
T
+
2
K
k
R
=
0
K
k
(
H
P
k
−
H
T
+
R
)
=
P
k
−
H
T
\begin{aligned} \frac{dtr(P_k)}{dK_k}=0-2(HP_k^-)^T+2K_kHP_k^-H^T+2K_kR=0\\ K_k(HP_k^-H^T+R)=P_k^-H^T \end{aligned}
dKkdtr(Pk)=0−2(HPk−)T+2KkHPk−HT+2KkR=0Kk(HPk−HT+R)=Pk−HT
得到
K
k
=
P
k
−
H
T
H
P
k
−
H
T
+
R
K
k
=
P
k
−
H
T
(
H
P
k
−
H
T
+
R
)
−
1
严格表示
(4.8)
\begin{aligned} K_k&=\frac{P_k^-H^T}{HP_k^-H^T+R}\\ K_k&=P_k^-H^T(HP_k^-H^T+R)^{-1}\text{严格表示} \end{aligned} \tag{4.8}
KkKk=HPk−HT+RPk−HT=Pk−HT(HPk−HT+R)−1严格表示(4.8)
对应于 x k ^ = x k ^ − + K k ( z k − H x k ^ − ) , K k ∈ [ 0 , H − 1 ] \hat{x_k}=\hat{x_k}^-+K_k(z_k-H\hat{x_k}^-),K_k\in[0,H^{-1}] xk^=xk^−+Kk(zk−Hxk^−),Kk∈[0,H−1]可以分析如下
当R非常大时,说明测量值很不准确,此时 K k → 0 K_k\to{0} Kk→0, x k ^ → x k − ^ \hat{x_k}\to{\hat{x_k^-}} xk^→xk−^,最优估计以先验值(或者说上一次的估计值,或者说计算得到的值)为准;
当R比较小时,说明测量值比较准确,此时 K k → H − K_k\to{H^-} Kk→H−, x k ^ → z k \hat{x_k}\to{z_k} xk^→zk,最优估计以当前测量值为准;
在4.8式中只有 P k − P_k^- Pk−未知,现在求 P k − P_k^- Pk−。
4.1.3 求误差的协方差矩阵的先验值
首先求出
e
k
−
e_k^-
ek−
e
k
−
=
x
k
−
x
k
−
^
=
A
x
k
−
1
+
B
u
k
−
1
+
ω
k
−
1
−
A
x
k
−
1
^
−
B
u
k
−
1
=
A
(
x
k
−
1
−
x
k
−
1
^
)
+
ω
k
−
1
=
A
e
k
−
1
+
ω
k
−
1
\begin{aligned} e_k^-=x_k-\hat{x_k^-}&=Ax_{k-1}+Bu_{k-1}+\omega_{k-1}-A\hat{x_{k-1}}-Bu_{k-1}\\ &=A(x_{k-1}-\hat{x_{k-1}})+\omega_{k-1}\\ &=Ae_{k-1}+\omega_{k-1}\\ \end{aligned}
ek−=xk−xk−^=Axk−1+Buk−1+ωk−1−Axk−1^−Buk−1=A(xk−1−xk−1^)+ωk−1=Aek−1+ωk−1
然后求
P
k
−
P_k^-
Pk−
P
k
−
=
E
(
e
k
−
e
k
−
T
)
=
E
[
(
A
e
k
−
1
+
ω
k
−
1
)
(
A
e
k
−
1
+
ω
k
−
1
)
T
]
=
E
[
(
A
e
k
−
1
+
ω
k
−
1
)
(
e
k
−
1
T
A
T
+
ω
k
−
1
T
)
]
=
E
(
A
e
k
−
1
e
k
−
1
T
A
T
+
A
e
k
−
1
ω
k
−
1
T
+
ω
k
−
1
e
k
−
1
T
A
T
+
ω
k
−
1
ω
k
−
1
T
)
(4.9)
\begin{aligned} P_k^-&=E(e_k^-e_k^{-T})\\ &=E[(Ae_{k-1}+\omega_{k-1})(Ae_{k-1}+\omega_{k-1})^T]\\ &=E[(Ae_{k-1}+\omega_{k-1})(e_{k-1}^TA^T+\omega_{k-1}^T)]\\ &=E(Ae_{k-1}e_{k-1}^TA^T+Ae_{k-1}\omega_{k-1}^T+\omega_{k-1}e_{k-1}^TA^T+\omega_{k-1}\omega_{k-1}^T) \end{aligned} \tag{4.9}
Pk−=E(ek−ek−T)=E[(Aek−1+ωk−1)(Aek−1+ωk−1)T]=E[(Aek−1+ωk−1)(ek−1TAT+ωk−1T)]=E(Aek−1ek−1TAT+Aek−1ωk−1T+ωk−1ek−1TAT+ωk−1ωk−1T)(4.9)
因为
e
k
−
1
e_{k-1}
ek−1和
ω
k
−
1
\omega_{k-1}
ωk−1相互独立,所以第二项和第三项的期望为0。
说明
e k − 1 = x k − 1 − x k − 1 ^ x k = A x k − 1 + B u k − 1 + ω k − 1 \begin{aligned} e_{k-1}&=x_{k-1}-\hat{x_{k-1}}\\ x_k&=Ax_{k-1}+Bu_{k-1}+\omega_{k-1}\\ \end{aligned} ek−1xk=xk−1−xk−1^=Axk−1+Buk−1+ωk−1
可以看到 e k − 1 e_{k-1} ek−1表示的是k-1次的误差, ω k − 1 \omega_{k-1} ωk−1作用的是第k次的x,所以二者相互独立。
继续推导4.9式
P
k
−
=
A
E
(
e
k
−
1
e
k
−
1
T
)
A
T
+
E
(
ω
k
−
1
ω
k
−
1
T
)
=
A
P
k
−
1
A
T
+
Q
(4.10)
\begin{aligned} P_{k}^-&=AE(e_{k-1}e_{k-1}^{T})A^T+E(\omega_{k-1}\omega_{k-1}^T)\\ &=AP_{k-1}A^T+Q \end{aligned} \tag{4.10}
Pk−=AE(ek−1ek−1T)AT+E(ωk−1ωk−1T)=APk−1AT+Q(4.10)
4.1.4 求误差的协方差矩阵
根据4.6式我们得到
P
k
=
P
k
−
−
K
k
H
P
k
−
−
(
K
k
H
P
k
−
)
T
+
K
k
H
P
k
−
H
T
K
k
T
+
K
k
R
K
k
T
P_k=P_k^--K_kHP_k^--(K_kHP_k^-)^T+K_kHP_k^-H^TK_k^T+K_kRK_k^T
Pk=Pk−−KkHPk−−(KkHPk−)T+KkHPk−HTKkT+KkRKkT
化简
P
k
=
P
k
−
−
K
k
H
P
k
−
−
P
k
−
T
H
T
k
k
T
+
K
k
H
P
k
−
H
T
K
k
T
+
K
k
R
K
k
T
P_k=P_k^--K_kHP_k^--P_k^{-T}H^Tk_k^T+K_kHP_k^-H^TK_k^T+K_kRK_k^T
Pk=Pk−−KkHPk−−Pk−THTkkT+KkHPk−HTKkT+KkRKkT
因为
P
P
P为实对称矩阵,因此
P
k
−
T
=
P
k
−
P_k^{-T}=P_k^-
Pk−T=Pk−,上式等于
P
k
=
P
k
−
−
K
k
H
P
k
−
−
P
k
−
H
T
k
k
T
+
K
k
(
H
P
k
−
H
T
+
R
)
K
k
T
P_k=P_k^--K_kHP_k^--P_k^{-}H^Tk_k^T+K_k(HP_k^-H^T+R)K_k^T
Pk=Pk−−KkHPk−−Pk−HTkkT+Kk(HPk−HT+R)KkT
将
K
k
=
P
k
−
H
T
H
P
k
−
H
T
+
R
K_k=\frac{P_k^-H^T}{HP_k^-H^T+R}
Kk=HPk−HT+RPk−HT带入,得到
P
k
=
P
k
−
−
K
k
H
P
k
−
P_k=P_k^--K_kHP_k^-
Pk=Pk−−KkHPk−
P
k
=
(
I
−
K
k
H
)
P
k
−
(4.11)
P_k=(I-K_kH)P_k^-\tag{4.11}
Pk=(I−KkH)Pk−(4.11)
自此卡尔曼滤波五大公式推导完毕。
4.1.5 卡尔曼滤波算法五大公式
先验: x k ^ − − = A x k − 1 ^ + B u k − 1 \hat{x_k}^--=A\hat{x_{k-1}}+Bu_{k-1} xk^−−=Axk−1^+Buk−1
先验误差协方差: P k − = A P k − 1 A T + Q P_{k}^-=AP_{k-1}A^T+Q Pk−=APk−1AT+Q
卡尔曼增益: K k = P k − H T H P k − H T + R K_k=\frac{P_k^-H^T}{HP_k^-H^T+R} Kk=HPk−HT+RPk−HT
误差协方差: P k = ( I − K k H ) P k − P_k=(I-K_kH)P_k^- Pk=(I−KkH)Pk−
最优估计(后验估计): x k ^ = x k ^ − + K k ( z k − H x k ^ − ) \hat{x_k}=\hat{x_k}^-+K_k(z_k-H\hat{x_k}^-) xk^=xk^−+Kk(zk−Hxk^−)
4.1.6 卡尔曼滤波示例加编程
示例,研究一个物体匀速前进的系统,状态有两个,一个是位置设为
X
1
X_1
X1,一个是速度设为
X
2
X_2
X2,则存在以下方程:
位置:
x
1
,
k
=
x
1
,
k
−
1
+
Δ
T
x
2
,
k
−
1
+
ω
1
,
k
−
1
速度:
x
2
,
k
=
x
2
,
k
−
1
+
ω
2
,
k
−
1
\begin{aligned} \text{位置:}x_{1,k}&=x_{1,k-1}+\Delta{T}x_{2,k-1}+\omega_{1,k-1}\\ \text{速度:}x_{2,k}&=x_{2,k-1}+\omega_{2,k-1} \end{aligned}
位置:x1,k速度:x2,k=x1,k−1+ΔTx2,k−1+ω1,k−1=x2,k−1+ω2,k−1
我们令
Δ
T
=
1
\Delta{T}=1
ΔT=1,则有
位置:
x
1
,
k
=
x
1
,
k
−
1
+
x
2
,
k
−
1
+
ω
1
,
k
−
1
速度:
x
2
,
k
=
x
2
,
k
−
1
+
ω
2
,
k
−
1
\begin{aligned} \text{位置:}x_{1,k}&=x_{1,k-1}+x_{2,k-1}+\omega_{1,k-1}\\ \text{速度:}x_{2,k}&=x_{2,k-1}+\omega_{2,k-1} \end{aligned}
位置:x1,k速度:x2,k=x1,k−1+x2,k−1+ω1,k−1=x2,k−1+ω2,k−1
测量方程可以写为
Z
1
,
k
=
x
1
,
k
+
v
1
,
k
Z
2
,
k
=
x
2
,
k
+
v
2
,
k
\begin{aligned} Z_{1,k}&=x_{1,k}+v_{1,k}\\ Z_{2,k}&=x_{2,k}+v_{2,k}\\ \end{aligned}
Z1,kZ2,k=x1,k+v1,k=x2,k+v2,k
因此,状态方程可以写为:
[
x
1
,
k
x
2
,
k
]
=
[
1
1
0
1
]
[
x
1
,
k
−
1
x
2
,
k
−
1
]
+
[
ω
1
,
k
−
1
ω
2
,
k
−
1
]
[
z
1
,
k
z
2
,
k
]
=
[
1
0
0
1
]
[
x
1
,
k
x
2
,
k
]
+
[
v
1
,
k
v
2
,
k
]
\begin{aligned} \begin{bmatrix} x_{1,k}\\ x_{2,k} \end{bmatrix} &= \begin{bmatrix} 1&1\\ 0&1 \end{bmatrix} \begin{bmatrix} x_{1,k-1}\\ x_{2,k-1} \end{bmatrix} + \begin{bmatrix} \omega_{1,k-1}\\ \omega_{2,k-1} \end{bmatrix}\\ \begin{bmatrix} z_{1,k}\\ z_{2,k} \end{bmatrix} &= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix} \begin{bmatrix} x_{1,k}\\ x_{2,k} \end{bmatrix} + \begin{bmatrix} v_{1,k}\\ v_{2,k} \end{bmatrix} \end{aligned}
[x1,kx2,k][z1,kz2,k]=[1011][x1,k−1x2,k−1]+[ω1,k−1ω2,k−1]=[1001][x1,kx2,k]+[v1,kv2,k]
在本示例中我们需要预先知道的初值有:
Q
=
[
0.1
0
0
0.1
]
,
P
=
[
1
0
0
1
]
,
A
=
[
1
1
0
1
]
,
H
=
[
1
0
0
1
]
,
单位矩阵
E
=
[
1
0
0
1
]
P
0
=
[
1
0
0
1
]
,
x
(
1
,
2
)
0
=
x
(
1
,
2
)
0
^
=
[
0
1
]
\begin{aligned} Q&= \begin{bmatrix} 0.1&0\\ 0&0.1 \end{bmatrix}, P= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}, A= \begin{bmatrix} 1&1\\ 0&1 \end{bmatrix}, H= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}, \text{单位矩阵} E= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}\\ P_0&= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}, x_{(1,2)_0}=\hat{x_{(1,2)_0}}= \begin{bmatrix} 0\\ 1 \end{bmatrix} \end{aligned}
QP0=[0.1000.1],P=[1001],A=[1011],H=[1001],单位矩阵E=[1001]=[1001],x(1,2)0=x(1,2)0^=[01]
根据上述方程和卡尔曼滤波公式,递推300次,编写以下程序:
close all
clc;clear;
Q=[0.1,0;0,0.1];%定义Q矩阵(系统量误差的协方差矩阵)
R=[1,0;0,1];%定义R矩阵(测量误差的协方差矩阵)
A=[1,1;0,1];%定义A矩阵
H=[1,0;0,1];%定义H矩阵
I=eye(2);%定义单位矩阵
X_out=[0;1];%最终输出实际值
Y_Measure_out=[0,0];%最终输出的测量值
X_pre_out=[0;0];%最终输出的先验估计值
X_pro_out=[0;1];%最终输出的后验估计值
Z_out=[0;0];%最终输出的测量值
P_pre=[0,0;0,0];%协方差矩阵的先验值
P_pro=[1,0;0,1];%协方差矩阵的后验值
for k=2:1:300
X=A*X_out(:,k-1)+normrnd(0,sqrt(0.01),[2,1]);%计算当前时刻的状态实际值
X_pre=A*X_pro_out(:,k-1);%计算当前时刻的先验估计
Z=H*X+normrnd(0,sqrt(0.1),[2,1]);%计算当前时刻的测量值
P_pre=A*P_pro*A'+Q;%计算当前时刻的误差协方差的先验
K=P_pre*H'*inv(H*P_pre*H'+R);%计算当前时刻的卡尔曼增益
P_pro=(I-K*H)*P_pre;%计算当前时刻的误差协方差的后验并更新
X_pro=X_pre+K*(Z-H*X_pre);%计算当前时刻的后验估计(最优估计)
X_pro_out=[X_pro_out,X_pro];%将每一次计算出来的后验估计放入X_pro_out数组中
X_pre_out=[X_pre_out,X_pre];%将每一次计算出来的先验估计放入X_pre_out数组中
X_out=[X_out,X];%将每一次计算出来的实际值放入X_out数组中
Z_out=[Z_out,Z];%将每一次测量值放入Z_out数组中
end
subplot(2,1,1)
plot(X_out(1,:));
hold on
plot(X_pro_out(1,:));
plot(Z_out(1,:));
plot(X_pre_out(1,:));
grid on
legend('位置原始数据','位置最优估计','位置测量数据','位置先验估计');
subplot(2,1,2)
plot(X_out(2,:));
hold on
plot(X_pro_out(2,:));
plot(Z_out(2,:));
plot(X_pre_out(2,:));
grid on
legend('速度原始数据','速度最优估计','位置测量数据','位置先验估计');