【自动驾驶】学习卡尔曼滤波(二)——扩展卡尔曼滤波

参考资料

文章大部分内容是根据参考资料整理所得,旨在于更方便学习记忆查找,不作其他用途。

上一篇整理总结了基本的卡尔曼滤波后,这一章来学习扩展卡尔曼滤波(EKF),由于许多符号在上一篇中已经说明,所以本篇讲解中不再赘述。

1. 基本概念

如下式,当状态转移矩阵(过程模型)和观测矩阵(观测模型)为非线性时,基础的卡尔曼滤波就无法发挥用处了,由此引入了扩展卡尔曼滤波。

x k = g ( u k , x k − 1 ) + ω k x_k=g(u_k, x_{k-1})+\omega_k xk=g(uk,xk1)+ωk

z k = h ( x k ) + v k z_k=h(x_k)+v_k zk=h(xk)+vk

对以上非线性函数进行泰勒展开,可化为线性形式。所以,扩展卡尔曼滤波算法只比原始卡尔曼滤波算法多了一步线性化的工作。具体流程如下图:

在这里插入图片描述
可以发现,他与线性的卡尔曼滤波差别不大:

在这里插入图片描述

1.1 线性化过程——雅可比矩阵

在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式

雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近。因此,雅可比矩阵类似于多元函数的导数。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.2 预测

故原本状态方程和观测方程中的 A , H A,H A,H矩阵(或者用 F , H F,H F,H符号表示,本文主要使用 F , H F,H F,H表示,如果图片中出现了 A , H A,H A,H,意思是一样的),在非线性系统中用雅可比矩阵代替

在这里插入图片描述所以预测阶段的公式变为:

在这里插入图片描述

1.3 更新

更新方程相对于KF而言,主要变动如下:

y ^ k = z k − h ( x ^ k ∣ k − 1 , 0 ) S k = J H P k ∣ k − 1 J H T + R k K k = P k ∣ k − 1 J H T S k − 1 x ^ k ∣ k = x ^ k ∣ k − 1 + K k y ^ k P k ∣ k = ( I − K k J H ) P k ∣ k − 1 \begin{aligned} &\hat{y}_{k}=z_{k}-h\left(\hat{x}_{k \mid k-1}, 0\right) \\ &S_{k}=J_{H} P_{k \mid k-1} J_{H}^{T}+R_{k} \\ &K_{k}=P_{k \mid k-1} J_{H}^{T} S_{k}^{-1} \\ &\hat{x}_{k \mid k}=\hat{x}_{k \mid k-1}+K_{k} \hat{y}_k \\ &P_{k \mid k}=\left(I-K_{k} J_{H}\right) P_{k \mid k-1} \end{aligned} y^k=zkh(x^kk1,0)Sk=JHPkk1JHT+RkKk=Pkk1JHTSk1x^kk=x^kk1+Kky^kPkk=(IKkJH)Pkk1

2. 移动机器人应用

本节内容主要来自博客

