前言
本文是对卡尔曼滤波学习的记录,主要参照了DR_CAN老师的视频进行学习。视频专栏链接:DR_CAN卡尔曼滤波视频专栏。虽然网上有很多卡尔曼滤波原理介绍的相关博客,但像DR_CAN老师讲解的如此详细的却不多,我也将自己跟随老师学习的记录下来。
本篇文章为卡尔曼滤波原理详解的第一篇,第二篇链接在此:卡尔曼滤波原理详解(二)
卡尔曼滤波是一种滤波技术,或者说状态估计方法(state estimation)/Linear Least-Mean-Squares Estimator(线性最小均方差估计)/Linear Quadratic Estimator(线性二次型估计)。
利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。
由于观测数据中包含噪声和干扰,因此最优估计也可以看作是滤波过程。
它具有占用内存空间小(除了前一个状态量外,无需保留其他历史数据)的特点,并且速度很快,适合用于实时问题和嵌入式系统。
数据融合的思想
在我们拥有多个数据来源下,我们应该如何融合多方面的数据,从而对数据进行更优的选择那?
假设我们要测量一个硬币的宽度,测量结果如下:
测量数据 | 标准差 |
---|---|
z 1 z_1 z1=6.5 mm | σ 1 \sigma1 σ1=0.2mm |
z 2 z_2 z2=7.3mm | σ 2 \sigma2 σ2=0.4mm |
如何求出硬币的最佳估计宽度
z
^
\hat z
z^(其中测量的数据均符合高斯分布)。
显然由于
σ
1
<
σ
2
\sigma1<\sigma2
σ1<σ2,所求的最优估计应当更靠近
z
1
z_1
z1
令:
z
^
=
z
1
+
k
(
z
2
−
z
1
)
(1)
\hat z = z_1+k(z_2-z_1) \tag{1}
z^=z1+k(z2−z1)(1)
(显然,当
k
k
k=1时,
z
^
=
z
2
\hat z=z_2
z^=z2;当
k
=
0
k=0
k=0时,
z
^
=
z
1
\hat z = z_1
z^=z1)
更简单的说,即是
z
1
z1
z1与
z
2
z2
z2谁的权重占比更大。我们的任务是选取合适的
k
k
k值,使得
z
^
\hat z
z^的方差最小。
σ
z
2
=
v
a
r
(
z
1
+
k
(
z
2
−
z
1
)
)
=
v
a
r
(
(
1
−
k
)
z
1
+
k
z
2
)
=
(
1
−
k
)
2
σ
z
1
2
+
k
2
σ
z
2
2
(2)
\begin{aligned} {\sigma^2_z}&=var(z_1+k(z_2-z_1))\\ &=var((1-k)z_1+kz_2)\\ &=(1-k)^2\sigma^2_{z1}+k^2\sigma^2_{z2} \end{aligned} \tag{2}
σz2=var(z1+k(z2−z1))=var((1−k)z1+kz2)=(1−k)2σz12+k2σz22(2)
欲使其方差最小,对上式(2)进行求导,得:
d
σ
z
2
d
k
=
−
2
(
1
−
k
)
σ
z
1
2
+
2
k
σ
z
2
2
=
0
\frac{d\sigma^2_z}{dk}=-2(1-k)\sigma^2_{z1}+2k\sigma^2_{z2}=0
dkdσz2=−2(1−k)σz12+2kσz22=0
得:
k
=
σ
z
1
2
σ
z
1
2
+
σ
z
2
2
=
0.
2
2
0.
2
2
+
0.
4
2
=
0.2
k=\frac{\sigma^2_{z1}}{\sigma^2_{z1}+\sigma^2_{z2}}=\frac{0.2^2}{0.2^2+0.4^2}=0.2
k=σz12+σz22σz12=0.22+0.420.22=0.2
则所求的最优估计
z
^
=
z
1
+
0.2
(
z
2
−
z
1
)
=
6.66
m
m
\hat z=z_1+0.2(z_2-z_1)=6.66mm
z^=z1+0.2(z2−z1)=6.66mm
可以看到所求的最优估计
z
^
\hat z
z^也确实更靠近
z
1
z_1
z1。.
通过这个例子我们能够深刻地体会数据融合的思想,而卡尔曼滤波也应用到了这个思想,在后续的讲解中会体现出来。
例子引入
假设一个在森林中随意奔跑的机器人,我们需要对其速度和位置有清晰的认识,但很不幸,传感器和定位系统只能帮助我们锁定该机器人的大致位置。这显然是不够的。如下表所示,定义其位置和速度
P k P_k Pk | V k V_k Vk |
---|---|
k k k时刻的位置 | k k k时刻的速度 |
那么在未受到外界的任何干扰的时候,其运动模型可以用式(3)来表示
P
k
=
P
k
−
1
+
Δ
t
V
k
−
1
V
k
=
V
k
−
1
(3)
\begin{aligned} P_k&=P_{k-1}+\Delta tV_{k-1}\\ V_{k}&=V_{k-1} \tag{3} \end{aligned}
PkVk=Pk−1+ΔtVk−1=Vk−1(3)
假如存在外部的控制输入
u
k
u_k
uk,表现为加速度
α
\alpha
α
则式(3)可以写为式(4)
P
k
=
P
k
−
1
+
Δ
t
V
k
−
1
+
1
2
α
Δ
t
2
V
k
=
V
k
−
1
+
α
Δ
t
(4)
\begin{aligned} P_k&=P_{k-1}+\Delta tV_{k-1}+\frac{1}{2}\alpha\Delta t^2\\ V_{k}&=V_{k-1}+\alpha \Delta t \tag{4} \end{aligned}
PkVk=Pk−1+ΔtVk−1+21αΔt2=Vk−1+αΔt(4)
进一步地,我们将其写成状态空间表达式的形式
X
k
=
[
1
Δ
t
0
1
]
[
P
k
−
1
V
k
−
1
]
+
[
1
2
Δ
t
2
Δ
t
]
α
(5)
X_k =\begin{bmatrix} 1& \Delta t \\ 0&1 \end{bmatrix} \begin{bmatrix} P_{k-1}\\ V_{k-1} \end{bmatrix}+\begin{bmatrix} \frac{1}{2}\Delta t^2\\ \Delta t \end{bmatrix}\alpha \tag{5}
Xk=[10Δt1][Pk−1Vk−1]+[21Δt2Δt]α(5)
也即:
X
k
=
[
1
Δ
t
0
1
]
X
k
−
1
+
[
1
2
Δ
t
2
Δ
t
]
u
k
−
1
(6)
X_k =\begin{bmatrix} 1& \Delta t \\ 0&1 \end{bmatrix} X_{k-1}+\begin{bmatrix} \frac{1}{2}\Delta t^2\\ \Delta t \end{bmatrix}u_{k-1} \tag{6}
Xk=[10Δt1]Xk−1+[21Δt2Δt]uk−1(6)
当然,外部环境同样存在着各种各样的干扰
w
k
−
1
w_{k-1}
wk−1,假设其符合高斯分布
P
(
w
)
∼
(
0
,
Q
)
P(w)\sim(0,Q)
P(w)∼(0,Q)
进一步地,
X
k
=
[
1
Δ
t
0
1
]
X
k
−
1
+
[
1
2
Δ
t
2
Δ
t
]
u
k
−
1
+
w
k
−
1
(7)
X_k =\begin{bmatrix} 1& \Delta t \\ 0&1 \end{bmatrix} X_{k-1}+\begin{bmatrix} \frac{1}{2}\Delta t^2\\ \Delta t \end{bmatrix}u_{k-1}+w_{k-1} \tag{7}
Xk=[10Δt1]Xk−1+[21Δt2Δt]uk−1+wk−1(7)
式(7)显然能帮助我们从上一时刻
k
−
1
k-1
k−1的状态预测下一时刻
k
k
k的状态。
前文中也提到过,我们也可以通过GPS、外部传感器等诸多手段得到测量出来的数据
Z
k
Z_k
Zk。
Z
1
=
P
k
(测量的位置)
Z
2
=
V
k
(测量的速度)
(8)
\begin{aligned} Z_1&=P_k(测量的位置)\\ Z_2&=V_k(测量的速度) \tag{8} \end{aligned}
Z1Z2=Pk(测量的位置)=Vk(测量的速度)(8)
显然,测量中也存在着各种干扰
v
k
v_k
vk,同样假设其符合高斯分布
P
(
v
)
∼
(
0
,
R
)
P(v)\sim(0,R)
P(v)∼(0,R)
那么式(8)我们可以写成:
Z
k
=
[
1
0
0
1
]
X
k
+
v
k
(9)
Z_k =\begin{bmatrix} 1& 0 \\ 0&1 \end{bmatrix} X_{k}+v_k\tag{9}
Zk=[1001]Xk+vk(9)
将式(7)和式(9)写到一起,并用参数代替其中的矩阵,得到:
X
k
=
A
X
k
−
1
+
B
u
k
−
1
+
w
k
−
1
Z
k
=
H
X
k
+
v
k
(10)
\begin{aligned} X_k &=AX_{k-1}+Bu_{k-1}+w_{k-1} \\ Z_k& =HX_{k}+v_k \end{aligned}\tag{10}
XkZk=AXk−1+Buk−1+wk−1=HXk+vk(10)
现在我们已经有了预测的(7)和测量的(9)两个分布,如何通过这两个分布,估算最优估计便是卡尔曼滤波需要完成的事情。
卡尔曼增益推导
一篇文章写完全部的好像有点长,为了便于读者学习,将该部分内容放到下一篇文章中。