前言
虽然卡尔曼滤波作为一种经典的算法在多源数据融合、slam后端优化等很多方面都取得了较好的应用,但是我们经常都会有一个疑问,卡尔曼滤波到底是什么呢?
简要的说:“卡尔曼滤波是一种优化估算算法”
卡尔曼滤波可以适用于线性高斯系统,如果我们考虑非线性系统则可以考虑扩展卡尔曼滤波
其可以解决两个问题:
- 状态如何在无法被直接测量的情况下,进行估算系统的状态。
- 如何在数据源存在噪声的情况下,通过卡尔曼滤波估计系统的状态。(比如说惯导、轮式里程计、GNSS三种传感器数据均存在误差,且频率不一,如何融合三种数据源进行精确的估计汽车的位置)
我们先来看一个简单的例子:
一辆行驶在路上的小车,其状态包括位置、速度两个信息,用
x
x
x表示小车的状态,其中
p
p
p表示位置,
v
v
v表示速度。则可以写成下述形式:
x → = ∣ p v ∣ \overrightarrow{x} = \begin{vmatrix}p\\v\end{vmatrix} x=∣∣∣∣pv∣∣∣∣
假设式中的位置变量 p p p 与 速度变量 v v v,都为随机变量且符合正态分布,则进而可以通过均值 描述可能的估计 和 对应的方差 衡量变量的不确定性。
匀速行驶
在一个比较理想的状态下,我们假设小车在路上匀速行驶,则可以对小车行驶由
t
−
1
t-1
t−1时刻到
t
t
t时刻之间的过程描述成下式中的数学模型:
p
t
=
p
t
−
1
+
v
t
−
1
∗
△
t
p_{t}=p_{t-1} + v_{t-1}* \triangle t
pt=pt−1+vt−1∗△t
v
t
=
v
t
−
1
v_{t}=v_{t-1}
vt=vt−1
针对
t
t
t 时刻与
t
−
1
t-1
t−1 时刻的状态的估计量,
x
^
t
=
∣
p
^
t
v
^
t
∣
\hat{x}_{t} = \begin{vmatrix}\hat{p}_{t}\\\hat{v}_{t}\end{vmatrix}
x^t=∣∣∣∣p^tv^t∣∣∣∣,
x
^
t
−
1
=
∣
p
^
t
−
1
v
^
t
−
1
∣
\hat{x}_{t-1} = \begin{vmatrix}\hat{p}_{t-1}\\\hat{v}_{t-1}\end{vmatrix}
x^t−1=∣∣∣∣p^t−1v^t−1∣∣∣∣
写成矩阵形式如下:
x
^
t
=
∣
1
△
t
0
1
∣
∗
x
^
t
−
1
\hat{x}_{t} = \begin{vmatrix}1 & \triangle t \\0 & 1\end{vmatrix} * \hat{x}_{t-1}
x^t=∣∣∣∣10△t1∣∣∣∣∗x^t−1
令上式中:
F
t
=
∣
1
△
t
0
1
∣
F_{t} = \begin{vmatrix}1 & \triangle t \\0 & 1\end{vmatrix}
Ft=∣∣∣∣10△t1∣∣∣∣
则可以写成:
x
^
t
=
F
t
∗
x
^
t
−
1
\hat{x}_{t} = F_{t} * \hat{x}_{t-1}
x^t=Ft∗x^t−1
称上式中的
F
t
F_{t}
Ft 为预测矩阵,其描述了从上一时刻状态估计到下一时刻状态估计之间的关系。
但是,上述例子中的位置变量 p p p 与 速度变量 v v v都不是确定的,两者之间的关系也不是确定的,但是二者之间却有一定的相关性,我们通过协方差矩阵 P P P 描述两者之间的相关程度:
(注意这里的协方差矩阵 P P P 与位置变量 p p p符号之间的区别)
P
=
∣
Σ
p
p
Σ
p
v
Σ
v
p
Σ
v
v
∣
P = \begin{vmatrix}\Sigma_{pp} & \Sigma_{pv}\\\Sigma_{vp} & \Sigma_{vv}\end{vmatrix}
P=∣∣∣∣ΣppΣvpΣpvΣvv∣∣∣∣
同时,考虑到两者之间的预测矩阵F_{t},则给定上一时刻的协方差矩阵
P
t
−
1
P_{t-1}
Pt−1,则下一时刻的协方差矩阵
P
t
P_{t}
Pt可以写成:
P
t
=
F
t
P
t
−
1
F
t
T
P_{t}=F_{t}P_{t-1}F^{T}_{t}
Pt=FtPt−1FtT
非匀速行驶
上述的例子种过于理想,实际情况中小车不可能都是在匀速行驶。因此,我们考虑加入一个加速度
a
a
a,即小车的行驶速度会随着时间而发生改变。
重新定义小车的状态量如下所示:
p
t
=
p
t
−
1
+
v
t
−
1
∗
△
t
+
1
2
a
△
t
2
p_{t}=p_{t-1} + v_{t-1}* \triangle t+\frac{1}{2}a\triangle t^{2}
pt=pt−1+vt−1∗△t+21a△t2
v
t
=
v
t
−
1
+
a
△
t
v_{t}=v_{t-1} + a\triangle t
vt=vt−1+a△t
令
u
^
t
\hat{u}_{t}
u^t作为加速度
a
a
a在
t
t
t时刻的估计(又称之为输入)。
则上式又可以写为:
p
t
=
p
t
−
1
+
v
t
−
1
∗
△
t
+
△
t
2
2
∗
u
^
t
p_{t}=p_{t-1} + v_{t-1}* \triangle t+\frac{\triangle t^{2}}{2}*\hat{u}_{t}
pt=pt−1+vt−1∗△t+2△t2∗u^t
v
t
=
v
t
−
1
+
△
t
∗
u
^
t
v_{t}=v_{t-1} + \triangle t*\hat{u}_{t}
vt=vt−1+△t∗u^t
整理
B
t
=
∣
△
t
2
2
△
t
∣
B_{t}=\begin{vmatrix}\frac{\triangle t^{2}}{2}\\ \triangle t \end{vmatrix}
Bt=∣∣∣∣2△t2△t∣∣∣∣
得:
x
^
t
=
F
t
∗
x
^
t
−
1
+
B
t
∗
u
^
t
\hat{x}_{t} = F_{t} * \hat{x}_{t-1}+B_{t}*\hat{u}_{t}
x^t=Ft∗x^t−1+Bt∗u^t
同时,使用
Q
t
Q_{t}
Qt表示引入的输入变量
u
t
{u}_{t}
ut的方差,则对两者之间协方差的影响又可以写成如下形式:
P
t
=
F
t
P
t
−
1
F
t
T
+
Q
t
P_{t}=F_{t}P_{t-1}F^{T}_{t}+Q_{t}
Pt=FtPt−1FtT+Qt
总结一下,引入新的输入之后,对估计
x
^
t
\hat{x}_{t}
x^t 和不确定性
P
t
P_{t}
Pt 都产生了影响。
卡尔曼滤波公式推导
到此为止,我们对上述的一个小车行驶过程进行了很好的数学建模,但是我们还没有进行一个较好的公式推导。
下面我们就进行这个推导的过程:
上述推导过程我们得到了关于小车在
t
t
t时刻预测值
x
^
t
\hat{x}_{t}
x^t满足一个高斯分布
N
p
(
μ
p
,
σ
p
)
N_{p}(\mu_{p}, \sigma_{p})
Np(μp,σp)。
同时,基于小车携带的传感器又可以获得一个状态的观测值,这个观测值也会受到环境和传感器自身的影响产生众多噪声,我们仍假设观测值服从一个高斯分布,记为:
N
o
b
(
μ
o
b
,
σ
o
b
)
N_{ob}(\mu_{ob}, \sigma_{ob})
Nob(μob,σob)
因此,对于当前时刻
t
t
t,我们有了两组参考值,一组是预测值
x
^
t
\hat{x}_{t}
x^t,一组是测量值
x
t
{x}_{t}
xt。那么那组值是正确的呢?怎么样才能得到最终较好的结果呢?
卡尔曼滤波器做的一个工作就是把预测值的高斯分布
N
p
(
μ
p
,
σ
p
)
N_{p}(\mu_{p}, \sigma_{p})
Np(μp,σp)与测量值的高斯分布
N
o
b
(
μ
o
b
,
σ
o
b
)
N_{ob}(\mu_{ob}, \sigma_{ob})
Nob(μob,σob)进行相乘,得到一个新的分布。(注:这两个高斯分布的乘积不再是一个正态分布,因为其概率密度求和之后不为1)
这个新的分布会正比于一个高斯分布,因此,我们可以通过指数相等来进行计算,即我们可以得到如下关系:
1
σ
c
o
m
b
2
(
x
−
μ
c
o
m
b
)
2
+
C
=
1
σ
p
2
(
x
−
μ
p
)
2
+
1
σ
o
b
2
(
x
−
μ
o
b
)
2
\frac{1}{\sigma^2_{comb}}(x-\mu_{comb})^{2}+C=\frac{1}{\sigma^2_{p}}(x-\mu_{p})^{2}+\frac{1}{\sigma^2_{ob}}(x-\mu_{ob})^{2}
σcomb21(x−μcomb)2+C=σp21(x−μp)2+σob21(x−μob)2
上式中,
μ
p
\mu_{p}
μp,
σ
p
\sigma_{p}
σp分别为预测的均值和方差,
μ
o
b
\mu_{ob}
μob,
σ
o
b
\sigma_{ob}
σob分别为观测的均值和方差。而
μ
c
o
m
b
\mu_{comb}
μcomb,
σ
c
o
m
b
\sigma_{comb}
σcomb分别为融合之后的分布所对应均值和方差,且
C
C
C为一个常数(即正比于一个高斯分布)。
我们把上式展开
1
σ
c
o
m
b
2
x
2
−
2
μ
c
o
m
b
σ
c
o
m
b
2
x
+
μ
c
o
m
b
2
σ
c
o
m
b
2
+
C
=
(
1
σ
p
2
+
1
σ
o
b
2
)
x
2
−
(
2
μ
p
σ
p
2
+
2
μ
o
b
σ
o
b
2
)
x
+
(
μ
p
2
σ
p
2
+
μ
o
b
2
σ
o
b
2
)
\frac{1}{\sigma^2_{comb}}x^{2}-\frac{2\mu_{comb}}{\sigma^2_{comb}}x+\frac{\mu^{2}_{comb}}{\sigma^2_{comb}}+C=(\frac{1}{\sigma^2_{p}}+\frac{1}{\sigma^2_{ob}})x^{2}-(\frac{2\mu_{p}}{\sigma^2_{p}}+\frac{2\mu_{ob}}{\sigma^2_{ob}})x+(\frac{\mu_{p}^{2}}{\sigma^2_{p}}+\frac{\mu_{ob}^{2}}{\sigma^2_{ob}})
σcomb21x2−σcomb22μcombx+σcomb2μcomb2+C=(σp21+σob21)x2−(σp22μp+σob22μob)x+(σp2μp2+σob2μob2)
为了使得上式的关系成立,需满足一个必要条件为左右两侧
x
x
x 的二次项系数与一次项系数均相等。则由此可以得到下述关系:
1
σ
c
o
m
b
2
=
1
σ
p
2
+
1
σ
o
b
2
\frac{1}{\sigma^2_{comb}}=\frac{1}{\sigma^2_{p}}+\frac{1}{\sigma^2_{ob}}
σcomb21=σp21+σob21
μ
c
o
m
b
σ
c
o
m
b
2
=
μ
p
σ
p
2
+
μ
o
b
σ
o
b
2
\frac{\mu_{comb}}{\sigma^2_{comb}}=\frac{\mu_{p}}{\sigma^2_{p}}+\frac{\mu_{ob}}{\sigma^2_{ob}}
σcomb2μcomb=σp2μp+σob2μob
首先,对于第一个式子,可以变换为下述形式:
σ
c
o
m
b
2
=
σ
p
2
σ
o
b
2
σ
p
2
+
σ
o
b
2
σ
c
o
m
b
2
=
σ
p
2
(
σ
p
2
+
σ
o
b
2
)
−
σ
p
4
σ
p
2
+
σ
o
b
2
=
σ
p
2
−
σ
p
4
σ
p
2
+
σ
o
b
2
\sigma^2_{comb}=\frac{\sigma^2_{p}\sigma^2_{ob}}{\sigma^2_{p}+\sigma^2_{ob}} \\ \sigma^2_{comb}=\frac{\sigma^2_{p}(\sigma^2_{p}+\sigma^2_{ob})-\sigma^4_{p}}{\sigma^2_{p}+\sigma^2_{ob}}=\sigma^2_{p}-\frac{\sigma^4_{p}}{\sigma^2_{p}+\sigma^2_{ob}}
σcomb2=σp2+σob2σp2σob2σcomb2=σp2+σob2σp2(σp2+σob2)−σp4=σp2−σp2+σob2σp4
同时,代入并变换第二个式子(右侧):
μ
c
o
m
b
1
σ
c
o
m
b
2
=
μ
c
o
m
b
σ
p
2
+
σ
o
b
2
σ
p
2
σ
o
b
2
=
μ
p
σ
o
b
2
+
μ
o
b
σ
p
2
σ
p
2
σ
o
b
2
{\mu_{comb}}\frac{1}{\sigma^2_{comb}}={\mu_{comb}}\frac{\sigma^2_{p}+\sigma^2_{ob}}{\sigma^2_{p}\sigma^2_{ob}}=\frac{\mu_{p}\sigma^2_{ob}+\mu_{ob}\sigma^2_{p}}{\sigma^2_{p}\sigma^2_{ob}}
μcombσcomb21=μcombσp2σob2σp2+σob2=σp2σob2μpσob2+μobσp2
同时去除分母,得:
μ
c
o
m
b
(
σ
p
2
+
σ
o
b
2
)
=
μ
p
σ
o
b
2
+
μ
o
b
σ
p
2
{\mu_{comb}}(\sigma^2_{p}+\sigma^2_{ob})=\mu_{p}\sigma^2_{ob}+\mu_{ob}\sigma^2_{p}
μcomb(σp2+σob2)=μpσob2+μobσp2
则:
μ
c
o
m
b
=
μ
p
σ
o
b
2
+
μ
o
b
σ
p
2
(
σ
p
2
+
σ
o
b
2
)
μ
c
o
m
b
=
μ
p
σ
p
2
+
μ
p
σ
o
b
2
+
μ
o
b
σ
p
2
−
μ
p
σ
p
2
(
σ
p
2
+
σ
o
b
2
)
μ
c
o
m
b
=
μ
p
+
μ
o
b
σ
p
2
−
μ
p
σ
p
2
(
σ
p
2
+
σ
o
b
2
)
{\mu_{comb}}=\frac{\mu_{p}\sigma^2_{ob}+\mu_{ob}\sigma^2_{p}}{(\sigma^2_{p}+\sigma^2_{ob})}\\{\mu_{comb}}=\frac{\mu_{p}\sigma^2_{p}+\mu_{p}\sigma^2_{ob}+\mu_{ob}\sigma^2_{p}-\mu_{p}\sigma^2_{p}}{(\sigma^2_{p}+\sigma^2_{ob})} \\ {\mu_{comb}}=\mu_{p}+\frac{\mu_{ob}\sigma^2_{p}-\mu_{p}\sigma^2_{p}}{(\sigma^2_{p}+\sigma^2_{ob})}
μcomb=(σp2+σob2)μpσob2+μobσp2μcomb=(σp2+σob2)μpσp2+μpσob2+μobσp2−μpσp2μcomb=μp+(σp2+σob2)μobσp2−μpσp2
令:
K
=
σ
p
2
σ
p
2
+
σ
o
b
2
K=\frac{\sigma^2_{p}}{\sigma^2_{p}+\sigma^2_{ob}}
K=σp2+σob2σp2
称
K
K
K为卡尔曼增益,则我们可以把变量
μ
c
o
m
b
\mu_{comb}
μcomb与变量
σ
c
o
m
b
2
\sigma^2_{comb}
σcomb2通过
K
K
K表示为:
μ
c
o
m
b
=
μ
p
+
K
∗
(
μ
o
b
−
μ
p
)
σ
c
o
m
b
2
=
σ
p
2
−
σ
p
4
σ
p
2
+
σ
o
b
2
=
σ
p
2
−
σ
p
2
∗
K
=
σ
p
2
(
1
−
K
)
{\mu_{comb}}=\mu_{p}+K*(\mu_{ob}-\mu_{p})\\ \sigma^2_{comb}=\sigma^2_{p}-\frac{\sigma^4_{p}}{\sigma^2_{p}+\sigma^2_{ob}} =\sigma^2_{p}-\sigma^2_{p}*K=\sigma^2_{p}(1-K)
μcomb=μp+K∗(μob−μp)σcomb2=σp2−σp2+σob2σp4=σp2−σp2∗K=σp2(1−K)
对应于矩阵形式,则可以写为:
μ
→
c
o
m
b
=
μ
→
p
+
K
∗
(
μ
→
o
b
−
μ
→
p
)
Σ
c
o
m
b
=
Σ
p
(
1
−
K
)
{\overrightarrow{\mu}_{comb}}=\overrightarrow{\mu}_{p}+K*(\overrightarrow{\mu}_{ob}-\overrightarrow{\mu}_{p})\\ \Sigma_{comb}=\Sigma_{p}(1-K)
μcomb=μp+K∗(μob−μp)Σcomb=Σp(1−K)
至此,我们就简要的说明了卡尔曼滤波中的均值、方差以及卡尔曼增益用于更新前两者的推导过程。
黄金五条公式总结
可以看出卡尔曼滤波整体包括两个部分:1)预测 2)更新
预测部分包括:
x
^
t
=
F
t
∗
x
~
t
−
1
+
B
t
∗
u
t
σ
^
t
2
=
F
t
σ
~
t
−
1
2
F
t
T
+
Q
t
\hat{x}_{t} = F_{t} * \tilde{x}_{t-1}+B_{t}*{u}_{t}\\\hat{\sigma}^{2}_{t}=F_{t}\tilde\sigma^{2}_{t-1}F^{T}_{t}+Q_{t}
x^t=Ft∗x~t−1+Bt∗utσ^t2=Ftσ~t−12FtT+Qt
式中,
x
^
t
\hat{x}_{t}
x^t为
t
t
t时刻的状态量预测值,通过上一时刻
t
−
1
t-1
t−1计算的最优状态估计以及输入
u
t
{u}_{t}
ut进行计算。
σ
^
t
2
\hat{\sigma}^{2}_{t}
σ^t2为状态估计的不确定性,通过上一时刻的不确定性
σ
~
t
−
1
2
\tilde\sigma^{2}_{t-1}
σ~t−12,预测矩阵
F
t
F_{t}
Ft以及输入
u
t
{u}_{t}
ut的不确定性
Q
t
Q_{t}
Qt进行计算。
更新部分包括:
K
=
σ
^
t
2
σ
^
t
2
+
σ
o
b
−
t
2
x
~
t
=
x
^
t
+
K
∗
(
x
o
b
−
t
−
x
^
t
)
σ
~
t
2
=
σ
^
t
2
(
1
−
K
)
K=\frac{\hat{\sigma}^{2}_{t}}{\hat{\sigma}^{2}_{t}+\sigma^2_{ob-t}}\\ \tilde{x}_{t}=\hat{x}_{t}+K*({x}_{ob-t}-\hat{x}_{t})\\ \tilde{\sigma}^2_{t}=\hat{\sigma}^2_{t}(1-K)
K=σ^t2+σob−t2σ^t2x~t=x^t+K∗(xob−t−x^t)σ~t2=σ^t2(1−K)
上式中,
K
K
K为卡尔曼增益,通过
t
t
t时刻的状态估计预测量的不确定性
σ
^
t
2
\hat{\sigma}^{2}_{t}
σ^t2与
t
t
t时刻观测值的不确定性进行计算。
x
~
t
\tilde{x}_{t}
x~t为
t
t
t时刻结合预测和观测计算出的最优状态估计(即我们想要计算的状态量),通过
t
t
t时刻的预测值
x
^
t
\hat{x}_{t}
x^t与观测值
x
o
b
−
t
{x}_{ob-t}
xob−t,以及卡尔曼增益
K
K
K进行计算。
σ
~
t
2
\tilde{\sigma}^2_{t}
σ~t2为在
t
t
t时刻结合预测和观测两方面进行计算的不确定性,通过预测的不确定性
σ
^
t
2
\hat{\sigma}^{2}_{t}
σ^t2与卡尔曼增益
K
K
K进行计算。
上述五个公式即为“黄金五条”公式。
卡尔曼增益K值的讨论
最后我们再进行一些讨论,更加深入的去了解卡尔曼滤波的内在关系。
我们来假设两个极端情况:
1)如果存在一个情况,观测量特别精确,几乎不存在误差,其方差
σ
o
b
−
t
2
\sigma^2_{ob-t}
σob−t2的值可以取0。此时,卡尔曼增益
K
K
K的值为1。则更新部分的最优估计和不确定性变为:
x
~
t
=
x
^
t
+
1
∗
(
x
o
b
−
t
−
x
^
t
)
=
x
o
b
−
t
σ
~
t
2
=
σ
^
t
2
(
1
−
1
)
=
0
\tilde{x}_{t}=\hat{x}_{t}+1*({x}_{ob-t}-\hat{x}_{t})={x}_{ob-t}\\ \tilde{\sigma}^2_{t}=\hat{\sigma}^2_{t}(1-1)=0
x~t=x^t+1∗(xob−t−x^t)=xob−tσ~t2=σ^t2(1−1)=0
即观测值作为了最优估计,且其不确定性为0。
2)针对另外一个情况,我们构建的小车行驶的数学模型毫无误差,预测量特别精确,几乎不存在误差,其方差
σ
^
2
\hat{\sigma}^2
σ^2的值可以取0。此时,卡尔曼增益
K
K
K的值为0。则更新部分的最优估计和不确定性变为:
x
~
t
=
x
^
t
+
0
∗
(
x
o
b
−
t
−
x
^
t
)
=
x
^
t
σ
~
t
2
=
σ
^
t
2
(
1
−
0
)
=
σ
^
t
2
\tilde{x}_{t}=\hat{x}_{t}+0*({x}_{ob-t}-\hat{x}_{t})=\hat{x}_{t}\\ \tilde{\sigma}^2_{t}=\hat{\sigma}^2_{t}(1-0)=\hat{\sigma}^2_{t}
x~t=x^t+0∗(xob−t−x^t)=x^tσ~t2=σ^t2(1−0)=σ^t2
即以预测值作为最优的估计。
因此,我们得到了一个重要的结论:
卡尔曼增益 K K K的值,决定了测量值和预测值对计算 t t t时刻状态量 x ~ t \tilde{x}_{t} x~t的影响程度。
这个知乎大佬放了matlab官方的学习视频,很不错,通俗易懂,感兴趣的可以去看一下:如何通俗并尽可能详细地解释卡尔曼滤波?
码字不易,若有转载还请注明出处!