首先请大家思考个问题,假设你手头有两个传感器A和B,测的是同一个信号。可是由于测量误差的原因它们每次的读数都不太一样,怎样才能获取到更准确的数据?
看到这里可能有人懵了,卡尔曼到底是啥?下面进行简单的解释:
以求解小车移动的位置为例,假设你只有一个传感器(GPS),还有一个小车的运动模型。你可以根据运动模型和上一时刻小车的状态计算出下一时刻小车可能在的位置,但也不是那么准。那为了获取小车更精确的位置,下一时刻小车的位置便是把运动模型算出来的值,和传感器测出的值,(就像两个传感器那样),取加权平均,就得到了小车较为精准的位置,这便是卡尔曼滤波要做的事情。
而卡尔曼滤波就是预测 - 测量之间不断循环迭代。当然,对于某些情况,如GPS + IMU,由于IMU 测量频率远比GPS 高,在只有IMU 测量值时,只执行运动更新,在有GPS 测量值时再进行测量更新。
在此结合一个具体实例进行讲解。假设有一个智能小车在一条笔直的公路上运行,是一个线性系统。假设智能小车在 t t t时刻的运动速度为 v t v_t vt,控制系统的控制输入为 u t u_t ut,所在位置为 p t p_t pt。其上携带有GPS,我们可以从中获取智能汽小车所在的位置,切记GPS是有误差的。
由此可得,在 t t t时刻,智能小车的状态我们可以使用一个向量来表示:
x t = [ p t v t ] \mathbf{x}_t= \left[ \begin{matrix} p_t \\ v_t \\ \end{matrix} \right] xt=[ptvt]
对于方差 σ 2 \sigma^2 σ2而言,这里有两个变量 p t p_t pt和 v t v_t vt,所以可以使用协方差矩阵 P \mathbf{P} P来表示:
P = [ ∑ p p ∑ p v ∑ v p ∑ v v ] \mathbf{P}=\left[ \begin{matrix} \sum{pp} & \sum{pv} \\ \sum{vp} & \sum{vv} \\ \end{matrix} \right] P=[∑pp∑vp∑pv∑vv]
那么在确定智能小车准确的位置和速度之前,我们先来分析下小车的位置误差。在 t t t时刻对于位置而言,其可能会在红色的线段内部。
小车的位置在图1中红色线段中的位置可以映射到图2中。图2中波峰所在位置为可能性对大的位置,对应图1中线段的中心位置,也就是高斯分布中心 μ \mu μ。
根据智能小车在直线公路上的运动,我们可以获取其运动方程如下:
x t = f ( x t − 1 , u t ) + ω t \mathbf{x}_t=f(\mathbf{x}_{t-1}, \mathbf{u}_t)+\mathbf{\omega}_t xt=f(xt−1,ut)+ωt
其中,
假设这里智能小车系统是一个线性系统,则上述运动可以转化为:
x t = F t x t − 1 + B t u t + ω t \mathbf{x}_t=\mathbf{F}_t\mathbf{x}_{t-1}+\mathbf{B}_t\mathbf{u}_t+\omega_t xt=Ftxt−1+Btut+ωt (公式1)
其中,
根据其GPS的返回值,我们可以获得智能小车的观测方程:
z t = H x t + v t \mathbf{z}_t=\mathbf{H}\mathbf{x}_t+\mathbf{v}_t zt=Hxt+vt
其中,
在小车运动过程中,可以通过控制加速度 a a a来调整小车的速度:
a = f t m a=\frac{f_t}{m} a=mft
假设t和t-1时刻之间的时间差为 Δ t \Delta t Δt,则
{ x t = x t − 1 + x t Δ t + 1 2 f t m Δ t 2 v t = v t − 1 + f t m Δ t \left\{ \begin{matrix} {{x}_{t}}\text{=}{{x}_{t-1}}\text{+}{{x}_{t}}\Delta \text{t}+\frac{1}{2}\frac{{{f}_{t}}}{m}\Delta {{t}^{2}} \\ {{v}_{t}}={{v}_{t-1}}+\frac{{{f}_{t}}}{m}\Delta t \\ \end{matrix} \right. {xt=xt−1+xtΔt+21mftΔt2vt=vt−1+mftΔt
那么写成矩阵形式如下:
[ x t v t ] = [ 1 Δ t 0 1 ] [ x t − 1 v t − 1 ] + [ Δ t 2 2 Δ t ] \left[ \begin{matrix} {{x}_{t}} \\ {v_{t}} \\ \end{matrix} \right]=\left[ \begin{matrix} 1 & \Delta t \\ 0 & 1 \\ \end{matrix} \right]\left[ \begin{matrix} {{x}_{t-1}} \\ {{v}_{t-1}} \\ \end{matrix} \right]+\left[ \begin{matrix} \frac{\Delta {{t}^{2}}}{2} \\ \Delta t \\ \end{matrix} \right] [xtvt]=[10Δt1][xt−1vt−1]+[2Δt2Δt]
与之前的运动方程对比,可以发现
状态转移矩阵 F t = [ 1 Δ t 0 1 ] \mathbf{F}_t=\left[ \begin{matrix} 1 & \Delta t \\ 0 & 1 \\ \end{matrix} \right] Ft=[10Δt1],控制输入局矩阵 B t = [ Δ t 2 2 Δ t ] \mathbf{B}_t=\left[ \begin{matrix} \frac{\Delta {{t}^{2}}}{2} \\ \Delta t \\ \end{matrix} \right] Bt=[2Δt2Δt]
上式就可以写成
x ^ t ∣ t − 1 = F t x ^ t − 1 + B t u t \mathbf{\hat{x}}_{t|t-1}=\mathbf{F}_t\mathbf{\hat{x}}_{t-1}+\mathbf{B}_t\mathbf{u}_t x^t∣t−1=Ftx^t−1+Btut (公式2)
其中
系统的误差通过协方差矩阵来表示,根据协方差矩阵的性质:
C o v ( x ) = ∑ Cov(x) = \sum Cov(x)=∑
C o v ( A x ) = A ∑ A T Cov(\mathbf{A}x) = \mathbf{A}\sum \mathbf{A}^T Cov(Ax)=A∑AT
因此在对状态向量更新后,还需要更新状态向量对应的协方差矩阵 P \mathbf{P} P,公式为:
P t ∣ t − 1 = F t P t − 1 F t T + Q t \mathbf{P}_{t|t-1}=\mathbf{F}_{t}\mathbf{P}_{t-1}\mathbf{F}_{t}^{T}+\mathbf{Q}_{t} Pt∣t−1=FtPt−1FtT+Qt
其推导过程如下:
假设 x \mathbf{x} x为t时刻下状态向量的真值(永远未知),由之前的运动方程(公式1)给出,将(公式1)和公式(2)相减可得:
P t ∣ t − 1 = E [ ( x t − x ^ t ∣ t − 1 ) ( x t − x ^ t ∣ t − 1 ) T ] = E [ ( F ( x t − 1 − x ^ t ∣ t − 1 ) + ω t ) ⋅ ( F ( x t − 1 − x ^ t ∣ t − 1 ) + ω t ) T ] = F E [ ( x t − 1 − x ^ t ∣ t − 1 ) ⋅ ( x t − 1 − x ^ t ∣ t − 1 ) T ] F T + F E [ ( x t − 1 − x ^ t ∣ t − 1 ) ω t T ] F T + F E [ ( ω t x t − 1 − x ^ t ∣ t − 1 ) ] F T + E [ ω t ω t T ] \begin{aligned} \mathbf{P}_{t|t-1}&=E[(\mathbf{x}_{t} - \mathbf{\hat{x}}_{t|t-1}) (\mathbf{x}_{t} - \mathbf{\hat{x}}_{t|t-1})^T]\\ &=E[(\mathbf{F}(\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) +\omega_t) \cdot (\mathbf{F}(\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) +\omega_t)^T]\\ &=\mathbf{F}E[(\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) \cdot (\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1})^T]\mathbf{F}^T\\ &+\mathbf{F}E[(\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) \omega_t^T]\mathbf{F}^T\\ &+\mathbf{F}E[(\omega_t\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) ]\mathbf{F}^T\\ &+E[\omega_t \omega_t^T] \end{aligned} Pt∣t−1=E[(xt−x^t∣t−1)(xt−x^t∣t−1)T]=E[(F(xt−1−x^t∣t−1)+ωt)⋅(F(xt−1−x^t∣t−1)+ωt)T]=FE[(xt−1−x^t∣t−1)⋅(xt−1−x^t∣t−1)T]FT+FE[(xt−1−x^t∣t−1)ωtT]FT+FE[(ωtxt−1−x^t∣t−1)]FT+E[ωtωtT]
考虑到状态向量和噪声是不相关的,则 E [ ( ω t x t − 1 − x ^ t ∣ t − 1 ) T ] = 0 E[(\omega_t\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1})^T ]=0 E[(ωtxt−1−x^t∣t−1)T]=0,因此上式可以化简为:
P t ∣ t − 1 = F E [ ( x t − 1 − x ^ t ∣ t − 1 ) ⋅ ( x t − 1 − x ^ t ∣ t − 1 ) T ] F T + E [ ω t ω t T ] = F t P t − 1 F t T + Q t \begin{aligned} \mathbf{P}_{t|t-1}&=\mathbf{F}E[(\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1}) \cdot (\mathbf{x}_{t-1} - \mathbf{\hat{x}}_{t|t-1})^T]\mathbf{F}^T+E[\omega_t \omega_t^T]\\ &=\mathbf{F}_t\mathbf{P}_{t-1}\mathbf{F}_t^T+\mathbf{Q}_t \end{aligned} Pt∣t−1=FE[(xt−1−x^t∣t−1)⋅(xt−1−x^t∣t−1)T]FT+E[ωtωtT]=FtPt−1FtT+Qt
推导完毕。
由此可见,经过预测更新,协方差矩阵 P \mathbf{P} P变大了。这主要是因为在原本不确定的位置上,又加上了速度不确定性导致的位置误差,最终使得位置更加不确定。预测更新实际上相当于“加法”:将当前状态转换到下一时刻(并增加一定不确定性),再把外界的干扰(运动测量值)叠加上去(又增加了一点不确定性)。如下图所示。
当从智能小车携带的GPS获取到测量值时,那么便可以对状态向量进行更新,也即可以获得t时刻小车最优的状态向量,如下:
x ^ t = x ^ t ∣ t − 1 + K t ( z t − H t x ^ t ∣ t − 1 ) \hat{\mathbf{x}}_t=\hat{\mathbf{x}}_{t|t-1}+\mathbf{K}_t(\mathbf{z}_t-\mathbf{H}_t\hat{\mathbf{x}}_{t|t-1}) x^t=x^t∣t−1+Kt(zt−Htx^t∣t−1)
P t = P t ∣ t − 1 − K t H t P t ∣ t − 1 \mathbf{P}_t=\mathbf{P}_{t|t-1}-\mathbf{K}_t\mathbf{H}_t\mathbf{P}_{t|t-1} Pt=Pt∣t−1−KtHtPt∣t−1
其中, K t = P t ∣ t − 1 H t T ( H t P t ∣ t − 1 H t T + R t ) − 1 \mathbf{K}_t=\mathbf{P}_{t|t-1}\mathbf{H}_t^T(\mathbf{H}_t\mathbf{P}_{t|t-1}\mathbf{H}_t^T+\mathbf{R}_t)^{-1} Kt=Pt∣t−1HtT(HtPt∣t−1HtT+Rt)−1为卡尔曼增益。
推导过程如下:
小车位置1
从t-1时刻起,小车运动后,经过前面所述的预测更新后,我们就得到了t 时刻的小车位置的估计,由于在卡尔曼滤波中,我们使用高斯概率分布来表示小车的位置,因此这个预测的位置可以写为:
y 1 ( r ; μ 1 , σ 1 ) = 1 2 π σ 1 2 e − ( r − μ 1 ) 2 2 σ 1 2 {{y}_{1}}(r;{{\mu }_{1}},{{\sigma }_{1}})=\frac{1}{\sqrt{2\pi \sigma _{1}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{1}})}^{2}}}{2\sigma _{1}^{2}}}} y1(r;μ1,σ1)=2πσ121e−2σ12(r−μ1)2
为了与前面的通用的推导区别开来,在这个一维的例子中我们使用了新的符号。不过熟悉高斯概率分布的话应该可以马上看出来, μ 1 \mu_1 μ1 为这个高斯分布的均值, σ 1 \sigma_1 σ1为方差,而 r r r为小车的可能位置, y 1 y_1 y1 为某个可能位置 ( r ) (r) (r) 的概率分布。
小车位置2
假设在t 时刻,我们通过GPS或测距仪测得小车距离原点的距离 r r r,由于测量包含噪声(且在面前我们假设了其为高斯噪声),因此该测量值也可以利用高斯概率分布来表示:
y 2 ( r ; μ 2 , σ 2 ) = 1 2 π σ 2 2 e − ( r − μ 2 ) 2 2 σ 2 2 {{y}_{2}}(r;{{\mu }_{2}},{{\sigma }_{2}})=\frac{1}{\sqrt{2\pi \sigma _{2}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{2}})}^{2}}}{2\sigma _{2}^{2}}}} y2(r;μ2,σ2)=2πσ221e−2σ22(r−μ2)2
除了下标外,其余的字母的含义都和上面的式子一样。
由此我们得到了小车的两个预估模型,一个是通过上一时刻状态量预测得到的预测模型(预测更新),另一个是通过测量得到的测量模型(测量更新)。两个模型虽然使用不同的方法计算所得,但是两者都反应了小车的位置信息,即两者之间存在一定的关联。如下图所示,蓝色区域是两个预估模型的交界处,也就说明小车位于蓝色区域的概率最大。
&emap;&emap;这也意味着,我们所能得到的关于小车位置的最佳估计,就是将预测更新和测量更新所得的数据融合起来,得到蓝色区域的概率模型。而这里的融合,就是一个简单的“乘法”,并利用了一个性质:两个高斯分布的乘积仍然是高斯分布。
y f ( r ; μ f , σ f ) = y 1 ( r ; μ 1 , σ 1 ) ⋅ y 2 ( r ; μ 2 , σ 2 ) = 1 2 π σ 1 2 e − ( r − μ 1 ) 2 2 σ 1 2 ⋅ 1 2 π σ 2 2 e − ( r − μ 2 ) 2 2 σ 2 2 \begin{aligned} {{y}_f}(r;{{\mu }_{f}},{{\sigma }_{f}})&={{y}_{1}}(r;{{\mu }_{1}},{{\sigma }_{1}})\cdot{{y}_{2}}(r;{{\mu }_{2}},{{\sigma }_{2}})\\ &=\frac{1}{\sqrt{2\pi \sigma _{1}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{1}})}^{2}}}{2\sigma _{1}^{2}}}}\cdot \frac{1}{\sqrt{2\pi \sigma _{2}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{2}})}^{2}}}{2\sigma _{2}^{2}}}} \\ \end{aligned} yf(r;μf,σf)=y1(r;μ1,σ1)⋅y2(r;μ2,σ2)=2πσ121e−2σ12(r−μ1)2⋅2πσ221e−2σ22(r−μ2)2
上式可以简化为:
y f ( r ; μ f , σ f ) = 1 2 π σ f 2 e − ( r − μ f ) 2 2 σ f 2 {{y}_f}(r;{{\mu }_{f}},{{\sigma }_{f}})=\frac{1}{\sqrt{2\pi \sigma _{f}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{f}})}^{2}}}{2\sigma _{f}^{2}}}} yf(r;μf,σf)=2πσf21e−2σf2(r−μf)2
其中 μ f \mu_f μf是 μ 1 \mu_1 μ1和 μ 2 \mu_2 μ2的加权平均, σ f \sigma_f σf是 σ 1 \sigma_1 σ1和 σ 2 \sigma_2 σ2的调和平均的二分之一:
μ f = μ 1 σ 2 2 + μ 2 σ 1 2 σ 1 2 + σ 2 2 = μ 1 + σ 1 2 ( μ 2 − μ 1 ) σ 1 2 + σ 2 2 {{\mu }_{f}}=\frac{{{\mu }_{1}}\sigma _{2}^{2}+{{\mu }_{2}}\sigma _{1}^{2}}{\sigma _{1}^{2}+\sigma _{2}^{2}}={{\mu }_{1}}+\frac{{{\sigma }_{1}^2}({{\mu }_{2}}-{{\mu }_{1}})}{\sigma _{1}^{2}+\sigma _{2}^{2}} μf=σ12+σ22μ1σ22+μ2σ12=μ1+σ12+σ22σ12(μ2−μ1)
σ f = 1 1 σ 1 + 1 σ 2 = σ 1 σ 2 σ 1 2 + σ 2 2 = σ 1 2 − σ 1 4 σ 1 2 + σ 2 2 {{\sigma }_{f}}=\frac{1}{\frac{1}{{{\sigma }_{1}}}\text{+}\frac{1}{{{\sigma }_{2}}}}=\frac{{{\sigma }_{1}}{{\sigma }_{2}}}{\sigma _{1}^{2}+\sigma _{2}^{2}}\text{=}\sigma _{1}^{2}-\frac{\sigma _{1}^{4}}{\sigma _{1}^{2}+\sigma _{2}^{2}} σf=σ11+σ211=σ12+σ22σ1σ2=σ12−σ12+σ22σ14
由此我们便可以得到融合后小车位置的高斯分布,如下图中蓝色曲线所示。
在刚刚的一维情况的小例子中,我们其实做了一个隐式的假设,即有预测更新得到的位置的概率分布和测距仪所得的测量值具有相同的单位 (unit),如米 (m)。
但实际情况往往不是这样的,比如,测距仪给出的可能不是距离,而是信号的飞行时间(由仪器至小车的光的传播时间),单位为秒 (s)。这样的话,我们就无法直接如上面一般直接将两个高斯分布相乘了。
此时,就需要用到转换矩阵 H t \mathbf{H}_t Ht。由于 r = c ⋅ t r=c\cdot t r=c⋅t, c c c为光速。所以此时 t = r c t=\frac{r}{c} t=cr。因此预测值就可以写为:
y 1 ( s ; μ 1 , σ 1 ) = 1 2 π ( σ 1 c ) 2 e − ( r − μ 1 c ) 2 2 ( σ 1 c ) 2 {{y}_{1}}(s;{{\mu }_{1}},{{\sigma }_{1}})=\frac{1}{\sqrt{2\pi (\frac{\sigma _{1}}{c})^{2}}}{{e}^{-\frac{{{(r-\frac{{{\mu }_{1}}}{c})}^{2}}}{2(\frac{\sigma _{1}}{c})^{2}}}} y1(s;μ1,σ1)=2π(cσ1)21e−2(cσ1)2(r−cμ1)2
而观测值则保持不变:
y 2 ( r ; μ 2 , σ 2 ) = 1 2 π σ 2 2 e − ( r − μ 2 ) 2 2 σ 2 2 {{y}_{2}}(r;{{\mu }_{2}},{{\sigma }_{2}})=\frac{1}{\sqrt{2\pi \sigma _{2}^{2}}}{{e}^{-\frac{{{(r-{{\mu }_{2}})}^{2}}}{2\sigma _{2}^{2}}}} y2(r;μ2,σ2)=2πσ221e−2σ22(r−μ2)2
这样,两个高斯分布在转换矩阵 H = 1 c \mathbf{H}=\frac{1}{c} H=c1的作用下在同一个空间下。根据前面的 μ f \mu_{f} μf和 σ f \sigma_f σf,可以得到:
μ f c = μ 1 c + σ 1 c ( μ 2 − μ 1 c ) ( σ 1 c ) 2 + σ 2 2 \frac{{\mu }_{f}}{c}=\frac{{\mu }_{1}}{c}+\frac{{\frac{{\sigma }_{1}}{c}}({{\mu }_{2}}-\frac{{\mu }_{1}}{c})}{(\frac{\sigma _{1}}{c})^{2}+\sigma _{2}^{2}} cμf=cμ1+(cσ1)2+σ22cσ1(μ2−cμ1)
μ f = μ 1 + ( σ 1 c ) 2 ( σ 1 c ) 2 + σ 2 2 ( μ 2 − μ 1 ) {{\mu }_{f}}={{\mu }_{1}}+\frac{{(\frac{{\sigma }_{1}}{c})^2}}{(\frac{\sigma _{1}}{c})^{2}+\sigma _{2}^{2}}({{\mu }_{2}}-{{\mu }_{1}}) μf=μ1+(cσ1)2+σ22(cσ1)2(μ2−μ1)
同理可得
σ f = σ 1 2 − K H σ 1 {{\sigma }_{f}}=\sigma _{1}^{2}-\mathbf{KH}\sigma_1 σf=σ12−KHσ1
因此,在高维空间中,
x ^ t = x ^ t ∣ t − 1 + K t ( z t − H t x ^ t ∣ t − 1 ) \hat{\mathbf{x}}_t=\hat{\mathbf{x}}_{t|t-1}+\mathbf{K}_t(\mathbf{z}_t-\mathbf{H}_t\hat{\mathbf{x}}_{t|t-1}) x^t=x^t∣t−1+Kt(zt−Htx^t∣t−1)
P t = P t ∣ t − 1 − K t H t P t ∣ t − 1 \mathbf{P}_t=\mathbf{P}_{t|t-1}-\mathbf{K}_t\mathbf{H}_t\mathbf{P}_{t|t-1} Pt=Pt∣t−1−KtHtPt∣t−1
其中, K t = P t ∣ t − 1 H t T ( H t P t ∣ t − 1 H t T + R t ) − 1 \mathbf{K}_t=\mathbf{P}_{t|t-1}\mathbf{H}_t^T(\mathbf{H}_t\mathbf{P}_{t|t-1}\mathbf{H}_t^T+\mathbf{R}_t)^{-1} Kt=Pt∣t−1HtT(HtPt∣t−1HtT+Rt)−1为卡尔曼增益。