本节默认你能够完整推导标准卡尔曼滤波,将会简化一些推导的描述。如果你还不会完整推导标准卡尔曼滤波,请先从 【卡尔曼滤波理论推导与实践】系列开始看起。
非线性系统
扩展卡尔曼滤波解决的是非线性系统,其非线性状态空间方程为:
{
z
k
模
⃗
=
f
(
z
k
−
1
估
⃗
,
F
k
−
1
)
y
k
测
⃗
=
h
(
z
k
测
⃗
)
\begin{cases}\vec{z_{k模}}=\mathrm{f}(\vec{z_{k-1估}},F_{k-1})\\\vec{y_{k测}}=\mathrm{h}(\vec{z_{k测}})\end{cases}
{zk模=f(zk−1估,Fk−1)yk测=h(zk测)
f
,
h
\mathrm{f},\mathrm{h}
f,h函数是向量函数,有多个输出
[
f
1
.
.
.
f
n
]
\left[\begin{matrix}f_1\\...\\f_n\\\end{matrix}\right]
f1...fn
,
n
n
n是
z
⃗
\vec{z}
z的维数,比如追踪平面图像物体坐标和速度,
z
⃗
=
[
x
y
v
x
v
y
]
\vec{z}=\left[\begin{matrix}x\\y\\v_x\\v_y\end{matrix}\right]
z=
xyvxvy
。
其非线性真实系统模型为:
{
z
k
真
⃗
=
f
(
z
k
−
1
真
⃗
,
F
k
−
1
,
w
k
−
1
⃗
)
y
k
测
⃗
=
h
(
z
k
真
⃗
,
v
k
⃗
)
\begin{cases}\vec{z_{k真}}=\mathrm{f}(\vec{z_{k-1真}},F_{k-1},\vec{w_{k-1}})\\\vec{y_{k测}}=\mathrm{h}(\vec{z_{k真}},\vec{v_k})\end{cases}
{zk真=f(zk−1真,Fk−1,wk−1)yk测=h(zk真,vk)
因为非线性函数的期望不能用协方差矩阵描述,无法用卡尔曼滤波的套路进行推导,所以要进行线性化近似,这就是扩展卡尔曼滤波与标准卡尔曼滤波的唯一区别。
泰勒展开
扩展卡尔曼滤波使用泰勒展开进行线性化近似,扩展卡尔曼滤波是一个二元向量输入多输出系统,比如输入为
[
z
k
−
1
模
⃗
,
w
k
−
1
⃗
]
[\vec{z_{k-1模}},\vec{w_{k-1}}]
[zk−1模,wk−1],这有两列向量;输出为
z
k
真
⃗
\vec{z_{k真}}
zk真这个向量。
这里有两个公式要提前知道:
- 单输出的二元函数在
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)点的泰勒展开公式:
f ( x , y ) = f ( x 0 , x 0 ) + d f d x ∣ x 0 , y 0 ∗ ( x − x 0 ) + + d f d y ∣ x 0 , y 0 ∗ ( y − y 0 ) f(x,y)=f(x_0,x_0)+\frac{df}{dx}|_{x_0,y_0}*(x-x_0)++\frac{df}{dy}|_{x_0,y_0}*(y-y_0) f(x,y)=f(x0,x0)+dxdf∣x0,y0∗(x−x0)++dydf∣x0,y0∗(y−y0) - 多输出函数对输入向量求导公式:
d f ⃗ ( x ⃗ ) d x ⃗ = [ d f 1 d x 1 d f 1 d x 2 ⋯ d f 1 d x m d f 2 d x 1 d f 2 d x 2 ⋯ d f 2 d x m ⋮ ⋮ ⋱ ⋮ d f n d x 1 d f n d x 2 ⋯ d f n d x m ] = 雅可比矩阵 \frac{d\vec{f}(\vec{x})}{d\vec{x}}=\left[\begin{matrix}\frac{d f_1}{d x_1} & \frac{d f_1}{dx_2} & \cdots & \frac{df_1}{dx_m} \\ \frac{df_2}{dx_1} & \frac{df_2}{dx_2} & \cdots & \frac{df_2}{dx_m} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{df_n}{dx_1} & \frac{df_n}{dx_2} & \cdots & \frac{df_n}{dx_m}\end{matrix}\right]=雅可比矩阵 dxdf(x)= dx1df1dx1df2⋮dx1dfndx2df1dx2df2⋮dx2dfn⋯⋯⋱⋯dxmdf1dxmdf2⋮dxmdfn =雅可比矩阵
接下来进行泰勒展开:
记
f
\mathrm{f}
f对
z
⃗
\vec{z}
z求导的雅可比矩阵为
A
\mathrm{A}
A,
f
\mathrm{f}
f对
w
⃗
\vec{w}
w求导的雅可比矩阵为
W
\mathrm{W}
W,
h
\mathrm{h}
h对
z
⃗
\vec{z}
z求导的雅可比矩阵为
H
\mathrm{H}
H,
h
\mathrm{h}
h对
v
⃗
\vec{v}
v求导的雅可比矩阵为
V
\mathrm{V}
V。
注意:
- F k − 1 F_{k-1} Fk−1是给定值而不是变量,不参与泰勒展开
- 噪声的期望(平均值)是零,所以泰勒展开点的噪声值可以认为零
可以在任意已知点(比如模型值和上轮估计值都是已知的)展开,在哪个点展开都是为了方便推导。
测量方程在
z
k
模
⃗
\vec{z_{k模}}
zk模处泰勒展开:
y
k
测
⃗
=
h
(
z
k
模
⃗
)
+
H
∗
(
z
k
测
⃗
−
z
k
模
⃗
)
\vec{y_{k测}}=h(\vec{z_{k模}})+\mathrm{H}*(\vec{z_{k测}}-\vec{z_{k模}})
yk测=h(zk模)+H∗(zk测−zk模)
真实系统模型分别在
(
z
k
−
1
估
⃗
,
0
⃗
)
,
(
z
k
模
⃗
,
0
⃗
)
(\vec{z_{k-1估}},\vec{0}),(\vec{z_{k模}},\vec{0})
(zk−1估,0),(zk模,0)泰勒展开:
{
z
k
真
⃗
=
f
(
z
k
−
1
估
⃗
,
F
k
−
1
,
0
⃗
)
+
A
∗
(
z
k
−
1
真
⃗
−
z
k
−
1
估
⃗
)
+
W
∗
(
w
k
−
1
⃗
−
0
⃗
)
y
k
测
⃗
=
h
(
z
k
模
⃗
,
0
⃗
)
+
H
∗
(
z
k
真
⃗
−
z
k
模
⃗
)
+
V
∗
(
v
k
⃗
−
0
⃗
)
\begin{cases}\vec{z_{k真}}=f(\vec{z_{k-1估}},F_{k-1},\vec{0})+\mathrm{A}*(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*(\vec{w_{k-1}}-\vec{0})\\\vec{y_{k测}}=h(\vec{z_{k模}},\vec{0})+\mathrm{H}*(\vec{z_{k真}}-\vec{z_{k模}})+\mathrm{V}*(\vec{v_k}-\vec{0})\end{cases}
{zk真=f(zk−1估,Fk−1,0)+A∗(zk−1真−zk−1估)+W∗(wk−1−0)yk测=h(zk模,0)+H∗(zk真−zk模)+V∗(vk−0)
卡尔曼滤波
线性化后,接下来的推导过程和标准卡尔曼滤波不能说一摸一样,只能说九分甚至十分地相似。
这里再放一遍卡尔曼滤波核心思想:
用测量值修正系统模型值,得到当前轮次的最优估计值。再将该最优估计值当作下一轮的系统模型输入,继续进行下一轮的最优估计,如此迭代进行。
要最优化估计值,首先把估计值表达式写出来:
z
k
估
⃗
=
z
k
模
⃗
+
G
k
∗
(
z
k
测
⃗
−
z
k
模
⃗
)
\begin{aligned}\vec{z_{k估}}&=\vec{z_{k模}}+\mathrm{G_k}*(\vec{z_{k测}}-\vec{z_{k模}})&\end{aligned}
zk估=zk模+Gk∗(zk测−zk模)
对
G
\mathrm{G}
G矩阵进行一个变换,出一个
y
k
测
⃗
\vec{y_{k测}}
yk测出来,方便推导,令
G
=
K
∗
H
\mathrm{G}=\mathrm{K}*\mathrm{H}
G=K∗H,于是估计值表达式变为:
z
k
估
⃗
=
z
k
模
⃗
+
K
k
∗
H
∗
(
z
k
测
⃗
−
z
k
模
⃗
)
=
z
k
模
⃗
+
K
k
∗
(
y
k
测
⃗
−
h
(
z
k
模
⃗
)
)
\begin{aligned}\vec{z_{k估}}&=\vec{z_{k模}}+\mathrm{K_k}*\mathrm{H}*(\vec{z_{k测}}-\vec{z_{k模}})\\&=\vec{z_{k模}}+\mathrm{K_k}*(\vec{y_{k测}}-h(\vec{z_{k模}}))\end{aligned}
zk估=zk模+Kk∗H∗(zk测−zk模)=zk模+Kk∗(yk测−h(zk模))
卡尔曼增益
z
k
估
⃗
\vec{z_{k估}}
zk估表达式右侧除了
K
k
\mathrm{K_k}
Kk不知道,其他都是已知数,继续推导
K
k
\mathrm{K_k}
Kk吧。那么就是推导最优估计下的
K
k
\mathrm{K_k}
Kk,就是使得估计误差协方差矩阵的迹最小,先把估计误差协方差矩阵写出来:
P
k
估
=
E
[
e
k
估
⃗
e
k
估
⃗
T
]
=
E
[
(
z
k
真
⃗
−
z
k
估
⃗
)
∗
(
z
k
真
⃗
−
z
k
估
⃗
)
T
]
\begin{aligned}\mathrm{P_{k估}}&=E[\vec{e_{k估}}\vec{e_{k估}}^T]\\&=E[(\vec{z_{k真}}-\vec{z_{k估}})*(\vec{z_{k真}}-\vec{z_{k估}})^T]\end{aligned}
Pk估=E[ek估ek估T]=E[(zk真−zk估)∗(zk真−zk估)T]
展开一下 z k 真 ⃗ − z k 估 ⃗ \vec{z_{k真}}-\vec{z_{k估}} zk真−zk估:
z k 真 ⃗ − z k 估 ⃗ = z k 真 ⃗ − z k 模 ⃗ − K k ∗ ( y k 测 ⃗ − h ( z k 模 ⃗ ) ) = e k 模 ⃗ − K k ∗ ( h ( z k 模 ⃗ , 0 ) + H ∗ ( z k 真 ⃗ − z k 模 ⃗ ) + V ∗ v k ⃗ − h ( z k 模 ⃗ ) ) = e k 模 ⃗ − K k ∗ ( H ∗ e k 模 ⃗ + V ∗ v k ⃗ ) = ( I − K k H ) e k 模 ⃗ − K k V ∗ v k ⃗ \begin{aligned}\vec{z_{k真}}-\vec{z_{k估}}&=\vec{z_{k真}}-\vec{z_{k模}}-\mathrm{K_k}*(\vec{y_{k测}}-\mathrm{h}(\vec{z_{k模}}))\\&=\vec{e_{k模}}-\mathrm{K_k}*(h(\vec{z_{k模}},0)+\mathrm{H}*(\vec{z_{k真}}-\vec{z_{k模}})+\mathrm{V}*\vec{v_k}-h(\vec{z_{k模}}))\\&=\vec{e_{k模}}-\mathrm{K_k}*(\mathrm{H}*\vec{e_{k模}}+\mathrm{V}*\vec{v_k})\\&=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k}\end{aligned} zk真−zk估=zk真−zk模−Kk∗(yk测−h(zk模))=ek模−Kk∗(h(zk模,0)+H∗(zk真−zk模)+V∗vk−h(zk模))=ek模−Kk∗(H∗ek模+V∗vk)=(I−KkH)ek模−KkV∗vk
P
k
估
\mathrm{P_{k估}}
Pk估可以继续展开了:
P
k
估
=
E
[
(
(
I
−
K
k
H
)
e
k
模
⃗
−
K
k
V
∗
v
k
⃗
)
∗
(
(
I
−
K
k
H
)
e
k
模
⃗
−
K
k
V
∗
v
k
⃗
)
T
]
=
E
[
(
(
I
−
K
k
H
)
e
k
模
⃗
−
K
k
V
∗
v
k
⃗
)
∗
(
e
k
模
⃗
T
(
I
−
K
k
H
)
T
−
v
k
⃗
T
V
T
K
k
T
)
]
\begin{aligned}\mathrm{P_{k估}}&=E[((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})*((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})^T]\\&=E[((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})*(\vec{e_{k模}}^T(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T-\vec{v_k}^T\mathrm{V}^T\mathrm{K_k}^T)]\end{aligned}
Pk估=E[((I−KkH)ek模−KkV∗vk)∗((I−KkH)ek模−KkV∗vk)T]=E[((I−KkH)ek模−KkV∗vk)∗(ek模T(I−KkH)T−vkTVTKkT)]
接下来将括号乘开。这里有两点有助于化简:噪声
v
k
⃗
\vec{v_k}
vk的期望是零,又与
e
k
模
⃗
\vec{e_{k模}}
ek模相互独立,所以
v
k
⃗
\vec{v_k}
vk和
e
k
模
⃗
\vec{e_{k模}}
ek模搭边的项都是零。
P
k
估
=
E
[
(
I
−
K
k
H
)
e
k
模
⃗
e
k
模
⃗
T
(
I
−
K
k
H
)
T
+
K
k
V
∗
v
k
⃗
v
k
⃗
T
V
T
K
k
T
]
=
(
I
−
K
k
H
)
P
k
模
(
I
−
K
k
H
)
T
+
K
k
V
R
V
T
K
k
T
\begin{aligned}\mathrm{P_{k估}}&=E[(\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}\vec{e_{k模}}^T(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T+\mathrm{K_k}\mathrm{V}*\vec{v_k}\vec{v_k}^T\mathrm{V}^T\mathrm{K_k}^T]\\&=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}}(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T+\mathrm{K_k}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_k}^T\end{aligned}
Pk估=E[(I−KkH)ek模ek模T(I−KkH)T+KkV∗vkvkTVTKkT]=(I−KkH)Pk模(I−KkH)T+KkVRVTKkT
P
k
估
\mathrm{P_{k估}}
Pk估的表达式也出来了,
K
k
\mathrm{K_k}
Kk是自变量,想让
t
r
(
P
k
估
)
tr(\mathrm{P_{k估}})
tr(Pk估)最小,即最优估计。由于
t
r
(
P
k
估
)
tr(\mathrm{P_{k估}})
tr(Pk估)是二次函数,开口向上,极值点必定是极小值点,于是接下来准备
t
r
(
P
k
估
)
d
K
k
=
0
\frac{tr(\mathrm{P_{k估}})}{d\mathrm{K_k}}=0
dKktr(Pk估)=0。在算极值点前,有个矩阵求导公式需要提前知道:
d
t
r
(
A
B
A
T
)
d
A
=
2
A
B
\frac{dtr(\mathrm{A}\mathrm{B}\mathrm{A}^T)}{d\mathrm{A}}=2\mathrm{A}\mathrm{B}
dAdtr(ABAT)=2AB
将
P
k
估
\mathrm{P_{k估}}
Pk估的括号分解开,注意
V
R
V
T
\mathrm{V}\mathrm{R}\mathrm{V}^T
VRVT看作一个整体,求导得到:
d
P
k
估
d
K
k
=
2
(
I
−
K
k
H
)
P
k
模
(
−
H
T
)
+
2
K
k
V
R
V
T
=
0
\begin{aligned}\frac{d\mathrm{P_{k估}}}{d\mathrm{K_k}}&=2(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}}(-\mathrm{H}^T)+2\mathrm{K_k}\mathrm{V}\mathrm{R}\mathrm{V}^T\\&=0\end{aligned}
dKkdPk估=2(I−KkH)Pk模(−HT)+2KkVRVT=0
K
k
\mathrm{K_k}
Kk这不就出来了,和标准卡尔曼滤波里的
K
k
\mathrm{K_k}
Kk挺像的:
K
k
=
P
k
模
H
T
H
P
k
模
H
T
+
V
R
V
T
\mathrm{K_k}=\frac{\mathrm{P_{k模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T}
Kk=HPk模HT+VRVTPk模HT
模型误差协方差矩阵
和标准卡尔曼滤波的推导套路一样,继续推导
P
k
模
\mathrm{P_{k模}}
Pk模。
先把表达式搞出来:
P
k
模
=
E
[
e
k
模
⃗
e
k
模
⃗
T
]
=
E
[
(
z
k
真
⃗
−
z
k
模
⃗
)
∗
(
z
k
真
⃗
−
z
k
模
⃗
)
T
]
\begin{aligned}\mathrm{P_{k模}}&=E[\vec{e_{k模}}\vec{e_{k模}}^T]\\&=E[(\vec{z_{k真}}-\vec{z_{k模}})*(\vec{z_{k真}}-\vec{z_{k模}})^T]\end{aligned}
Pk模=E[ek模ek模T]=E[(zk真−zk模)∗(zk真−zk模)T]
展开一下 z k 真 ⃗ − z k 模 ⃗ \vec{z_{k真}}-\vec{z_{k模}} zk真−zk模:
z k 真 ⃗ − z k 模 ⃗ = f ( z k − 1 估 ⃗ , F k − 1 , 0 ) + A ∗ ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ w k − 1 ⃗ − f ( z k − 1 估 ⃗ , F k − 1 ) = A ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ w k − 1 ⃗ = A e k − 1 估 ⃗ + W w k − 1 ⃗ \begin{aligned}\vec{z_{k真}}-\vec{z_{k模}}&=f(\vec{z_{k-1估}},F_{k-1},0)+\mathrm{A}*(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*\vec{w_{k-1}}-f(\vec{z_{k-1估}},F_{k-1})\\&=\mathrm{A}(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*\vec{w_{k-1}}\\&=\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}}\end{aligned} zk真−zk模=f(zk−1估,Fk−1,0)+A∗(zk−1真−zk−1估)+W∗wk−1−f(zk−1估,Fk−1)=A(zk−1真−zk−1估)+W∗wk−1=Aek−1估+Wwk−1
P
k
模
\mathrm{P_{k模}}
Pk模继续展开,展开后的表达式和标准卡尔曼滤波里的
P
k
模
\mathrm{P_{k模}}
Pk模也挺像的:
P
k
模
=
E
[
(
A
e
k
−
1
估
⃗
+
W
w
k
−
1
⃗
)
∗
(
A
e
k
−
1
估
⃗
+
W
w
k
−
1
⃗
)
T
]
=
E
[
(
A
e
k
−
1
估
⃗
+
W
w
k
−
1
⃗
)
∗
(
e
k
−
1
估
⃗
T
A
T
+
w
k
−
1
⃗
T
W
T
)
]
=
E
[
A
e
k
−
1
估
⃗
e
k
−
1
估
⃗
T
A
T
+
W
w
k
−
1
⃗
w
k
−
1
⃗
T
W
T
]
=
A
E
[
e
k
−
1
估
⃗
e
k
−
1
估
⃗
T
]
A
T
+
W
E
[
w
k
−
1
⃗
w
k
−
1
⃗
T
]
W
T
=
A
P
k
−
1
估
A
T
+
W
Q
W
T
\begin{aligned}\mathrm{P_{k模}}&=E[(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})*(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})^T]\\&=E[(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})*(\vec{e_{k-1估}}^T\mathrm{A}^T+\vec{w_{k-1}}^T\mathrm{W}^T)]\\&=E[\mathrm{A}\vec{e_{k-1估}}\vec{e_{k-1估}}^T\mathrm{A}^T+\mathrm{W}\vec{w_{k-1}}\vec{w_{k-1}}^T\mathrm{W}^T]\\&=\mathrm{A}E[\vec{e_{k-1估}}\vec{e_{k-1估}}^T]\mathrm{A}^T+\mathrm{W}E[\vec{w_{k-1}}\vec{w_{k-1}}^T]\mathrm{W}^T\\&=\mathrm{A}\mathrm{P_{k-1估}}\mathrm{A}^T+\mathrm{W}\mathrm{Q}\mathrm{W}^T\end{aligned}
Pk模=E[(Aek−1估+Wwk−1)∗(Aek−1估+Wwk−1)T]=E[(Aek−1估+Wwk−1)∗(ek−1估TAT+wk−1TWT)]=E[Aek−1估ek−1估TAT+Wwk−1wk−1TWT]=AE[ek−1估ek−1估T]AT+WE[wk−1wk−1T]WT=APk−1估AT+WQWT
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估表达式在上面推导过了,只不过
k
k
k换成
k
−
1
k-1
k−1:
表达式:
P
k
−
1
估
=
(
I
−
K
k
−
1
H
)
P
k
−
1
模
(
I
−
H
T
K
k
−
1
T
)
+
K
k
−
1
V
R
V
T
K
k
−
1
T
,
K
k
−
1
=
P
k
−
1
模
H
T
H
P
k
−
1
模
H
T
+
V
R
V
T
表达式:\mathrm{P_{k-1估}}=(\mathrm{I}-\mathrm{K_{k-1}}\mathrm{H})\mathrm{P_{k-1模}}(\mathrm{I}-\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_{k-1}}^T,\mathrm{K_{k-1}}=\frac{\mathrm{P_{k-1模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T}
表达式:Pk−1估=(I−Kk−1H)Pk−1模(I−HTKk−1T)+Kk−1VRVTKk−1T,Kk−1=HPk−1模HT+VRVTPk−1模HT
把
K
k
−
1
\mathrm{K_{k-1}}
Kk−1代到
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估表达式里就得到
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估的具体值,你完全可以将
K
k
−
1
\mathrm{K_{k-1}}
Kk−1直接无脑代入
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估的表达式,毕竟
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估等式右边全是上轮迭代得到的已知数,但是
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估可以进行化简减少计算量:
P
k
−
1
估
=
(
P
k
−
1
模
−
K
k
−
1
H
P
k
−
1
模
−
P
k
−
1
模
H
T
K
k
−
1
T
+
K
k
−
1
H
P
k
−
1
模
H
T
K
k
−
1
T
)
+
K
k
−
1
V
R
V
T
K
k
−
1
T
=
(
P
k
−
1
模
−
K
k
−
1
H
P
k
−
1
模
−
P
k
−
1
模
H
T
K
k
−
1
T
)
+
K
k
−
1
(
H
P
k
−
1
模
H
T
+
V
R
V
T
)
K
k
−
1
T
=
(
P
k
−
1
模
−
K
k
−
1
H
P
k
−
1
模
−
P
k
−
1
模
H
T
K
k
−
1
T
)
+
P
k
−
1
模
H
T
K
k
−
1
T
=
P
k
−
1
模
−
K
k
−
1
H
P
k
−
1
模
=
(
I
−
K
k
−
1
H
)
P
k
−
1
模
\begin{aligned}\mathrm{P_{k-1估}}&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T+\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_{k-1}}^T\\&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}(\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T)\mathrm{K_{k-1}}^T\\&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T\\&=\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}\\&=(\mathrm{I}-\mathrm{K_{k-1}}\mathrm{H})\mathrm{P_{k-1模}}\end{aligned}
Pk−1估=(Pk−1模−Kk−1HPk−1模−Pk−1模HTKk−1T+Kk−1HPk−1模HTKk−1T)+Kk−1VRVTKk−1T=(Pk−1模−Kk−1HPk−1模−Pk−1模HTKk−1T)+Kk−1(HPk−1模HT+VRVT)Kk−1T=(Pk−1模−Kk−1HPk−1模−Pk−1模HTKk−1T)+Pk−1模HTKk−1T=Pk−1模−Kk−1HPk−1模=(I−Kk−1H)Pk−1模
又是和标准卡尔曼滤波里的
P
k
−
1
估
\mathrm{P_{k-1估}}
Pk−1估长得挺像的。
这样扩展卡尔曼滤波的公式全推导完了。
公式总结
- z k 模 ⃗ = f ( z k − 1 模 ⃗ , F k − 1 ) \vec{z_{k模}}=\mathrm{f}(\vec{z_{k-1模}},F_{k-1}) zk模=f(zk−1模,Fk−1)
- P k 模 = A P k − 1 估 A T + W Q W T \mathrm{P_{k模}}=\mathrm{A}\mathrm{P_{k-1估}}\mathrm{A}^T+\mathrm{W}\mathrm{Q}\mathrm{W}^T Pk模=APk−1估AT+WQWT
- K k = P k 模 H T H P k 模 H T + V R V T \mathrm{K_k}=\frac{\mathrm{P_{k模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T} Kk=HPk模HT+VRVTPk模HT
- z k 估 ⃗ = z k 模 ⃗ + K k ∗ ( y k 测 ⃗ − h ( z k 模 ⃗ ) ) \vec{z_{k估}}=\vec{z_{k模}}+\mathrm{K_k}*(\vec{y_{k测}}-\mathrm{h}(\vec{z_{k模}})) zk估=zk模+Kk∗(yk测−h(zk模))
- P k 估 = ( I − K k H ) P k 模 \mathrm{P_{k估}}=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}} Pk估=(I−KkH)Pk模
大致迭代过程和标准卡尔曼滤波一样,这五个公式按照顺序遍历计算。要注意的是标准卡尔曼滤波的 A , V , W \mathrm{A},\mathrm{V},\mathrm{W} A,V,W都是固定的矩阵,而扩展卡尔曼滤波中的 A , V , W \mathrm{A},\mathrm{V},\mathrm{W} A,V,W是雅可比矩阵,每次迭代过程中都需要更新计算一次。