2.1 移动机器人运动学模型(过程模型)

  • 连续运动学模型:
    { x ˙ = v cos ⁡ ( ϕ ) y ˙ = v sin ⁡ ( ϕ ) ϕ ˙ = ω } (1) \tag{1} \left\{\begin{array}{c} \dot{x}=v \cos (\phi) \\ \dot{y}=v \sin (\phi) \\ \dot{\phi}=\omega \end{array}\right\} x˙=vcos(ϕ)y˙=vsin(ϕ)ϕ˙=ω(1)

  • 离散化后模型:
    { x t = x t − 1 + d t v cos ⁡ ( ϕ ) y t = y t − 1 + d t v sin ⁡ ( ϕ ) ϕ t = ϕ t − 1 + d t ω t } (2) \tag{2} \left\{\begin{array}{c} x_{t}=x_{t-1}+d_{t} v \cos (\phi) \\ y_{t}=y_{t-1}+d_{t} v \sin (\phi) \\ \phi_{t}=\phi_{t-1}+d_{t} \omega_{t} \end{array}\right\} xt=xt1+dtvcos(ϕ)yt=yt1+dtvsin(ϕ)ϕt=ϕt1+dtωt(2)

    设移动机器人在时间 t t t 时刻的状态为四维向量 x t \mathbf{x}_t xt ​:

    x t = [ x t , y t , ϕ t , v t ] T \mathbf{x}_t=[x_t, y_t, \phi_t,v_t]^T xt=[xt,yt,ϕt,vt]T

    • x t x_t xt为二维笛卡尔坐标系的X轴坐标值;
    • y t y_t yt​为二维笛卡尔坐标系的Y轴坐标值;
    • ϕ t \phi_t ϕt为移动机器人的航向角;
    • v t v_t vt为移动机器人的行驶线速度。

    设状态转移噪声方差为 R R R,观测噪声方差为 Q Q Q

    移动机器人装载有速度传感器与陀螺仪,可分别测量时刻 t t t的速度与角速度为:
    u t = [ v t , ω t ] T \mathbf{u}_t=[v_t, \omega_t]^T ut=[vt,ωt]T

  • 状态向量为 x t = [ x t , y t , ϕ t , v t ] T \mathbf{x}_{t}=\left[x_{t}, y_{t}, \phi_{t}, v_{t}\right]^{T} xt=[xt,yt,ϕt,vt]T ,输入控制量为 u t = [ v t , ω t ] T \mathbf{u}_{t}=\left[v_{t}, \omega_{t}\right]^T ut=[vt,ωt]T ,可得状态转移函数为:
    x t = F x t − 1 + B u t \mathbf{x}_{t}=F \mathbf{x}_{t-1}+B \mathbf{u}_{t} xt=Fxt1+But
    F = [ 1.0 0 0 0 0 1.0 0 0 0 0 1.0 0 0 0 0 0 ] F=\left[\begin{array}{cccc} 1.0 & 0 & 0 & 0 \\ 0 & 1.0 & 0 & 0 \\ 0 & 0 & 1.0 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right] F=1.000001.000001.000000
    B = [ d t cos ⁡ ( ϕ t ) 0 d t sin ⁡ ( ϕ t ) 0 0 d t 1.0 0 ] B=\left[\begin{array}{cc} d_{t} \cos \left(\phi_{t}\right) & 0 \\ d_{t} \sin \left(\phi_{t}\right) & 0 \\ 0 & d_{t} \\ 1.0 & 0 \end{array}\right] B=dtcos(ϕt)dtsin(ϕt)01.000dt0

2.2 雅可比矩阵

由于控制向量的系数矩阵 B B B 中包含状态量 ϕ t \phi_{t} ϕt ,所以上面的状态转移函数为非线性。利用式 (2),我们可以得到状态函数的Jacobian矩 阵 J F J_{F} JF :
J F = [ d x d x d x d y d x d ϕ d x d v d y d x d y d y d y d ϕ d y d v d ϕ d x d ϕ d y d ϕ d ϕ d ϕ d v d v d x d v d y d v d ϕ d v d v ] = [ 1 0 − v sin ⁡ ( ϕ ) d t cos ⁡ ( ϕ ) d t 0 1 v cos ⁡ ( ϕ ) d t sin ⁡ ( ϕ ) d t 0 0 1 0 0 0 0 1 ] J_{F}=\left[\begin{array}{llll} \frac{d x}{d x} & \frac{d x}{d y} & \frac{d x}{d \phi} & \frac{d x}{d v} \\ \frac{d y}{d x} & \frac{d y}{d y} & \frac{d y}{d \phi} & \frac{d y}{d v} \\ \frac{d \phi}{d x} & \frac{d \phi}{d y} & \frac{d \phi}{d \phi} & \frac{d \phi}{d v} \\ \frac{d v}{d x} & \frac{d v}{d y} & \frac{d v}{d \phi} & \frac{d v}{d v} \end{array}\right] =\left[\begin{array}{cccc} 1 & 0 & -v \sin (\phi) d t & \cos (\phi) d t \\ 0 & 1 & v \cos (\phi) d t & \sin (\phi) d t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] JF=dxdxdxdydxdϕdxdvdydxdydydydϕdydvdϕdxdϕdydϕdϕdϕdvdvdxdvdydvdϕdvdv=10000100vsin(ϕ)dtvcos(ϕ)dt10cos(ϕ)dtsin(ϕ)dt01

2.3 观测模型

假定移动机器人装载有GNSS(卫星导航定位)传感器,可以实时获得自身的位置作为自身的观测向量 z t \mathbf{z}_t zt

z t = [ x t , y t ] T \mathbf{z}_t=[x_t, y_t]^T zt=[xt,yt]T

使用矩阵表示即
z t = H x t H = [ 1.0 0 0 0 0 1.0 0 0 ] \begin{gathered} \mathbf{z}_{t}=H \mathbf{x}_{t} \\ H=\left[\begin{array}{cccc} 1.0 & 0 & 0 & 0 \\ 0 & 1.0 & 0 & 0 \end{array}\right] \end{gathered} zt=HxtH=[1.0001.00000]

2.4 PYTHON代码实现

该部分见于github仓库

猜你喜欢

转载自blog.csdn.net/weixin_42301220/article/details/124605350