前言
最近看到MPU6050模块有dmp处理功能,并且相关资料上表示接入第三方磁力计,可以使用dmp的九轴融合,但是发现只有dmp六轴融合的固件,没有九轴融合的固件,也就是说InvenSense的手册上声称“我们的dmp支持九轴融合”,但实际上InvenSense又不给出用于MPU6050九轴融合的固件,因此实际上说了等于没有说,这个问题刚开始一直在心中疑惑不解,但最后想来应该就是这样把。
反正6050也没有办法用dmp来做九轴融合,只能在单片机上融合了,实际上这反而给我们学习AHRS的动力,这次希望通过学习总结有所进步。
通过网上查看资料,AHRS又有很多算法,这里准备选择学习扩展卡尔曼,很多博主的AHRS讲解直接默认我们会各种前置知识,但实际上我并不会,所以这个系列作为学习笔记,我会把要用到的内容逐一记录下来。
一、卡尔曼滤波的作用
首先,我认为卡尔曼滤波其实并不是滤波器,其实它是一个估计器,什么意思呢?按我的理解就是我们已知一个系统的状态方程,以及一些测量结果,由于干扰和误差的存在,系统不可能完全按照状态方程运行,我们需要结合测量结果的信息来给出更好的结果。但是通常测量结果也有误差,那么如何利用状态方程和测量结果来做出最优估计呢?这就是卡尔曼滤波要做的事情。
二、卡尔曼滤波的思路
首先系统状态方程为:
x
k
=
Φ
k
−
1
x
k
−
1
+
w
k
−
1
\bm x_k=\bm\Phi_{k-1}\bm x_{k-1}+\bm w_{k-1}
xk=Φk−1xk−1+wk−1
然后测量方程为:
z
k
=
H
k
x
k
+
v
k
\bm z_k=\bm H_k\bm x_k+\bm v_k
zk=Hkxk+vk
其中:
w
k
−
1
\bm w_{k-1}
wk−1是状态方程中的噪声,而
v
k
\bm v_k
vk是测量方程中的噪声。
由于噪声的存在,不管是状态方程还是测量方程,我们都没有办法得到精确的状态,怎么办啊?我们退而求其次,我们来设定一个目标每次都去获得一个最佳估计。
假设第 k − 1 k-1 k−1次的最佳估计状态记为 x ^ k − 1 \bm {\hat x}_{k-1} x^k−1,现在一个的核心问题是怎么得到 x ^ k \bm {\hat x}_k x^k呢?
首先我们想到状态方程好像可以递推出
x
^
k
\bm {\hat x}_k
x^k,但是直接用好像又没有使用测量结果的信息,先不管了,我们先令:
x
^
k
−
=
Φ
k
−
1
x
^
k
−
1
\bm {\hat x}^-_k=\bm\Phi_{k-1}\bm {\hat x}_{k-1}
x^k−=Φk−1x^k−1
噪声嘛就直接丢掉好了,然后嘛,由于没有加入测量信息,所以等号左边那个带负号的递推值通常叫做先验估计值了,意思就是事先估计值了,响应的
x
^
k
\bm {\hat x}_k
x^k可以叫做后验估计,有点事后诸葛亮的意思在里面。
然后我们加入测量的结果企图得到最优的
x
^
k
\bm {\hat x}_k
x^k,这里我们不如这样考虑,
x
^
k
\bm {\hat x}_k
x^k有两部分组成,一部分是事先估计值
x
^
k
−
\bm {\hat x}^-_k
x^k−,第二部分和测量相关,准确的说是这样的当测量值与事先估计值的差别越大,那么第二部分的比重就越大。因此我们用
K
k
(
z
k
−
H
k
x
^
k
−
)
\bm K_k(\bm z_k-\bm H_k\bm {\hat x}^-_k)
Kk(zk−Hkx^k−),来表示第二部分。因此
x
^
k
−
→
x
^
k
\bm {\hat x}^-_k \rightarrow \bm {\hat x}_k
x^k−→x^k的问题就变成了这样子:
x
^
k
=
x
^
k
−
+
K
k
(
z
k
−
H
k
x
^
k
−
)
\bm {\hat x}_k=\bm {\hat x}^-_k+\bm K_k(\bm z_k-\bm H_k\bm {\hat x}^-_k)
x^k=x^k−+Kk(zk−Hkx^k−)
卡尔曼估计的核心问题就是如何找到 K k \bm K_k Kk是的我们的后验估计最优。
三、卡尔曼滤波的推导
卡尔曼滤波器的推导过程中会用到一些假设,不过不用担心这些假设都很自然。
为了使得我们的最优估计(也就是那个后验估计)
x
^
k
\bm {\hat x}_k
x^k与真实状态变量
x
k
\bm x_k
xk尽量接近:
第一,我们可以设计我们的估计方法使得对每一个
k
k
k都有期望:
E
[
x
^
k
−
x
k
]
=
0
E[\bm{\hat x}_k-\bm x_k]=\bm0
E[x^k−xk]=0,一般的说法是要求最优估计是无偏。
类似的,我们来看先验估计
E
[
x
^
k
−
−
x
k
]
E[\bm{\hat x}^-_k-\bm x_k]
E[x^k−−xk],期望是否也为
0
\bm0
0呢?我们来看一下:
E
[
x
^
k
−
−
x
k
]
=
E
[
Φ
k
−
1
x
^
k
−
1
−
x
k
]
=
E
[
Φ
k
−
1
x
^
k
−
1
−
Φ
k
−
1
x
k
−
1
−
w
k
−
1
]
=
Φ
k
−
1
E
[
x
^
k
−
1
−
x
k
−
1
]
−
E
[
w
k
−
1
]
=
0
\begin{aligned} E[\bm{\hat x}^-_k-\bm x_k]&=E[\bm\Phi_{k-1}\bm {\hat x}_{k-1}-\bm x_k]=E[\bm\Phi_{k-1}\bm {\hat x}_{k-1}-\bm\Phi_{k-1}\bm x_{k-1}-\bm w_{k-1}]\\ &=\bm\Phi_{k-1}E[\bm {\hat x}_{k-1}-\bm x_{k-1}]-E[\bm w_{k-1}]=\bm0 \end{aligned}
E[x^k−−xk]=E[Φk−1x^k−1−xk]=E[Φk−1x^k−1−Φk−1xk−1−wk−1]=Φk−1E[x^k−1−xk−1]−E[wk−1]=0
所以先验估计自动满足了无偏的要求,非常nice!!!这样的话我们就非常有信心继续下去了。
然后我们要考虑些什么呢?考虑最优估计值和真实的状态之间的偏离越小越好,仿照最小二乘法的思想,那当然就是要求估计误差的方差最小了。
J
=
E
[
(
x
^
k
−
x
k
)
T
(
x
^
k
−
x
k
)
]
=
E
[
(
x
^
k
−
+
K
k
z
k
−
K
k
H
k
x
^
k
−
−
x
k
)
T
(
x
^
k
−
+
K
k
z
k
−
K
k
H
k
x
^
k
−
−
x
k
)
]
=
E
[
(
x
^
k
−
+
K
k
H
k
x
k
+
K
k
v
k
−
K
k
H
k
x
^
k
−
−
x
k
)
T
(
x
^
k
−
+
K
k
H
k
x
k
+
K
k
v
k
−
K
k
H
k
x
^
k
−
−
x
k
)
]
=
E
{
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
T
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
}
\begin{aligned} J&=E[(\bm{\hat x}_k-\bm x_k)^T(\bm{\hat x}_k-\bm x_k)]=E[(\bm {\hat x}^-_k+\bm K_k\bm z_k-\bm K_k\bm H_k\bm {\hat x}^-_k-\bm x_k)^T(\bm {\hat x}^-_k+\bm K_k\bm z_k-\bm K_k\bm H_k\bm {\hat x}^-_k-\bm x_k)]\\ &=E[(\bm {\hat x}^-_k+\bm K_k\bm H_k\bm x_k+\bm K_k\bm v_k-\bm K_k\bm H_k\bm {\hat x}^-_k-\bm x_k)^T(\bm {\hat x}^-_k+\bm K_k\bm H_k\bm x_k+\bm K_k\bm v_k-\bm K_k\bm H_k\bm {\hat x}^-_k-\bm x_k)]\\ &=E\{[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]^T[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]\} \end{aligned}
J=E[(x^k−xk)T(x^k−xk)]=E[(x^k−+Kkzk−KkHkx^k−−xk)T(x^k−+Kkzk−KkHkx^k−−xk)]=E[(x^k−+KkHkxk+Kkvk−KkHkx^k−−xk)T(x^k−+KkHkxk+Kkvk−KkHkx^k−−xk)]=E{[(I−KkHk)(x^k−−xk)+Kkvk]T[(I−KkHk)(x^k−−xk)+Kkvk]}
问题变成如何选择
K
k
\bm K_k
Kk使得
J
J
J最小呢?
借鉴最小二乘法的经验,我们需要一个关于
K
k
\bm K_k
Kk的二次型,但是上面的
J
J
J中期望括号中直接乘开的话,得到的形式不好用啊!!!原因在于直接乘开的话有关
K
k
\bm K_k
Kk的部分不是在二次型的外侧。如果相乘的顺序可以交换的话就好了:
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
T
[
(
I
−
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
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
T
[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]^T[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]\\ \rightarrow[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k][(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]^T
[(I−KkHk)(x^k−−xk)+Kkvk]T[(I−KkHk)(x^k−−xk)+Kkvk]→[(I−KkHk)(x^k−−xk)+Kkvk][(I−KkHk)(x^k−−xk)+Kkvk]T
???这样做我们确实可以得到关于
K
k
\bm K_k
Kk的二次型,但是两者并不相等,唉……
但是注意到一个特殊情况的事实,任意一个列向量
A
\bm A
A,一定有
A
T
A
=
t
r
[
A
A
T
]
\bm A^T\bm A=tr[\bm A\bm A^T]
ATA=tr[AAT],所以:
J
=
E
{
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
T
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
+
K
k
v
k
]
}
=
E
{
t
r
{
[
(
I
−
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
]
T
}
}
=
E
{
t
r
[
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
(
x
^
k
−
−
x
k
)
T
(
I
−
K
k
H
k
)
T
+
(
I
−
K
k
H
k
)
(
x
^
k
−
−
x
k
)
v
k
T
K
k
T
+
K
k
v
k
(
x
^
k
−
−
x
k
)
T
(
I
−
K
k
H
k
)
T
+
K
k
v
k
v
k
T
K
k
T
]
}
\begin{aligned} J=&E\{[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]^T[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]\}\\ =&E\{tr\{[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k][(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)+\bm K_k\bm v_k]^T\}\}\\ =&E\{tr[(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)(\bm {\hat x}^-_k-\bm x_k)^T(\bm I-\bm K_k\bm H_k)^T+(\bm I-\bm K_k\bm H_k)(\bm {\hat x}^-_k-\bm x_k)\bm v_k^T\bm K_k^T\\ &+\bm K_k\bm v_k(\bm {\hat x}^-_k-\bm x_k)^T(\bm I-\bm K_k\bm H_k)^T+\bm K_k\bm v_k\bm v_k^T\bm K_k^T]\} \end{aligned}
J===E{[(I−KkHk)(x^k−−xk)+Kkvk]T[(I−KkHk)(x^k−−xk)+Kkvk]}E{tr{[(I−KkHk)(x^k−−xk)+Kkvk][(I−KkHk)(x^k−−xk)+Kkvk]T}}E{tr[(I−KkHk)(x^k−−xk)(x^k−−xk)T(I−KkHk)T+(I−KkHk)(x^k−−xk)vkTKkT+Kkvk(x^k−−xk)T(I−KkHk)T+KkvkvkTKkT]}
一个很自然的假设就是状态和噪声无关,于是我们合理地假设
x
^
k
−
−
x
k
\bm {\hat x}^-_k-\bm x_k
x^k−−xk和
v
k
\bm v_k
vk是两个不相关的随机变量。又由于这两个随机变量的期望也是
0
\bm0
0,所以把期望交换到内部一定会导致交叉项出现两个
0
\bm0
0相乘的结果,因此我们得到目标函数的新形式:
J
=
t
r
{
(
I
−
K
k
H
k
)
E
[
(
x
^
k
−
−
x
k
)
(
x
^
k
−
−
x
k
)
T
]
(
I
−
K
k
H
k
)
T
+
K
k
E
[
v
k
v
k
T
]
K
k
T
}
\begin{aligned} J=&tr\{(\bm I-\bm K_k\bm H_k)E[(\bm {\hat x}^-_k-\bm x_k)(\bm {\hat x}^-_k-\bm x_k)^T](\bm I-\bm K_k\bm H_k)^T+\bm K_kE[\bm v_k\bm v_k^T]\bm K_k^T\} \end{aligned}
J=tr{(I−KkHk)E[(x^k−−xk)(x^k−−xk)T](I−KkHk)T+KkE[vkvkT]KkT}
我们记
R
k
=
E
[
v
k
v
k
T
]
\bm R_k=E[\bm v_k\bm v_k^T]
Rk=E[vkvkT]为测量噪声的协方差矩阵,记
P
k
−
=
E
[
(
x
^
k
−
−
x
k
)
(
x
^
k
−
−
x
k
)
T
]
\bm P^-_k=E[(\bm {\hat x}^-_k-\bm x_k)(\bm {\hat x}^-_k-\bm x_k)^T]
Pk−=E[(x^k−−xk)(x^k−−xk)T]为先验估计的偏差的协方差矩阵。
则最终我们把目标函数写成如下形式:
J
=
t
r
[
(
I
−
K
k
H
k
)
P
k
−
(
I
−
K
k
H
k
)
T
+
K
k
R
k
K
k
T
]
J=tr[(\bm I-\bm K_k\bm H_k)\bm P^-_k(\bm I-\bm K_k\bm H_k)^T+\bm K_k\bm R_k\bm K_k^T]
J=tr[(I−KkHk)Pk−(I−KkHk)T+KkRkKkT]
这里再次注意一下,我们的目标函数是一个标量的形式,我们需要确定
K
k
\bm K_k
Kk为何值的时候目标函数最小。因此可以对
K
k
\bm K_k
Kk求导(实际上就是对
K
k
\bm K_k
Kk的每一个元素求偏导),然后让导数为
0
0
0。就可以得到我们需要的
K
k
\bm K_k
Kk了。
即要求对
K
\bm K
K的任意元素
K
i
j
K_{ij}
Kij,有:
∂
J
∂
K
i
j
=
0
\frac{\partial J}{\partial K_{ij}}=0
∂Kij∂J=0
为了得到结果我们把
J
J
J写成分量求和的形式,并且为了书写方便省略掉求和号(即使用求和约定)和下标
k
k
k,如果不熟悉的话可自行写出求和符号:
∂
J
∂
K
i
j
=
∂
{
t
r
[
(
I
−
K
H
)
P
−
(
I
−
K
H
)
T
+
K
R
K
T
]
}
∂
K
i
j
=
∂
[
(
δ
r
s
−
K
r
t
H
t
s
)
P
s
l
−
(
δ
r
l
−
K
r
n
H
n
l
)
+
K
r
s
R
s
l
K
r
l
]
∂
K
i
j
=
−
H
j
s
P
s
l
−
(
δ
i
l
−
K
i
n
H
n
l
)
−
(
δ
i
s
−
K
i
t
H
t
s
)
P
s
l
−
H
j
l
+
R
j
l
K
i
l
+
K
i
s
R
s
j
\begin{aligned} \frac{\partial J}{\partial K_{ij}}=&\frac{\partial\{ tr[(\bm I-\bm K\bm H)\bm P^-(\bm I-\bm K\bm H)^T+\bm K\bm R\bm K^T]\}}{\partial K_{ij}}\\ =&\frac{\partial[(\delta_{rs}-K_{rt}H_{ts})P^-_{sl}(\delta_{rl}-K_{rn} H_{nl})+ K_{rs}R_{sl}K_{rl}]}{\partial K_{ij}}\\ =&-H_{js}P^-_{sl}(\delta_{il}-K_{in} H_{nl}) - (\delta_{is}-K_{it}H_{ts})P^-_{sl}H_{jl}+R_{jl}K_{il}+K_{is}R_{sj} \end{aligned}
∂Kij∂J===∂Kij∂{tr[(I−KH)P−(I−KH)T+KRKT]}∂Kij∂[(δrs−KrtHts)Psl−(δrl−KrnHnl)+KrsRslKrl]−HjsPsl−(δil−KinHnl)−(δis−KitHts)Psl−Hjl+RjlKil+KisRsj
由于协方差矩阵
P
−
\bm P^-
P−和
R
\bm R
R一定是对称的,所以上面的式子可以写成更加简洁的样子:
∂
J
∂
K
i
j
=
−
H
j
s
P
s
l
−
(
δ
i
l
−
K
i
n
H
n
l
)
−
(
δ
i
s
−
K
i
t
H
t
s
)
P
s
l
−
H
j
l
+
R
j
l
K
i
l
+
K
i
s
R
s
j
=
−
2
(
δ
i
s
−
K
i
t
H
t
s
)
P
s
l
−
H
j
l
+
2
K
i
l
R
l
j
\begin{aligned} \frac{\partial J}{\partial K_{ij}} =&-H_{js}P^-_{sl}(\delta_{il}-K_{in} H_{nl}) - (\delta_{is}-K_{it}H_{ts})P^-_{sl}H_{jl}+R_{jl}K_{il}+K_{is}R_{sj}\\ =& - 2(\delta_{is}-K_{it}H_{ts})P^-_{sl}H_{jl}+2K_{il}R_{lj} \end{aligned}
∂Kij∂J==−HjsPsl−(δil−KinHnl)−(δis−KitHts)Psl−Hjl+RjlKil+KisRsj−2(δis−KitHts)Psl−Hjl+2KilRlj
回忆一下最优化条件:
∂
J
∂
K
i
j
=
0
\frac{\partial J}{\partial K_{ij}}=0
∂Kij∂J=0
写成矩阵形式,并且恢复下标
k
k
k:
∂
J
∂
K
k
=
−
2
(
I
−
K
k
H
k
)
P
k
−
H
k
T
+
2
K
k
R
k
=
0
\begin{aligned} \frac{\partial J}{\partial \bm K_k}=& - 2(\bm I-\bm K_k\bm H_k)\bm P^-_k\bm H_k^T+2\bm K_k\bm R_k=\bm0 \end{aligned}
∂Kk∂J=−2(I−KkHk)Pk−HkT+2KkRk=0
因此我们得到最优估计需要使用的
K
k
\bm K_k
Kk,如下:
K
k
=
P
k
−
H
k
T
[
H
k
P
k
−
H
k
T
+
R
k
]
−
1
\begin{aligned} \bm K_k=\bm P^-_k\bm H_k^T[\bm H_k\bm P^-_k\bm H_k^T+\bm R_k]^{-1} \end{aligned}
Kk=Pk−HkT[HkPk−HkT+Rk]−1
到这里,我们的问题基本上得到了问题的解决方案,但是还有一个问题:我们使用了
P
k
−
\bm P^-_k
Pk−,但是我们没有它的递推公式!!!
因此需要详细研究一下
P
k
−
\bm P^-_k
Pk−,其中各种不相关性以及无偏性的使用就直接用了哈:
P
k
−
=
E
[
(
x
^
k
−
−
x
k
)
(
x
^
k
−
−
x
k
)
T
]
=
E
[
(
Φ
k
−
1
x
^
k
−
1
−
Φ
k
−
1
x
k
−
1
−
w
k
−
1
)
(
Φ
k
−
1
x
^
k
−
1
−
Φ
k
−
1
x
k
−
1
−
w
k
−
1
)
T
]
=
Φ
k
−
1
E
[
(
x
^
k
−
1
−
x
k
−
1
)
(
x
^
k
−
1
−
x
k
−
1
)
T
]
Φ
k
−
1
T
+
E
[
w
k
−
1
w
k
−
1
T
]
\begin{aligned} \bm P^-_k=&E[(\bm {\hat x}^-_k-\bm x_k)(\bm {\hat x}^-_k-\bm x_k)^T]\\ =&E[(\bm\Phi_{k-1}\bm {\hat x}_{k-1}-\bm\Phi_{k-1}\bm x_{k-1}-\bm w_{k-1})(\bm\Phi_{k-1}\bm {\hat x}_{k-1}-\bm\Phi_{k-1}\bm x_{k-1}-\bm w_{k-1})^T]\\ =&\bm\Phi_{k-1}E[(\bm {\hat x}_{k-1}-\bm x_{k-1})(\bm {\hat x}_{k-1}-\bm x_{k-1})^T]\bm\Phi_{k-1}^T+E[\bm w_{k-1}\bm w_{k-1}^T] \end{aligned}
Pk−===E[(x^k−−xk)(x^k−−xk)T]E[(Φk−1x^k−1−Φk−1xk−1−wk−1)(Φk−1x^k−1−Φk−1xk−1−wk−1)T]Φk−1E[(x^k−1−xk−1)(x^k−1−xk−1)T]Φk−1T+E[wk−1wk−1T]
如果记:
P
k
−
1
=
E
[
(
x
^
k
−
1
−
x
k
−
1
)
(
x
^
k
−
1
−
x
k
−
1
)
T
]
\bm P_{k-1}=E[(\bm {\hat x}_{k-1}-\bm x_{k-1})(\bm {\hat x}_{k-1}-\bm x_{k-1})^T]
Pk−1=E[(x^k−1−xk−1)(x^k−1−xk−1)T]以及
Q
k
−
1
=
E
[
w
k
−
1
w
k
−
1
T
]
\bm Q_{k-1}=E[\bm w_{k-1}\bm w_{k-1}^T]
Qk−1=E[wk−1wk−1T],则上式化为:
P
k
−
=
Φ
k
−
1
P
k
−
1
Φ
k
−
1
T
+
Q
k
−
1
\begin{aligned} \bm P^-_k=\bm\Phi_{k-1}\bm P_{k-1}\bm\Phi_{k-1}^T+\bm Q_{k-1} \end{aligned}
Pk−=Φk−1Pk−1Φk−1T+Qk−1
现在,我们搞清楚了递推关系:
P
→
P
−
\bm P\rightarrow\bm P^-
P→P−,但是
P
\bm P
P由怎么得到呢?
我们来试一下:
P
k
=
E
[
(
x
^
k
−
x
k
)
(
x
^
k
−
x
k
)
T
]
=
E
{
[
x
^
k
−
+
K
k
(
z
k
−
H
k
x
^
k
−
)
−
x
k
]
[
x
^
k
−
+
K
k
(
z
k
−
H
k
x
^
k
−
)
−
x
k
]
T
}
\begin{aligned} \bm P_k=&E[(\bm {\hat x}_k-\bm x_k)(\bm {\hat x}_k-\bm x_k)^T]\\ =&E\{[\bm {\hat x}^-_k+\bm K_k(\bm z_k-\bm H_k\bm {\hat x}^-_k)-\bm x_k][\bm {\hat x}^-_k+\bm K_k(\bm z_k-\bm H_k\bm {\hat x}^-_k)-\bm x_k]^T\}\\ \end{aligned}
Pk==E[(x^k−xk)(x^k−xk)T]E{[x^k−+Kk(zk−Hkx^k−)−xk][x^k−+Kk(zk−Hkx^k−)−xk]T}
这样又有一大堆推导了,蛋疼得很,但是仔细观察我们之前
J
=
E
[
(
x
^
k
−
x
k
)
T
(
x
^
k
−
x
k
)
]
J=E[(\bm{\hat x}_k-\bm x_k)^T(\bm{\hat x}_k-\bm x_k)]
J=E[(x^k−xk)T(x^k−xk)],仔细对比一下
J
J
J的推导过程,我们发现原来
P
k
\bm P_k
Pk根本就不用重新推导,直接可以看出:
P
k
=
(
I
−
K
k
H
k
)
P
k
−
(
I
−
K
k
H
k
)
T
+
K
k
R
k
K
k
T
\begin{aligned} \bm P_k=(\bm I-\bm K_k\bm H_k)\bm P^-_k(\bm I-\bm K_k\bm H_k)^T+\bm K_k\bm R_k\bm K_k^T \end{aligned}
Pk=(I−KkHk)Pk−(I−KkHk)T+KkRkKkT
这个公式还可以化简:
P
k
=
(
I
−
K
k
H
k
)
P
k
−
(
I
−
K
k
H
k
)
T
+
K
k
R
k
K
k
T
=
(
I
−
K
k
H
k
)
P
k
−
+
(
I
−
K
k
H
k
)
P
k
−
H
k
T
K
k
T
+
K
k
R
k
K
k
T
=
(
I
−
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
k
T
\begin{aligned} \bm P_k=&(\bm I-\bm K_k\bm H_k)\bm P^-_k(\bm I-\bm K_k\bm H_k)^T+\bm K_k\bm R_k\bm K_k^T\\ =&(\bm I-\bm K_k\bm H_k)\bm P^-_k+(\bm I-\bm K_k\bm H_k)\bm P^-_k\bm H_k^T\bm K_k^T+\bm K_k\bm R_k\bm K_k^T\\ =&(\bm I-\bm K_k\bm H_k)\bm P^-_k+\bm P^-_k\bm H_k^T\bm K_k^T-\bm K_k(\bm H_k\bm P^-_k\bm H_k^T+\bm R_k)\bm K_k^T \end{aligned}
Pk===(I−KkHk)Pk−(I−KkHk)T+KkRkKkT(I−KkHk)Pk−+(I−KkHk)Pk−HkTKkT+KkRkKkT(I−KkHk)Pk−+Pk−HkTKkT−Kk(HkPk−HkT+Rk)KkT
注意到:
K
k
=
P
k
−
H
k
T
[
H
k
P
k
−
H
k
T
+
R
k
]
−
1
\begin{aligned} \bm K_k=\bm P^-_k\bm H_k^T[\bm H_k\bm P^-_k\bm H_k^T+\bm R_k]^{-1} \end{aligned}
Kk=Pk−HkT[HkPk−HkT+Rk]−1
上面公式的最后一项减号后面恰好是:
P
k
−
H
k
T
K
k
T
\bm P^-_k\bm H_k^T\bm K_k^T
Pk−HkTKkT,因此公式得到化简:
P
k
=
(
I
−
K
k
H
k
)
P
k
−
\begin{aligned} \bm P_k=(\bm I-\bm K_k\bm H_k)\bm P^-_k \end{aligned}
Pk=(I−KkHk)Pk−
到现在为止
P
−
→
P
\bm P^-\rightarrow\bm P
P−→P也解决了,这样我们随着
k
k
k的增加,我们发现可以使用套娃递推来解决
P
\bm P
P的问题了:
P
k
−
1
−
→
P
k
−
1
→
P
k
−
→
P
k
→
P
k
+
1
−
⋯
\bm P^-_{k-1}\rightarrow\bm P_{k-1}\rightarrow\bm P^-_k\rightarrow\bm P_k\rightarrow\bm P^-_{k+1}\cdots
Pk−1−→Pk−1→Pk−→Pk→Pk+1−⋯
四、卡尔曼滤波公式
我们把卡尔曼递推公式和使用步骤总结一下:
(1)系统建模:
x
k
=
Φ
k
−
1
x
k
−
1
+
w
k
−
1
z
k
=
H
k
x
k
+
v
k
\begin{aligned} \bm x_k=&\bm\Phi_{k-1}\bm x_{k-1}+\bm w_{k-1}\\ \bm z_k=&\bm H_k\bm x_k+\bm v_k \end{aligned}
xk=zk=Φk−1xk−1+wk−1Hkxk+vk
其中,各种噪声的期望都为
0
\bm0
0,并且两个时刻之间的噪声不相关,因此描述噪声相关性的协方差矩阵只有:
Q
k
=
E
[
w
k
w
k
T
]
R
k
=
E
[
v
k
v
k
T
]
\begin{aligned} \bm Q_k=&E[\bm w_k\bm w_k^T]\\ \bm R_k=&E[\bm v_k\bm v_k^T] \end{aligned}
Qk=Rk=E[wkwkT]E[vkvkT]
(2)初始条件
x
^
0
−
=
E
[
x
0
]
P
k
−
=
E
[
(
x
^
0
−
−
x
0
)
(
x
^
0
−
−
x
0
)
T
]
\begin{aligned} \bm {\hat x}^-_0=&E[\bm x_0]\\ \bm P^-_k=&E[(\bm {\hat x}^-_0-\bm x_0)(\bm {\hat x}^-_0-\bm x_0)^T] \end{aligned}
x^0−=Pk−=E[x0]E[(x^0−−x0)(x^0−−x0)T]
(3)卡尔曼滤波
第一步:状态预测(先验)
x
^
k
−
=
Φ
k
−
1
x
^
k
−
1
P
k
−
=
Φ
k
−
1
P
k
−
1
Φ
k
−
1
T
+
Q
k
−
1
\begin{aligned} \bm {\hat x}^-_k=&\bm\Phi_{k-1}\bm {\hat x}_{k-1}\\ \bm P^-_k=&\bm\Phi_{k-1}\bm P_{k-1}\bm\Phi_{k-1}^T+\bm Q_{k-1} \end{aligned}
x^k−=Pk−=Φk−1x^k−1Φk−1Pk−1Φk−1T+Qk−1
第二步:测量更新(后验)
K
k
=
P
k
−
H
k
T
[
H
k
P
k
−
H
k
T
+
R
k
]
−
1
x
^
k
=
x
^
k
−
+
K
k
(
z
k
−
H
k
x
^
k
−
)
P
k
=
(
I
−
K
k
H
k
)
P
k
−
\begin{aligned} \bm K_k=&\bm P^-_k\bm H_k^T[\bm H_k\bm P^-_k\bm H_k^T+\bm R_k]^{-1}\\ \bm {\hat x}_k=&\bm {\hat x}^-_k+\bm K_k(\bm z_k-\bm H_k\bm {\hat x}^-_k)\\ \bm P_k=&(\bm I-\bm K_k\bm H_k)\bm P^-_k \end{aligned}
Kk=x^k=Pk=Pk−HkT[HkPk−HkT+Rk]−1x^k−+Kk(zk−Hkx^k−)(I−KkHk)Pk−
总结
本文的目的是梳理一下卡尔曼滤波的设计思路,并从头推导了一遍滤波公式,对于一些假设不追求过分严谨,只要是直觉上合理就行,最后我们得到了卡尔曼滤波公式,这里得到了一组递推滤波公式,当然也有其他的一些等价形式,这里就不讨论了。