概述
关于卡尔曼滤波算法的解析文章数不胜数,对于其强大和超广的适用性这里也不再赘述,这篇文章旨在以极为简单而通俗的语言描述卡尔曼滤波,希望数学小白以及日后的自己也能轻松看懂。
理解这篇文章只需要基本的数学基础和一点点概率论知识,当然,这也源于卡尔曼滤波本身就是一个强大但实现极为简单的算法。希望有更为全面了解的可以参考Kalman filter以及Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation,本文也主要基于以上文章的讲解进行精简,示例图也基本借鉴于其中。
卡尔曼滤波到底在做什么?
首先需要理解卡尔曼滤波到底在干什么,否则你看了一大堆数学公式,也很难以理解卡尔曼滤波的本质。卡尔曼滤波的本质,就是解决一个状态估计问题,举例来说,有一辆小车,它从一个起点出发,你在之后需要每时每刻知道它的位置,小车上装有一个GPS可以对位置进行测量,但是GPS的测量不可能完全准确,它是有误差的,此时如何才能获取更精准的小车位置呢(如下图所示)?这就是一个状态估计问题,下面会一一进行解析,在以下的解析中,我们需要时时刻刻记住我们的目标问题。
卡尔曼滤波器
以上问题中,大家肯定能够注意到一个关键点,GPS测量,在不进行任何其他操作的前提下,我们仅仅依靠这个GPS其实就能够解决这个问题,只是精度上会稍微差一点。根据Lyapunov定理(可以简单理解为自然界许许多多随机事件都符合正态分布),这里我们可以做一个合理的假设:GPS测量值符合一个正态分布,那么这个正态分布的方差就反应了测量的误差。假设你拿到一个好的GPS,那么它的误差就相对小(方差小),反之你拿到一个差的GPS,那么它的误差就相对大(方差大),而GPS的方差我们其实是可以预先测量得到的,例如采集大量GPS数据样本,对数据进行统计分析,根据大数定理,我们可以得到GPS测量的期望和方差。以上用数学公式表达就是:
z
t
=
x
t
+
v
t
(1)
z_t=x_t+v_t \tag{1}
zt=xt+vt(1)
式中
x
t
x_t
xt为t时刻小车真实位置,z为GPS测量值,v为噪声,符合标准正态分布,它反应的是测量与实际真值的误差,可以预先测量得到。
只使用GPS其实我们已经初步解决了以上问题,但是这个方法几乎谁都能够想到,而且上面也提到过,GPS的测量是存在误差的,于是现在问题变成了,我们如何能够在不更换GPS设备的前提下得到更准确的小车位置,这时候卡尔曼滤波器就登场了。
要对以上问题进行优化,我们首先需要仔细思考,除了GPS以外,到底还有哪些先验信息、数据或者客观现象是我们可以利用的,这就是建立数学模型的过程,在本例中,我们很自然的可以想到,在第t个时刻的小车位置,其实是可以根据t-1时刻的小车位置、速度计算得到的,如下式:
x
t
=
x
t
−
1
+
(
T
t
−
T
t
−
1
)
u
t
(2)
x_{t}=x_{t-1}+(T_t-T_{t-1})u_{t} \tag{2}
xt=xt−1+(Tt−Tt−1)ut(2)
式中
x
t
x_{t}
xt为根据t-1时刻小车状态预测的t时刻小车位置,T为时间,u为速度。
这其实就是一个基本的数学模型。观察这个数学模型,容易发现,只要给定初始时刻的小车位置和速度,我们也可以根据这个数学模型进行迭代得到任意时刻的小车位置。但是可以也可以很容易的想到,这是个非常理想的数学模型,例如模型中我们假设了从t-1到t时刻速度是完全恒定的,小车完全符合最简单的加速模型等等,显然这是不可能的,现实中小车不可能保持绝对的恒定速度,外加小车在行驶过程中轮胎会有轻微的打滑或者偏移导致小车走轻微S型等无数的不可抗力因素,这就导致了我们的数学模型估计的误差,同样的,我们假设每一次从t-1到t的迭代过程中由不可抗力导致的误差为一个正态分布的噪声,于是我们的数学模型变成了:
x
t
=
x
t
−
1
+
(
T
t
−
T
t
−
1
)
u
t
+
w
t
(3)
x_{t}=x_{t-1}+(T_t-T_{t-1})u_{t}+w_t \tag{3}
xt=xt−1+(Tt−Tt−1)ut+wt(3)
现在总结下我们已经有的东西:
1、GPS测量数据,可以得到任意时刻的小车位置,存在噪声v。
2、数学模型迭代,可以得到任意时刻的小车位置,存在噪声w。
如下图所示(橘色为模型推导结果,蓝色为GPS测量,都包含符合正态分布的噪声):
以上两种方式都能够得到任何时刻小车位置,也就是解决我们的目标问题,但是都存在误差,那么问题来了,数学模型推导得到的结果和GPS结果哪个更靠谱呢?现在先感受下自己的直觉,我觉得大部分人直觉上就会觉得GPS应该是更靠谱的,毕竟假如你认为数学模型更靠谱,那么我们发明GPS设备的意义何在呢?当你想获得位置时,就建立一个数学模型,然后不停的推导就能够解决问题,不需要额外成本,而且精度更高,何乐而不为;现在回归到数学分析上,来分析为什么数学模型在宏观上相比较于GPS噪声更大,比较一下式(1)和式(2),有一个最大的区别,式(2)是一个迭代的过程,而每一个迭代过程中都存在噪声,最致命的是,这个噪声是会不断叠加的,用统计学的语言来说,两个相互独立随机变量相加,其方差为两个随机变量服从的分布的方差和;也就是说,随时间的推移,数学模型得到的结果会越来越不准确,用通俗的例子来解释,假设每个时间周期内,小车都会打滑一下,每次打滑都会产生位置偏移,但数学模型推导每次仍然按照理想情况计算,因此这样的推导与实际位置误差只会越来越大。而GPS每次测量的误差值都与上一次没有关系,是一个绝对误差,不存在累计的过程,因此,随着时间推移,数学模型推导会越来越不准确,但GPS无论好坏,起码误差是一定的。
数学模型推导是否一无是处呢,有没有方法能够融合两种方式,得到误差噪声比两者都小的结果呢?答案是:有。
这里再从直觉上感受一下,什么方式可以达成以上的目的呢?既然GPS测量误差是绝对的,不存在累计,那么我们第t次的数学模型推导如果不是基于第t-1次的数学模型推导结果进行迭代,而是基于第t-1次GPS测量结果进行迭代,不就可以消除以前累计的误差了吗?卡尔曼滤波就是这么做的,当然,它更进一步,基于t-1时刻融合后的结果进行迭代,使得数学模型推导结果更准确,这就是卡尔曼滤波的predict过程。
经过以上过程,再看看我们有的:
1、GPS测量数据,可以得到任意时刻的小车位置,存在噪声v。
2、改进的数学模型迭代过程,可以得到任意时刻的小车位置,存在噪声w’。
显然,新的误差w’与w和v都有关系了,由于w和v都可以预先测量或者设定,因此w’肯定可以计算得到,我们之后再讨论具体计算过程。既然有了1、2两种预测结果,都符合正态分布,那么根据统计学知识:两个正态分布相乘,得到的仍是正态分布,且方差更小。如下图绿色部分所示:
仔细观察,融合后的分布,有两个特点:
1、其期望趋于两个预测结果期望的中间,偏向于方差更小的结果。
2、其方差小于两个预测结果的方差。
对于1,通俗理解,如果得到的两个结果中有一者明显误差更小,那么我们肯定应该更相信这个结果;对于2,基本完美实现了我们预期的目标:融合两种预测方式的结果得到一个误差更小的结果。数学表示如下:
x
t
∣
t
=
x
t
∣
t
−
1
∗
z
t
(5)
x_{t|t}=x_{t|t-1}*z_t \tag{5}
xt∣t=xt∣t−1∗zt(5)
这里
x
t
∣
t
−
1
x_{t|t-1}
xt∣t−1是指基于数学模型推导的t时刻记过,这里
x
t
∣
t
x_{t|t}
xt∣t是融合后的结果分布,仍然是一个正态分布,只要我们计算出它的期望和方差,就能够得到它的具体形态了。
卡尔曼滤波算法数学推导
经过以上的例子,我们对于卡尔曼滤波有了一个初步的了解,下面会对卡尔曼滤波算法数学公式进行详细推导。结合以上例子,我们知道,首先,需要建立一个数学模型:
x
t
=
F
t
x
t
−
1
+
B
t
u
t
+
w
t
(6)
x_{t}=F_tx_{t-1}+B_tu_{t}+w_t \tag{6}
xt=Ftxt−1+Btut+wt(6)
z
t
=
H
t
x
t
+
v
t
(7)
z_t=H_tx_t+v_t \tag{7}
zt=Htxt+vt(7)
其中
x
t
x_{t}
xt表示由t-1时刻的状态
x
t
−
1
x_{t-1}
xt−1预测得到的t时刻的状态量,上述例子中是小车位置;
u
t
u_t
ut表示t时刻给予系统的控制量,上述例子中是小车速度(实际中一般是加速度,这里为了简化模型用了速度),
w
t
w_t
wt为迭代噪声,示例中也有讲过,预先设定为符合正态分布
(
0
,
σ
1
)
(0,\sigma_1)
(0,σ1)。
z
t
z_t
zt表示t时刻的测量值,上述示例中的GPS测量值,这里需要理解一下的是
H
t
H_t
Ht,因为实际当中测量值与系统状态往往并不在一个空间,即可以通过一定的转换关系将测量值转为系统状态,仍以示例中情况来说明,GPS测量其实往往得到的是经纬度两个值,而假设我们的题目要求的位置是小车距离初始点的距离,那么每次从GPS拿到经纬度,我们必须计算其与小车初始点经纬度的差值,并进行一定单位换算成题目需要的小车位置,这个转换过程用
H
t
H_t
Ht表示,即
z
t
=
H
t
x
t
z_t=H_tx_t
zt=Htxt,之前也提过,测量有噪声,因此需要额外加v。
从(6)式可以看出,卡尔曼滤波只支持线性模型,当建模为非线性模型时,需要使用扩展卡尔曼滤波(EKF),之后的文章会讲到。
显然,(6)(7)式对应示例中(4)(1)两个式子,只不过示例进行了很多的简化,例如认为GPS测量直接得到的就是题目需要的小车位置、小车只有位置这一个状态量等;而(6)(7)适用于所有线性系统。
现在我们从任意t时刻开始分析,假设我们已知了t-1时刻融合后的状态量期望
x
^
t
−
1
∣
t
−
1
\hat x_{t-1|t-1}
x^t−1∣t−1以及它的协方差矩阵(多维空间)
P
t
−
1
∣
t
−
1
P_{t-1|t-1}
Pt−1∣t−1(前文已经讲过,任意时刻状态量符合正态分布),首先我们可以根据建立的数学模型推导一个t时刻的状态量期望和协方差矩阵,在卡尔曼滤波中被称为predict过程:
x
^
t
∣
t
−
1
=
F
t
x
t
−
1
+
B
t
u
t
(8)
\hat x_{t|t-1}=F_tx_{t-1}+B_tu_{t}\tag{8}
x^t∣t−1=Ftxt−1+Btut(8)
P
t
∣
t
−
1
=
F
t
P
t
−
1
F
t
T
+
Q
t
(9)
P_{t|t-1}=F_tP_{t-1}F_t^T+Q_t\tag{9}
Pt∣t−1=FtPt−1FtT+Qt(9)
熟悉概率论的很容易可以推出这两个公式,就是随机变量线性组合得到新的随机变量的分布,与组成的随机变量的分布之间的关系计算。
到这里已经得到了由数学模型推理得到的结果,然后我们已知测量值期望与方差
z
t
,
R
t
z_t,R_t
zt,Rt,通过
H
t
H_t
Ht可以将其装欢到x的空间,然后进行结果的融合,这里插一下一维正态分布相乘的期望与方差计算结果:
若
有
:
N
(
μ
′
,
σ
′
)
=
N
(
μ
0
,
σ
0
)
∗
N
(
μ
1
,
σ
1
)
则
:
k
=
σ
0
2
σ
0
2
+
σ
1
2
μ
′
=
μ
0
+
k
(
μ
1
−
μ
0
)
σ
′
=
σ
0
2
−
k
σ
0
2
若有: N(\mu',\sigma')=N(\mu_0,\sigma_0)*N(\mu_1,\sigma_1)\\[3mm] 则: k=\cfrac{\sigma_0^2}{\sigma_0^2+\sigma_1^2}\\[3mm] \mu'=\mu_0+k(\mu_1-\mu_0)\\[3mm] \sigma'=\sigma_0^2-k\sigma_0^2
若有:N(μ′,σ′)=N(μ0,σ0)∗N(μ1,σ1)则:k=σ02+σ12σ02μ′=μ0+k(μ1−μ0)σ′=σ02−kσ02
这个推导过程也很简单,把两个正态分布表达式相乘并进行变换即可得到这个结果,在多维空间里,则为:
K
=
Σ
0
(
Σ
0
+
Σ
1
)
−
1
μ
′
=
μ
0
+
K
(
μ
1
−
μ
0
)
Σ
′
=
Σ
0
−
K
Σ
0
(10)
\begin{gathered} K=\Sigma_0(\Sigma_0+\Sigma_1)^{-1}\\[3mm] \mu'=\mu_0+K(\mu_1-\mu_0)\\[3mm] \Sigma'=\Sigma_0-K\Sigma_0\\[3mm]\tag{10} \end{gathered}
K=Σ0(Σ0+Σ1)−1μ′=μ0+K(μ1−μ0)Σ′=Σ0−KΣ0(10)
把predict的结果转换到测量结果空间,有:
(
μ
0
,
Σ
0
)
=
(
H
t
x
^
t
∣
t
−
1
,
H
t
P
t
∣
t
−
1
H
t
T
)
(
μ
1
,
Σ
1
)
=
(
z
t
,
R
t
)
(\mu_0,\Sigma_0)=(H_t\hat x_{t|t-1},H_tP_{t|t-1}H_t^T)\\[3mm] (\mu_1,\Sigma_1)=(z_t,R_t)
(μ0,Σ0)=(Htx^t∣t−1,HtPt∣t−1HtT)(μ1,Σ1)=(zt,Rt)
代入到(10)式中有:
K
=
H
t
P
t
∣
t
−
1
H
t
T
(
H
t
P
t
∣
t
−
1
H
t
T
+
R
t
)
−
1
(11)
K=H_tP_{t|t-1}H_t^T(H_tP_{t|t-1}H_t^T+R_t)^{-1}\tag{11}
K=HtPt∣t−1HtT(HtPt∣t−1HtT+Rt)−1(11)
H t x ^ t ∣ t = H t x ^ t ∣ t − 1 + K ( z t − H t x ^ t ∣ t − 1 ) (12) H_t\hat x_{t|t}=H_t\hat x_{t|t-1}+K(z_t-H_t\hat x_{t|t-1})\tag{12} Htx^t∣t=Htx^t∣t−1+K(zt−Htx^t∣t−1)(12)
H
t
P
t
∣
t
H
t
T
=
H
t
P
t
∣
t
−
1
H
t
T
−
K
H
t
P
t
∣
t
−
1
H
t
T
(13)
H_tP_{t|t}H_t^T=H_tP_{t|t-1}H_t^T-KH_tP_{t|t-1}H_t^T\tag{13}
HtPt∣tHtT=HtPt∣t−1HtT−KHtPt∣t−1HtT(13)
将(12)(13)式左边的H矩阵消除掉可得:
K
′
=
P
t
∣
t
−
1
H
t
T
(
H
t
P
t
∣
t
−
1
H
t
T
+
R
t
)
−
1
(14)
K'=P_{t|t-1}H_t^T(H_tP_{t|t-1}H_t^T+R_t)^{-1}\tag{14}
K′=Pt∣t−1HtT(HtPt∣t−1HtT+Rt)−1(14)
x ^ t ∣ t = x ^ t ∣ t − 1 + K ′ ( z t − H t x ^ t ∣ t − 1 ) (15) \hat x_{t|t}=\hat x_{t|t-1}+K'(z_t-H_t\hat x_{t|t-1})\tag{15} x^t∣t=x^t∣t−1+K′(zt−Htx^t∣t−1)(15)
P
t
∣
t
=
P
t
∣
t
−
1
−
K
′
H
t
P
t
∣
t
−
1
(16)
P_{t|t}=P_{t|t-1}-K'H_tP_{t|t-1}\tag{16}
Pt∣t=Pt∣t−1−K′HtPt∣t−1(16)
这三个式子被称为update过程。
在实际使用中,我们只需要用到(8)(9)(14)(15)(16)这五个式子就可以完成整个迭代过程。