卡尔曼滤波器三:卡尔曼公式推导
转载来源:卡尔曼滤波:从入门到精通
简述
考虑一个SLAM 问题,它由一个运动方程:
x t = f ( x t − 1 , u t ) + ω t (1) \mathbf{x}_{t}=f(\mathbf{x}_{t-1},\mathbf{u}_{t}) + \omega_t \tag 1 xt=f(xt−1,ut)+ωt(1)
和一个观测方程组成:
z t , j = h ( y j , x t ) + v t , j (2) \mathbf{z}_{t,j} = h( \mathbf{y}_{j},\mathbf{x}_{t} ) + v_{t,j} \tag 2 zt,j=h(yj,xt)+vt,j(2)
就把它当作一个线性系统吧(非线性系统请看下一讲扩展卡尔曼滤波),并且为了简化推导,忽略路标的下标j,并把路标y并入到状态向量一起优化,那么运动方程就可以写为:
x t = F t x t − 1 + B t u t + ω t (3) \mathbf{x}_{t}=\mathbf{F}_{t}\mathbf{x}_{t-1}+\mathbf{B}_{t}\mathbf{u}_{t} + \omega_{t} \tag 3 xt=Ftxt−1+Btut+ωt(3)
其中,
- x t {\mathbf{x}_{t} } xt为 t 时刻的状态向量,包括了相机位姿、路标坐标等信息,也可能有速度、朝向等信息;
- u t \mathbf{u}_{t} ut为运动测量值,如加速度,转向等等;
- F t \mathbf{F}_{t} Ft为状态转换方程,将 t-1 时刻的状态转换至 t 时刻的状态;
- B t \mathbf{B}_{t} Bt是控制输入矩阵,将运动测量值 u t \mathbf{u}_{t} ut的作用映射到状态向量上;
- ω t \omega_{t} ωt是预测的高斯噪声,其均值为 0,协方差矩阵为 Q t Q_{t} Qt 。
这一步在卡尔曼滤波中也称为预测 (predict)。
类似地,测量方程可以写为:
z t = H t x t + v t (4) \mathbf{z}_{t}=\mathbf{H}_{t}\mathbf{x}_{t} + \mathbf{v}_{t} \tag 4 zt=Htxt+vt(4)
其中,
- z t \mathbf{z}_{t} zt为传感器的测量值;
- H t \mathbf{H}_{t} Ht为转换矩阵,它将状态向量映射到测量值所在的空间中;
- v t \mathbf{v}_{t} vt为测量的高斯噪声,其均值为0,协方差矩阵为 R t \mathbf{R}_{t} Rt。
而卡尔曼滤波就是预测 - 测量之间不断循环迭代。当然,对于某些情况,如GPS + IMU,由于IMU 测量频率远比GPS 高,在只有IMU 测量值时,只执行运动更新,在有GPS 测量值时再进行测量更新。
运动更新
一个小例子
用一个在解释卡尔曼滤波时最常用的一维例子:小车追踪。如下图所示:

状态向量为小车的位置和速度:
x t = [ x t x ˙ t ] (5) \mathbf{x}_{t}=\left[\begin{array}{c} x_{t} \\ \dot{x}_{t} \end{array}\right] \tag 5 xt=[xtx˙t](5)
而司机要是踩了刹车或者油门,小车就会具有一个加速度,
u t = f t m \mathbf{u}_{t}=\frac{f_{t}}{m} ut=mft
假设 t 和 t-1 时刻之间的时间差为 Δ𝑡 。根据物理知识,有:
{ x t = x t − 1 + x ˙ t − 1 Δ t + 1 2 f t m Δ t 2 x ˙ t = x ˙ t − 1 + f t m Δ t (6) \color{Blue} \begin{cases} x_t = x_{t-1} \quad + &\dot{x}_{t-1}\Delta t &+ &\frac12\frac{f_t}m\Delta t^2 \\ \dot{x}_t = &\dot{x}_{t-1} &+ &\frac{f_t}m\Delta t\end{cases} \tag 6 {
xt=xt−1+x˙t=x˙t−1Δtx˙t−1++21mftΔt2mftΔt(6)
写成矩阵形式:(注意变量对齐,提取系数构建矩阵,变量构建成向量)。
[ x t x ˙ t ] = [ 1 Δ t 0 1 ] [ x t − 1 x ˙ t − 1 ] + [ Δ t 2 2 Δ t ] f t m (7) \color{Blue} \begin{bmatrix} x_t \\ \dot{x}_{t} \end{bmatrix} = \begin{bmatrix} 1 & \Delta t\\ 0 & 1 \end{bmatrix} \begin{bmatrix} {x}_{t - 1} \\ \dot{x}_{t - 1} \end{bmatrix} + \begin{bmatrix} \frac{\Delta t^2}{2} \\ \Delta t \end{bmatrix} \frac{f_{t}}m \tag 7 [xtx˙t]=[10Δt1][xt−1x˙t−1]+[2Δt2Δt]mft(7)
跟之前的运动方程对比,就知道
F t = [ 1 Δ t 0 1 ] , B t = [ Δ t 2 2 Δ t ] (8) \mathbf{F}_{t} =\begin{bmatrix} 1 & \Delta t\\ 0 & 1 \end{bmatrix}, \mathbf{B}_{t} = \begin{bmatrix} \frac{\Delta t^2}{2} \\ \Delta t \end{bmatrix} \tag 8 Ft=[10Δt1],Bt=[2Δt2Δt](8)
公式(3)的估计形式写为:
x ^ t ∣ t − 1 = F t x ^ t − 1 + B t u t (9) \hat{\mathbf{x}}_{t \mid t-1}=\mathbf{F}_{t}\hat{\mathbf{x}}_{t-1}+\mathbf{B}_{t}\mathbf{u}_{t} \tag 9 x^t∣t−1=Ftx^t−1+Btut(9)
x ^ t − 1 \hat{\mathbf{x}}_{t-1} x^t−1表示 t-1 时刻卡尔曼滤波的状态估计; x ^ t ∣ t − 1 \hat{\mathbf{x}}_{t \mid t-1} x^t∣t−1则表示中 t-1 到 t 时刻,预测更新所得的预测值。
再利用运动模型对状态向量进行更新后,还要继续更新状态向量的协方差矩阵 P P P,公式为:
P t ∣ t − 1 = F t P t − 1 F t T + Q t (10) \mathbf{P}_{t \mid t-1}=\mathbf{F}_{t}\mathbf{P}_{t-1}\mathbf{F}_{t}^T +\mathbf{Q}_{t} \tag {10} Pt∣t−1=FtPt−1FtT+Qt(10)
假设 x t {\mathbf{x}_{t} } xt为 t 时刻下状态向量的真值(自然是永远未知的),由之前的现形运动方程(式(3))给出,将式(3) 与式(9) 相减可得:
x t − x ^ t ∣ t − 1 = F t ( x t − x ^ t − 1 ) + ω t (11) \mathbf{x}_{t} - \hat{\mathbf{x}}_{t \mid t-1}=\mathbf{F}_{t}(\mathbf{x}_{t} - \hat{\mathbf{x}}_{t-1})+ \omega_{t} \tag{11} xt−x^t∣t−1=Ft(xt

最低0.47元/天 解锁文章
1099

被折叠的 条评论
为什么被折叠?



