卡尔曼滤波学习记录
前言
博主是做无人驾驶车辆建图与定位的,所以针对于车辆方面来浅显的学习。
这一部分是关于卡尔曼滤波器的理论部分,言简意赅,只写关键的东西。
卡尔曼滤波的核心就是预测与更新。预测一个理论值,再根据测量值去修正这个理论值。
预测的值称为预测值,修正后的值称为估计值。
推理过程
方程
卡尔曼滤波主要用于测量数据与推测数据的融合,浅显的解释就是,我用一个系统算了一个值,比如说车速,我还有一个传感器能够测一个车速,这两个速度值都存在着不同程度的误差,那么我就把他俩融合起来,求一个比较准确的速度。
处理方程
处理方程就是抽象实际情况中的系统状态,得到处理模型方程。
一般我们遇到的处理方程是这样:
x
k
=
A
x
k
−
1
+
B
u
k
+
ϵ
\LARGE x_k=Ax_{k-1}+Bu_k+\epsilon
xk=Axk−1+Buk+ϵ
其中传递的意思就是,该系统
k
k
k时刻的状态
x
k
x_k
xk由
k
−
1
k-1
k−1时刻的状态
x
k
−
1
x_{k-1}
xk−1与转换矩阵
A
A
A作用
+
+
+输入的数据
u
k
u_k
uk与转换矩阵
B
B
B作用+噪声
ϵ
\epsilon
ϵ。
注意:该方程也常称为预测方程,即我们通过这个方程算出来的
x
t
x_t
xt是一个理论值。真实情况还需要用理论结合实际测量值计算出来。
用一个匀加速直线运动举例,根据物理知识,易得方程组
S
k
=
S
k
−
1
+
V
k
−
1
Δ
t
+
1
2
a
(
Δ
t
)
2
\LARGE S_k=S_{k-1}+V_{k-1}\Delta t+\frac{1}{2}a(\Delta t)^2
Sk=Sk−1+Vk−1Δt+21a(Δt)2
V
k
=
V
k
−
1
+
a
Δ
t
\LARGE V_k=V_{k-1}+a\Delta t
Vk=Vk−1+aΔt
S
S
S是位移,
V
V
V是速度,
a
a
a是加速度,
Δ
t
\Delta t
Δt是间隔时间,即
k
k
k时刻与
k
−
1
k-1
k−1时刻的时间差值
把这个方程组和状态方程进行类比,我们可以得到
[
S
k
V
k
]
=
[
1
Δ
t
0
1
]
∗
[
S
k
−
1
V
k
−
1
]
+
[
1
2
a
(
Δ
t
)
2
Δ
t
]
∗
a
\LARGE \begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}\quad =\begin{bmatrix}1&\Delta t\\0&1\end{bmatrix}*\begin{bmatrix}S_{k-1}\\V_{k-1}\end{bmatrix} +\begin{bmatrix}\frac{1}{2}a(\Delta t)^2\\\Delta t\end{bmatrix}*a
⎣⎢⎡SkVk⎦⎥⎤=⎣⎢⎡10Δt1⎦⎥⎤∗⎣⎢⎡Sk−1Vk−1⎦⎥⎤+⎣⎢⎡21a(Δt)2Δt⎦⎥⎤∗a
状态方程里面的
x
k
=
[
S
k
V
k
]
x_k=\begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}
xk=[SkVk]
A
=
[
1
Δ
t
0
1
]
A=\begin{bmatrix}1&\Delta t \\0&1\end{bmatrix}
A=[10Δt1]
B
=
[
1
2
(
Δ
t
)
2
Δ
t
]
B=\begin{bmatrix}\frac{1}{2}(\Delta t)^2\\\Delta t\end{bmatrix}
B=[21(Δt)2Δt]
u
k
=
a
u_k=a
uk=a
此时我们并没有考虑噪声的存在情况,及处理方程里面的
ϵ
t
\epsilon_t
ϵt
既然我们现在有了处理方程,那么直接进行计算不就行了吗?为啥还要参考测量值呢?那是因为真实的世界环境中,一个系统的状态非常复杂,往往无法精确建模,如果只按照处理方程来进行计算,那么每次计算就会对误差进行
A
A
A倍的放大,会越来越不准,所以需要引入测量量和系统噪声,
ϵ
t
\epsilon_t
ϵt就是状态方程的噪声
测量方程
测量方程指的是系统 t t t时刻状态 x t x_t xt映射出来的一些特征 z t z_t zt
z
k
=
H
x
k
+
ν
\LARGE z_k=Hx_k+\nu
zk=Hxk+ν
测量方程中的
x
k
x_k
xk同状态方程中的
x
k
x_k
xk,
ν
\nu
ν是测量噪声,没有百分百能够测得准的传感器,
z
k
z_k
zk是测量值,
H
H
H是映射矩阵,把状态值变化为测量值
回到我们的例子里面,假设我们在起点处放置了一个传感器,该传感器可以测得位移大小,那么我们的测量方程就是
z
k
=
[
1
0
]
∗
[
S
k
V
k
]
z_k=\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}S_k\\V_k\end{bmatrix}
zk=[10]∗[SkVk]
注:此处没有写出噪声 那么
H
=
[
1
0
]
H=\begin{bmatrix}1&0\end{bmatrix}
H=[10]
对于测量方程,其实测量值
z
z
z是我们通过传感器去测量得到的,那么这个方程由什么作用呢,这个方程的作用就是带入我们在状态方程中求的
x
k
x_k
xk,称为预测值,记为
x
k
^
\hat{x_k}
xk^,然后计算
x
k
^
\hat{x_k}
xk^的测量值
z
k
z_k
zk,记为
z
k
^
\hat{z_k}
zk^,再和实际情况下通过测量得到的
z
t
z_t
zt进行比较,继而进行融合
方程小汇总
此处对上述所提到的方程进行一个小的汇总
处理方程
x k = A x k − 1 + B u k + ϵ \LARGE x_k=Ax_{k-1}+Bu_k+\epsilon xk=Axk−1+Buk+ϵ
测量方程
z k = H x k + ν \LARGE z_k=Hx_k+\nu zk=Hxk+ν
例
按照匀加速运动的例子
处理方程
[
S
k
V
k
]
=
[
1
Δ
t
0
1
]
∗
[
S
k
−
1
V
k
−
1
]
+
[
1
2
a
(
Δ
t
)
2
Δ
t
]
∗
a
+
ϵ
\LARGE \begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}\quad =\begin{bmatrix}1&\Delta t\\0&1\end{bmatrix}*\begin{bmatrix}S_{k-1}\\V_{k-1}\end{bmatrix} +\begin{bmatrix}\frac{1}{2}a(\Delta t)^2\\\Delta t\end{bmatrix}*a+\epsilon
⎣⎢⎡SkVk⎦⎥⎤=⎣⎢⎡10Δt1⎦⎥⎤∗⎣⎢⎡Sk−1Vk−1⎦⎥⎤+⎣⎢⎡21a(Δt)2Δt⎦⎥⎤∗a+ϵ
其中
x
k
=
[
S
k
V
k
]
x_k=\begin{bmatrix} S_{k}\\V_{k} \end{bmatrix}
xk=[SkVk]
A
=
[
1
Δ
t
0
1
]
A=\begin{bmatrix}1&\Delta t \\0&1\end{bmatrix}
A=[10Δt1]
B
=
[
1
2
(
Δ
t
)
2
Δ
t
]
B=\begin{bmatrix}\frac{1}{2}(\Delta t)^2\\\Delta t\end{bmatrix}
B=[21(Δt)2Δt]
u
k
=
a
u_k=a
uk=a
ϵ
\epsilon
ϵ是处理方程的噪声
测量方程
z
k
=
[
1
0
]
∗
[
S
k
V
k
]
+
ν
\LARGE z_k=\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}S_k\\V_k\end{bmatrix}+\nu
zk=[10]∗⎣⎢⎡SkVk⎦⎥⎤+ν
其中
z
k
=
[
S
k
]
z_k=\begin{bmatrix}S_k\end{bmatrix}
zk=[Sk]
H
=
[
1
0
]
H=\begin{bmatrix}1&0\end{bmatrix}
H=[10]
ν
\nu
ν是测量过程的噪声
噪声处理
现在我们开始考虑两个方程中噪声的问题
对于
ϵ
\epsilon
ϵ和
ν
\nu
ν假设这两个噪声服从如下的多元高斯分布
p
(
ϵ
)
∼
N
(
0
,
Q
)
p
(
ν
)
∼
N
(
0
,
R
)
\LARGE p(\epsilon)\thicksim N(0,Q)\\p(\nu)\thicksim N(0,R)
p(ϵ)∼N(0,Q)p(ν)∼N(0,R)
为什么噪声应当服从高斯分布呢?继续往下
我们假设系统噪声只位于速度分量上,且速度噪声的方差是一个常量0.01,那么就有
Q
=
[
0
0
0
0.01
]
Q=\begin{bmatrix}0&0\\0&0.01\end{bmatrix}
Q=[0000.01]
这个Q表示的意思是,在模型的处理方程中,在速度上系统噪声方差为0.01,位移上的为0,二者的协方差为零,说明二者的噪声独立,互不相关
预测与更新
有了之前的说明,那么我们就要进行数据的融合工作,即通过预测值和测量值得到一个最优的估计值
定义几个值
x
k
′
^
\hat{x'_k}
xk′^是预测(先验)值,即使用状态方程计算出来的值
x
k
^
\hat{x_k}
xk^是估计值,即用预测值和测量值融合得到的结果
z
k
^
\hat{z_k}
zk^是预测测量值,即把
x
k
′
^
\hat{x'_k}
xk′^带入测量方程计算的预测测量值
z
k
z_k
zk是实际的测量值
估计值计算方程
x
k
^
=
x
k
′
^
+
K
k
(
z
k
−
z
k
^
)
=
x
k
′
^
+
K
k
(
z
k
−
H
(
x
k
′
^
)
)
\huge \hat{x_k}=\hat{x'_k}+K_k(z_k-\hat{z_k})\\ \qquad \quad=\hat{x'_k}+K_k(z_k-H(\hat{x'_k}))
xk^=xk′^+Kk(zk−zk^)=xk′^+Kk(zk−H(xk′^))
其中
z
k
−
z
k
^
=
z
k
−
H
(
x
k
′
^
)
z_k-\hat{z_k}=z_k-H(\hat{x'_k})
zk−zk^=zk−H(xk′^) 这个东西称为残差,其实就是实际测量值与预测测量值的差
对于这个方程,我们可以从特殊情况下来看待理解它。
如果残差为零,那么说明真实测量与预测测量没有差别,那么
x
k
^
=
x
k
′
^
+
K
k
∗
0
⃗
即
x
k
^
=
x
k
′
^
\huge \hat{x_k}=\hat{x'_k}+K_k*\vec0\\即\hat{x_k}=\hat{x'_k}
xk^=xk′^+Kk∗0即xk^=xk′^那么说明预测值与估计值一样
如果
K
k
=
0
K_k=0
Kk=0,说明我们就不考虑测量值对于系统状态的影响,我们只信赖状态方程估算的数据,那么
x
k
^
=
x
k
′
^
+
0
⃗
∗
(
z
k
−
z
k
^
)
即
x
k
^
=
x
k
′
^
\huge \hat{x_k}=\hat{x'_k}+\vec0*(z_k-\hat{z_k})\\即\hat{x_k}=\hat{x'_k}
xk^=xk′^+0∗(zk−zk^)即xk^=xk′^
如果
K
k
=
1
K_k=1
Kk=1,说明我们非常信赖测量的数据,那么
x
k
^
=
x
k
′
^
+
1
⃗
∗
(
z
k
−
z
k
^
)
=
x
k
′
^
+
z
k
−
z
k
^
=
x
k
′
^
+
z
k
−
H
x
k
′
^
\huge \quad\hat{x_k}=\hat{x'_k}+\vec1*(z_k-\hat{z_k})\\ =\hat{x'_k}+z_k-\hat{z_k}\\ \quad=\hat{x'_k}+z_k-H\hat{x'_k}\\
xk^=xk′^+1∗(zk−zk^)=xk′^+zk−zk^=xk′^+zk−Hxk′^
根据匀加速直线运动的例子我们继续展开上式
[
S
k
^
V
k
^
]
=
[
S
k
′
^
V
k
′
^
]
+
[
S
k
测
0
]
−
[
1
0
]
∗
[
S
k
′
^
V
k
′
^
]
=
[
S
k
测
V
k
′
^
]
\huge\begin{bmatrix}\hat{S_k}\\\hat{V_k}\end{bmatrix}=\begin{bmatrix}\hat{S'_k}\\\hat{V'_k}\end{bmatrix}+\begin{bmatrix}S_{k测}\\0\end{bmatrix}-\begin{bmatrix}1&0\end{bmatrix}*\begin{bmatrix}\hat{S'_k}\\\hat{V'_k}\end{bmatrix}=\begin{bmatrix}S_{k测}\\\hat{V'_k}\end{bmatrix}
⎣⎢⎢⎢⎡Sk^Vk^⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡Sk′^Vk′^⎦⎥⎥⎥⎤+⎣⎢⎢⎡Sk测0⎦⎥⎥⎤−[10]∗⎣⎢⎢⎢⎡Sk′^Vk′^⎦⎥⎥⎥⎤=⎣⎢⎢⎡Sk测Vk′^⎦⎥⎥⎤
由此可以看出,当
K
k
=
1
K_k=1
Kk=1时,我们对于测量方程的测量结果完全信任,对于能够测量到的数据,一律认为是我们的估计值
所以对于估计值计算方程。
我们可以理解为
K
k
K_k
Kk是残差的系数,我们融合的就是预测值和残差,关键就在于如何求解这个
K
k
\huge K_k
Kk
残差系数的求解
估计值和真实值的差距
P
k
=
E
[
e
k
e
k
T
]
=
E
[
(
x
k
−
x
k
^
)
(
x
k
−
x
k
^
)
T
]
P_k = E[e_ke^T_k]=E[(x_k-\hat{x_k})(x_k-\hat{x_k})^T]
Pk=E[ekekT]=E[(xk−xk^)(xk−xk^)T]
这个是真实值与估计值的协防差矩阵
e
k
e_k
ek是一个向量,它是由系统状态的变量组成的,在例子中就是由
S
S
S和
V
V
V组成,即位移和速度。那么就有
P k = [ E ( S e r r S e r r T ) E ( S e r r V e r r T ) E ( V e r r S e r r T ) E ( V e r r V e r r T ) ] P_k=\begin{bmatrix}E(S_{err}S^T_{err}) &E(S_{err}V^T_{err})\\E(V_{err}S^T_{err}) &E(V_{err}V^T_{err})\end{bmatrix} Pk=[E(SerrSerrT)E(VerrSerrT)E(SerrVerrT)E(VerrVerrT)]
S e r r S_{err} Serr是位移的误差, V e r r V_{err} Verr是速度的误差,对角线上是他们各自的方差
x k − x k ^ = x k − ( x k ′ ^ + K k ( z k − z k ^ ) )       = x k − ( x k ′ ^ + K k ( H k x k + ν k − H k x k ′ ^ ) )       = x k − x k ′ ^ − K k H k x k − K k ν k + K k H k x k ′ ^       = ( I − K k H k ) ( x k − x k ′ ^ ) − K k ν k x_k-\hat{x_k}=x_k-(\hat {x'_k}+K_k(z_k-\hat{z_k})) \\\qquad\quad\;\;\, =x_k-(\hat {x'_k}+K_k(H_kx_k+\nu_k-H_k\hat{x'_k})) \\\qquad\quad\;\;\,=x_k-\hat{x'_k}-K_kH_kx_k-K_k\nu_k+K_kH_k\hat{x'_k} \\\qquad\quad\;\;\,=(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k xk−xk^=xk−(xk′^+Kk(zk−zk^))=xk−(xk′^+Kk(Hkxk+νk−Hkxk′^))=xk−xk′^−KkHkxk−Kkνk+KkHkxk′^=(I−KkHk)(xk−xk′^)−Kkνk
此处 z k ^ = H k x k ′ ^ \hat{z_k}=H_k\hat{x'_k} zk^=Hkxk′^,为什么没有噪声呢,博主自己理解的是,因为这个值不是真实测量的所以不引入噪声。就算如果引入了噪声,那么根据 z k − z k ^ z_k-\hat{z_k} zk−zk^,噪声就被消去了,噪声就没用了。博主认为应该似乎就是这种原因吧。
把
x
k
−
x
k
^
x_k-\hat{x_k}
xk−xk^的表达式代入,直接展开,又因为
x
k
x_k
xk与
ν
k
\nu_k
νk是相互独立的,所以有
E
[
A
ν
k
]
=
E
[
A
]
E
[
ν
k
]
E[A\nu_k]=E[A]E[\nu_k]
E[Aνk]=E[A]E[νk],
A
A
A是一个表达式,且
E
[
ν
k
]
=
0
E[\nu_k]=0
E[νk]=0,所以只带有
ν
k
\nu_k
νk的期望项都为零
P
k
=
E
[
[
(
I
−
K
k
H
k
)
(
x
k
−
x
k
′
^
)
−
K
k
ν
k
]
[
(
I
−
K
k
H
k
)
(
x
k
−
x
k
′
^
)
−
K
k
ν
k
]
T
]
   
=
E
[
[
(
I
−
K
k
H
k
)
(
x
k
−
x
k
′
^
)
−
K
k
ν
k
]
[
(
x
−
x
k
′
^
)
T
(
I
−
K
k
H
k
)
T
−
ν
k
T
K
k
T
]
]
   
=
E
[
(
I
−
K
k
H
k
)
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
(
I
−
K
k
H
k
)
T
+
K
k
ν
k
ν
k
T
K
k
T
]
   
=
(
I
−
K
k
H
k
)
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
(
I
−
K
k
H
k
)
T
+
K
k
E
[
ν
k
ν
k
T
]
K
k
T
P_k=E\begin{bmatrix}[(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k][(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k]^T\end{bmatrix} \\\quad\;\,=E\begin{bmatrix}[(I-K_kH_k)(x_k-\hat{x'_k})-K_k\nu_k][(x-\hat{x'_k})^T(I-K_kH_k)^T-\nu_k^TK_k^T]\end{bmatrix} \\\quad\;\,=E\begin{bmatrix}(I-K_kH_k)(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T(I-K_kH_k)^T+K_k\nu_k\nu_k^TK_k^T\end{bmatrix} \\\quad\;\,=(I-K_kH_k)E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}(I-K_kH_k)^T+K_kE\begin{bmatrix}\nu_k\nu_k^T\end{bmatrix}K_k^T
Pk=E[[(I−KkHk)(xk−xk′^)−Kkνk][(I−KkHk)(xk−xk′^)−Kkνk]T]=E[[(I−KkHk)(xk−xk′^)−Kkνk][(x−xk′^)T(I−KkHk)T−νkTKkT]]=E[(I−KkHk)(xk−xk′^)(xk−xk′^)T(I−KkHk)T+KkνkνkTKkT]=(I−KkHk)E[(xk−xk′^)(xk−xk′^)T](I−KkHk)T+KkE[νkνkT]KkT
又因为
E
[
ν
k
ν
k
T
]
=
R
E\begin{bmatrix}\nu_k\nu_k^T\end{bmatrix}=R
E[νkνkT]=R,所以就有
P
k
=
(
I
−
K
k
H
k
)
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
(
I
−
K
k
H
k
)
T
+
K
k
R
K
k
T
P_k=(I-K_kH_k)E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}(I-K_kH_k)^T+K_kRK_k^T
Pk=(I−KkHk)E[(xk−xk′^)(xk−xk′^)T](I−KkHk)T+KkRKkT
我们发现此时在
P
k
P_k
Pk中出现了一个期望
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}
E[(xk−xk′^)(xk−xk′^)T],由前面可知,这是真实值与预测值的协方差矩阵
所以有
P
k
′
=
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
P'_k=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}
Pk′=E[(xk−xk′^)(xk−xk′^)T]
P
k
′
P'_k
Pk′是真实值与预测值的协方差矩阵
现在回到
P
k
P_k
Pk的表达式
P
k
=
(
I
−
K
k
H
k
)
P
k
′
(
I
−
K
k
H
k
)
T
+
K
k
R
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
+
R
)
K
k
T
P_k=(I-K_kH_k)P'_k(I-K_kH_k)^T+K_kRK_k^T\\ \quad\;\,=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+K_k(H_kP'_kH_k^T+R)K_k^T
Pk=(I−KkHk)Pk′(I−KkHk)T+KkRKkT=Pk′−KkHkPk′−Pk′HkTKkT+Kk(HkPk′HkT+R)KkT
我们希望求到最小均方差,那么
P
k
P_k
Pk的迹(矩阵对角线元素之和,也是均方差)应该最小,所以
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
+
R
)
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
+
R
)
K
k
T
]
tr(P_k)=tr(P'_k)-tr(K_kH_kP'_k)-tr(P'_kH_k^TK_k^T)+tr[K_k(H_kP'_kH_k^T+R)K_k^T]\\ \qquad\;\;\;\,=tr(P'_k)-2tr(K_kH_kP'_k)+tr[K_k(H_kP'_kH_k^T+R)K_k^T]
tr(Pk)=tr(Pk′)−tr(KkHkPk′)−tr(Pk′HkTKkT)+tr[Kk(HkPk′HkT+R)KkT]=tr(Pk′)−2tr(KkHkPk′)+tr[Kk(HkPk′HkT+R)KkT]
对
K
k
K_k
Kk求偏导,此处需要用到两个矩阵微分公式
公式一:
∂
t
r
(
A
B
)
∂
A
=
B
T
\frac{\partial tr(AB)}{\partial A}=B^T
∂A∂tr(AB)=BT
公式二:
∂
t
r
(
A
B
A
T
)
∂
A
=
2
A
B
\frac{\partial tr(ABA^T)}{\partial A}=2AB
∂A∂tr(ABAT)=2AB
∂
t
r
(
P
k
)
∂
K
k
   
=
−
∂
2
t
r
(
K
k
H
k
P
k
′
)
∂
K
k
+
∂
t
r
[
K
k
(
H
k
P
k
′
H
k
T
+
R
)
K
k
T
]
∂
K
k
=
−
2
(
H
k
P
k
′
)
T
+
2
K
k
(
H
P
k
′
H
T
+
R
)
\frac{\partial tr(P_k)}{\partial K_k}\;\,=-\frac{\partial2tr(K_kH_kP'_k)}{\partial K_k}+\frac{\partial tr[K_k(H_kP'_kH_k^T+R)K_k^T]}{\partial K_k}\\=-2(H_kP'_k)^T+2K_k(HP'_kH^T+R)
∂Kk∂tr(Pk)=−∂Kk∂2tr(KkHkPk′)+∂Kk∂tr[Kk(HkPk′HkT+R)KkT]=−2(HkPk′)T+2Kk(HPk′HT+R)
为了求得最小值,偏导应该为零,对于协方差矩阵
P
=
P
T
P=P^T
P=PT
0
=
−
2
(
H
k
P
k
′
)
T
+
2
K
k
(
H
P
k
′
H
T
+
R
)
0=-2(H_kP'_k)^T+2K_k(HP'_kH^T+R)
0=−2(HkPk′)T+2Kk(HPk′HT+R)
整理可得
卡尔曼增益的表达式
K
k
=
P
k
′
H
k
T
(
H
P
k
′
H
T
+
R
)
−
\huge K_k=P'_kH_k^T(HP'_kH^T+R)^-
Kk=Pk′HkT(HPk′HT+R)−
得到了
K
k
K_k
Kk的计算方法,只需求出
P
k
′
P_k'
Pk′(真实值与预测值的协方差矩阵)即可
预测值和真实值的差距
P
k
′
=
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
  
=
E
[
(
x
k
−
x
k
′
^
)
(
x
k
−
x
k
′
^
)
T
]
  
=
E
[
(
A
k
x
k
+
B
k
u
k
+
ϵ
k
−
A
k
x
^
k
−
1
−
B
k
u
k
)
(
A
k
x
k
+
B
k
u
k
+
ϵ
k
−
A
k
x
^
k
−
1
−
B
k
u
k
)
T
]
  
=
E
[
(
A
k
(
x
k
−
x
^
k
−
1
)
+
ϵ
k
)
(
A
k
(
x
k
−
x
^
k
−
1
)
+
ϵ
k
)
T
]
  
=
E
[
(
A
k
(
x
k
−
x
^
k
−
1
)
(
A
k
(
x
k
−
x
^
k
−
1
)
T
]
+
E
[
ϵ
k
ϵ
k
T
]
P'_k=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(x_k-\hat{x'_k})(x_k-\hat{x'_k})^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_kx_k+B_ku_k+\epsilon_k-A_k\hat{x}_{k-1}-B_ku_k)(A_kx_k+B_ku_k+\epsilon_k-A_k\hat{x}_{k-1}-B_ku_k)^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_k(x_k-\hat{x}_{k-1})+\epsilon_k)(A_k(x_k-\hat{x}_{k-1})+\epsilon_k)^T\end{bmatrix}\\ \quad\;=E\begin{bmatrix}(A_k(x_k-\hat{x}_{k-1})(A_k(x_k-\hat{x}_{k-1})^T\end{bmatrix}+E\begin{bmatrix}\epsilon_k\epsilon_k^T\end{bmatrix}
Pk′=E[(xk−xk′^)(xk−xk′^)T]=E[(xk−xk′^)(xk−xk′^)T]=E[(Akxk+Bkuk+ϵk−Akx^k−1−Bkuk)(Akxk+Bkuk+ϵk−Akx^k−1−Bkuk)T]=E[(Ak(xk−x^k−1)+ϵk)(Ak(xk−x^k−1)+ϵk)T]=E[(Ak(xk−x^k−1)(Ak(xk−x^k−1)T]+E[ϵkϵkT]
    
=
A
k
P
k
−
1
A
k
T
+
Q
\huge\;\;=A_kP_{k-1}A_k^T+Q
=AkPk−1AkT+Q
使用卡尔曼增益去更新估计值与真实值的差距
把卡尔曼增益表达式代入
P
k
P_k
Pk表达式
K
k
=
P
k
′
H
k
T
(
H
P
k
′
H
T
+
R
)
−
K_k=P'_kH_k^T(HP'_kH^T+R)^-
Kk=Pk′HkT(HPk′HT+R)−
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
+
R
)
K
k
T
P_k=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+K_k(H_kP'_kH_k^T+R)K_k^T
Pk=Pk′−KkHkPk′−Pk′HkTKkT+Kk(HkPk′HkT+R)KkT
注意仅带入到第三项的
K
k
K_k
Kk中
P
k
=
P
k
′
−
K
k
H
k
P
k
′
−
P
k
′
H
k
T
K
k
T
+
P
k
′
H
k
T
(
H
P
k
′
H
T
+
R
)
−
(
H
k
P
k
′
H
k
T
+
R
)
K
k
T
P_k=P'_k-K_kH_kP'_k-P'_kH_k^TK_k^T+P'_kH_k^T(HP'_kH^T+R)^-(H_kP'_kH_k^T+R)K_k^T
Pk=Pk′−KkHkPk′−Pk′HkTKkT+Pk′HkT(HPk′HT+R)−(HkPk′HkT+R)KkT
   
=
P
k
′
−
K
k
H
k
P
k
′
\quad\;\,=P'_k-K_kH_kP'_k
=Pk′−KkHkPk′
   
=
(
I
−
K
k
H
k
)
P
k
′
\quad\;\,\huge=(I-K_kH_k)P'_k
=(I−KkHk)Pk′
总结
卡尔曼滤波的更新过程
1,
P
0
P_0
P0和
x
0
x_0
x0是已知量,由
P
0
P_0
P0计算出
P
1
′
P'_1
P1′,再算出
K
1
K_1
K1,结合测量值算出
x
1
x_1
x1,再利用
K
1
K_1
K1更新
P
1
P_1
P1
2, 由
P
1
P_1
P1计算出
P
2
′
P'_2
P2′,再算出
K
2
K_2
K2,结合测量值算出
x
2
x_2
x2,再利用
K
2
K_2
K2更新
P
2
P_2
P2
。。。。。。
n,由
P
n
−
1
P_{n-1}
Pn−1计算出
P
n
′
P'_n
Pn′,再算出
K
n
K_n
Kn,结合测量值算出
x
n
x_n
xn,再利用
K
n
K_n
Kn更新
P
n
P_n
Pn
需要使用的公式
x
k
′
^
   
=
A
x
^
k
−
1
+
B
u
k
\huge \hat{x'_k}\;\,=A\hat{x}_{k-1}+Bu_k
xk′^=Ax^k−1+Buk
P
k
′
 
=
A
P
k
−
1
A
T
+
Q
\huge P'_k\,=AP_{k-1}A^T+Q
Pk′=APk−1AT+Q
K
k
=
P
k
′
H
T
(
H
P
k
′
H
T
+
R
)
−
\huge K_k=P'_kH^T(HP'_kH^T+R)^-
Kk=Pk′HT(HPk′HT+R)−
z
k
^
    
=
H
x
k
′
^
+
ν
\huge \hat{z_k}\;\;=H\hat{x'_k}+\nu
zk^=Hxk′^+ν
x
k
^
=
x
k
′
^
+
K
k
(
z
k
−
z
k
^
)
\huge \hat{x_k}=\hat{x'_k}+K_k(z_k-\hat{z_k})
xk^=xk′^+Kk(zk−zk^)
P
k
  
=
(
I
−
K
k
H
)
P
k
′
\huge P_k\;=(I-K_kH)P'_k
Pk=(I−KkH)Pk′
其中:
p
(
ϵ
)
∼
N
(
0
,
Q
)
p
(
ν
)
∼
N
(
0
,
R
)
\huge p(\epsilon)\thicksim N(0,Q)\\p(\nu)\thicksim N(0,R)
p(ϵ)∼N(0,Q)p(ν)∼N(0,R)
例子
一辆匀速直线运动的车,从原点出发 S 0 = 0 m S_0=0m S0=0m,初始速度 V 0 = 0 m / s V_0=0m/s V0=0m/s求出车与原点的位移,加速度 a = 2 m / s a=2m/s a=2m/s,每次的测量时间间隔 Δ t = 0.2 s \Delta t=0.2s Δt=0.2s, Q = 0.02 Q=0.02 Q=0.02, R = 10 R=10 R=10,对于 P k ′ P'_k Pk′的初值自己设定,本例中设为 [ 0 0 0 0 ] \begin{bmatrix}0&0\\0&0\end{bmatrix} [0000],噪声也是自己设定的
import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
#预测方程噪声的协方差矩阵
Q=np.array([(0,0),(0,0.02)])
#测量方程噪声的方差
R=np.array([10]);
#采样时间
deltaT = 0.1
#生成所有的时间
t=np.arange(0,5,deltaT)
N=t.size
#加速度
a = 2
#真实位移
x=1/2*a*t*t
np.random.seed(0)
noise = np.random.normal(0,np.sqrt(10),N)
#生成测量数据
z=x+noise
#A,B,H矩阵
A=np.array([(1,deltaT),(0,1)])
B=np.array([(1/2*deltaT*deltaT),(deltaT)])
H=np.array([(1,0)])
#估计值
xhat=np.zeros([2,t.shape[0]])
#预测值
xhatminus=np.zeros([2,t.shape[0]])
#估计值和真实值协方差矩阵
P=np.zeros(Q.shape)
#预测值和真实值协方差矩阵
Pminus=np.zeros(Q.shape)
#单位矩阵
I=np.eye(Q.shape[0])
#进行卡尔曼滤波
for k in range(9,N):
xhatminus[:,k]=np.dot(A,xhat[:,k-1])+np.dot(B,a)
Pminus = np.dot(np.dot(A,P),A.T)+Q
K=np.dot(np.dot(Pminus,H.T),np.linalg.inv(np.dot(np.dot(H,Pminus),H.T)+R))
xhat[:,k]=xhatminus[:,k]+ np.dot(K,z[k]-np.dot(H,xhatminus[:,k]))
P=np.dot((I-np.dot(K,H)),Pminus)
plt.rcParams['font.sans-serif']=['Simhei']
plt.plot(z,'r',label=u'测量数据')
plt.plot(x,'g',label=u'真值')
plt.plot(xhat[0,:],'b',label=u'估计值')
plt.legend(loc = 0)
plt.show()
参考:
卡尔曼滤波 – 从推导到应用(一)
卡尔曼滤波 – 从推导到应用(二)
无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪
卡尔曼滤波算法详细推导