SLAM问题的输入只有测量和控制,没有地图和位姿估计。
有两种同等重要的SLAM问题:
SLAM问题的另一个特点与估计问题的本质相关,即包含一个连续和一个离散问题:
连续问题与地图中物体的位置和机器人的位姿相关;
离散问题与物体的关联相关。
有时,显式估计地标的关联是有利的,在线后验为 p ( x t , m , c t ∣ z 1 : t , u 1 : t ) p(x_t,m,c_t|z_{1:t},u_{1:t}) p(xt,m,ct∣z1:t,u1:t)。
不管是哪种SLAM问题,估计全部后验分布都是最好的,但通常不可行:
本章介绍EKF算法,解决在线SLAM问题。
最早、最有影响力的SLAM算法就是基于EKF的。
EKF SLAM算法使用最大可能性数据关联,将EKF用于在线SLAM问题。
包含了多个近似和有限制的假设:
即只解决SLAM问题的连续部分。
同时估计地标的位置和机器人的位姿,需要把地标的坐标加入状态向量中,即
y t = ( x y θ m 1 , x m 1 , y s 1 . . . m N , x m N , y S N ) y_t=(x\ y\ \theta\ m_{1,x}\ m_{1,y}\ s_1\ ...\ m_{N,x}\ m_{N,y}\ S_N) yt=(x y θ m1,x m1,y s1 ... mN,x mN,y SN)
N N N是地图中地标总数,EKF估计在线后验 p ( y t ∣ z 1 : t , u 1 : t ) p(y_t|z_{1:t}, u_{1:t}) p(yt∣z1:t,u1:t)。
算法 EKF_SLAM_known_correspondences( μ t − 1 , Σ t − 1 , u t , z t , c t \mu_{t-1}, \Sigma_{t-1}, u_t, z_t, c_t μt−1,Σt−1,ut,zt,ct):
02························
F x = ( 1 0 0 0 ⋯ 0 0 1 0 0 ⋯ 0 0 0 1 0 ⋯ 0 ) F_x=\left( \begin{array}{ccccc} 1 & 0 & 0 & 0 & \cdots & 0\\ 0 & 1 & 0 & 0 & \cdots & 0\\ 0 & 0 & 1 & 0 & \cdots & 0 \end{array}\right) Fx=⎝⎛100010001000⋯⋯⋯000⎠⎞
矩阵右边是2N列个0。
是系数矩阵。
03························
μ ˉ t = μ t − 1 + F x T ( − v t ω t sin μ t − 1 , θ + v t w t sin ( μ t − 1 , θ + ω t Δ t ) v t ω t cos μ t − 1 , θ − v t w t cos ( μ t − 1 , θ + ω t Δ t ) ω t Δ t ) \bar{\mu}_t=\mu_{t-1}+F_x^T \left( \begin{array}{c} -\frac{v_t}{\omega_t}\sin\mu_{t-1,\theta}+\frac{v_t}{w_t}\sin(\mu_{t-1,\theta}+\omega_t\Delta t) \\ \frac{v_t}{\omega_t}\cos\mu_{t-1,\theta}-\frac{v_t}{w_t}\cos(\mu_{t-1,\theta}+\omega_t\Delta t) \\ \omega_t\Delta t \end{array}\right) μˉt=μt−1+FxT⎝⎛−ωtvtsinμt−1,θ+wtvtsin(μt−1,θ+ωtΔt)ωtvtcosμt−1,θ−wtvtcos(μt−1,θ+ωtΔt)ωtΔt⎠⎞
用运动模型来更新均值
04························
G t = I + F x T ( 0 0 − v t ω t sin μ t − 1 , θ + v t w t sin ( μ t − 1 , θ + ω t Δ t ) 0 0 v t ω t cos μ t − 1 , θ − v t w t cos ( μ t − 1 , θ + ω t Δ t ) 0 0 ω t Δ t ) F x G_t=I+F_x^T \left( \begin{array}{ccc} 0 & 0 & -\frac{v_t}{\omega_t}\sin\mu_{t-1,\theta}+\frac{v_t}{w_t}\sin(\mu_{t-1,\theta}+\omega_t\Delta t) \\ 0 & 0 & \frac{v_t}{\omega_t}\cos\mu_{t-1,\theta}-\frac{v_t}{w_t}\cos(\mu_{t-1,\theta}+\omega_t\Delta t) \\ 0 & 0 & \omega_t\Delta t \end{array}\right)F_x Gt=I+FxT⎝⎛000000−ωtvtsinμt−1,θ+wtvtsin(μt−1,θ+ωtΔt)ωtvtcosμt−1,θ−wtvtcos(μt−1,θ+ωtΔt)ωtΔt⎠⎞Fx
G G G是雅可比,用于泰勒展开,即
g ( u t , x t − 1 ) ≈ g ( u t , μ t − 1 ) + G t ( x t − 1 − μ t − 1 ) g(u_t, x_{t-1})\approx g(u_t, \mu_{t-1})+G_t(x_{t-1}-\mu_{t-1}) g(ut,xt−1)≈g(ut,μt−1)+Gt(xt−1−μt−1)
05························
Σ ˉ t = G t Σ t − 1 G t T + F x T R t F x \bar{\Sigma}_t=G_t\Sigma_{t-1}G_t^T + F_x^T R_t F_x Σˉt=GtΣt−1GtT+FxTRtFx
更新方差
06························
Q t = ( σ r 0 0 0 σ ϕ 0 0 0 σ s ) Q_t=\left( \begin{array}{ccc} \sigma_r & 0 & 0 \\ 0 & \sigma_\phi & 0 \\ 0 & 0 & \sigma_s \end{array}\right) Qt=⎝⎛σr000σϕ000σs⎠⎞
观测的协方差矩阵
07····for all observed features z t i = ( r t i ϕ t i s t i ) T z_t^i = (r_t^i\ \phi_t^i\ s_t^i)^T zti=(rti ϕti sti)T do
08········ j = c t i j = c_t^i j=cti
09········if landmark j j j never seen before
10············compute feature coordinates ( μ ˉ j , x μ ˉ j , y μ ˉ j , s ) T (\bar{\mu}_{j,x}\ \bar{\mu}_{j,y}\ \bar{\mu}_{j,s})^T (μˉj,x μˉj,y μˉj,s)T based on measurement and μ ˉ t \bar{\mu}_t μˉt
对初次观测的特征点的坐标进行初始化。
11········endif
12········ δ = ( δ x δ y ) T = ( μ ˉ j , x − μ ˉ t , x μ ˉ j , y − μ ˉ t , y ) \delta=(\delta_x\ \delta_y)^T=(\bar{\mu}_{j,x}-\bar{\mu}_{t,x} \ \bar{\mu}_{j,y}-\bar{\mu}_{t,y}) δ=(δx δy)T=(μˉj,x−μˉt,x μˉj,y−μˉt,y)
计算这个特征点与机器人预测位姿的相对坐标 δ \delta δ
13········ q = δ T δ q=\delta^T\delta q=δTδ
计算特征点与机器人的距离的平方(标量)
14········ z ^ t i = ( q atan2 ( δ y , δ x ) − μ ˉ t , θ μ ˉ j , s ) T \hat{z}_t^i=(\sqrt{q}\ \text{atan2}(\delta_y, \delta_x)-\bar{\mu}_{t,\theta}\ \bar{\mu}_{j,s})^T z^ti=(q atan2(δy,δx)−μˉt,θ μˉj,s)T
15····························
F x , j = ( 1 0 0 0 ⋯ 0 0 0 0 0 ⋯ 0 0 1 0 0 ⋯ 0 0 0 0 0 ⋯ 0 0 0 1 0 ⋯ 0 0 0 0 0 ⋯ 0 0 0 0 0 ⋯ 0 1 0 0 0 ⋯ 0 0 0 0 0 ⋯ 0 0 1 0 0 ⋯ 0 0 0 0 0 ⋯ 0 ⎵ 2 j − 2 0 0 1 0 ⋯ 0 ⎵ 2 N − 2 j ) F_{x,j}=\left(\begin{array}{ccccccccc} 1 & 0 & 0 & 0\ \cdots\ 0 & 0 & 0 & 0 & 0\ \cdots\ 0 \\ 0 & 1 & 0 & 0\ \cdots\ 0 & 0 & 0 & 0 & 0\ \cdots\ 0 \\ 0 & 0 & 1 & 0\ \cdots\ 0 & 0 & 0 & 0 & 0\ \cdots\ 0 \\ 0 & 0 & 0 & 0\ \cdots\ 0 & 1 & 0 & 0 & 0\ \cdots\ 0 \\ 0 & 0 & 0 & 0\ \cdots\ 0 & 0 & 1 & 0 & 0\ \cdots\ 0 \\ 0 & 0 & 0 & \underbrace{0\ \cdots\ 0}_{2j-2} & 0 & 0 & 1 & \underbrace{0\ \cdots\ 0}_{2N-2j} \end{array}\right) Fx,j=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛1000000100000010000 ⋯ 00 ⋯ 00 ⋯ 00 ⋯ 00 ⋯ 02j−2 0 ⋯ 00001000000100000010 ⋯ 00 ⋯ 00 ⋯ 00 ⋯ 00 ⋯ 02N−2j 0 ⋯ 0⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
16····························
H t i = 1 q ( q δ x − q δ y 0 − q δ x q δ y 0 δ y d e l t a x − 1 δ y − δ x 0 0 0 0 0 0 1 ) F x , j H_t^i=\frac{1}{q}\left(\begin{array}{cccccc} \sqrt{q}\delta_x & -\sqrt{q}\delta_y & 0 & -\sqrt{q}\delta_x & \sqrt{q}\delta_y & 0 \\ \delta_y & delta_x & -1 & \delta_y & -\delta_x & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \end{array}\right) F_{x,j} Hti=q1⎝⎛qδxδy0−qδydeltax00−10−qδxδy0qδy−δx0001⎠⎞Fx,j
观测的雅可比矩阵
17········ K t i = Σ ˉ t H t i T ( H t i Σ ˉ t H t i T + Q t ) − 1 K_t^i=\bar{\Sigma}_tH_t^{iT}(H_t^i\bar{\Sigma}_tH_t^{iT}+Q_t)^{-1} Kti=ΣˉtHtiT(HtiΣˉtHtiT+Qt)−1
卡尔曼增益矩阵的维度是是3x(3N+3),并且不稀疏;
即任何一个测量给整个状态都传递了新的信息,而不是仅有当前观测到的特征。
这说明,观测到一个地标,能减少所有地标和机器人状态的不确定性。
18····endfor
19···· μ t = μ ˉ t + ∑ i K t i ( z t i − z ^ t i ) \mu_t=\bar{\mu}_t+\sum_iK_t^i(z_t^i-\hat{z}_t^i) μt=μˉt+∑iKti(zti−z^ti)
20···· Σ t = ( I − ∑ i K t i H t i ) Σ ˉ t \Sigma_t=(I-\sum_iK_t^iH_t^i)\bar{\Sigma}_t Σt=(I−∑iKtiHti)Σˉt
21····return μ t , Σ t \mu_t,\Sigma_t μt,Σt
运动预测部分不对地图进行修改。
先略过…
未完待续…