我用的ros2-dashing版本,其他版本的没看过。navigation2代码可以git下载navigation2。
amcl算法全部可以从《概率机器人》书上找到:生成新粒子群(5.4节)、计算权重(6.4节)、重采样算法(8.3.5节)。有了算法看代码就容易很多。
在计算粒子权重后,进行重采样,注入一些随机粒子,提升鲁棒性。
即 p ( x t ∣ u t , x t − 1 ) p(x_t|u_t,x_{t-1}) p(xt∣ut,xt−1)
在时间 ( t − 1 , t ] (t-1,t] (t−1,t]内,机器人从位姿 x ‾ t − 1 = { x ‾ , y ‾ , θ ‾ } \overline{x}_{t-1}=\{\overline{x},\overline{y},\overline{\theta}\} xt−1={x,y,θ}到 x ‾ t = { x ‾ ′ , y ‾ ′ , θ ‾ ′ } \overline{x}_t=\{\overline{x}^\prime,\overline{y}^\prime,\overline{\theta}^\prime\} xt={x′,y′,θ′}。里程计的相对前进可以写作:
u t = ( x ‾ t − 1 , x ‾ t ) u_t=(\overline{x}_{t-1},\overline{x}_t) ut=(xt−1,xt)
相对前进可以被转变为三个步骤的序列:
这三个参数一起可以组成由里程计编码的相对运动统计量。
利用里程计的相对前进可以估计两时刻粒子 x t − 1 x_{t-1} xt−1和 x t x_{t} xt之间的相对差。
α 1 , α 2 , α 3 , α 4 \alpha_1,\alpha_2,\alpha_3,\alpha_4 α1,α2,α3,α4是指定机器人运动噪声的特定参数。
p r o b ( a , b 2 ) prob(a,b^2) prob(a,b2)是均值为0,方差为 b 2 b^2 b2的高斯分布,值为a的概率。
算法输入
第2-4行:计算里程计数据的模型参数
第5-7行:计算粒子数据的模型参数
第8-9行:计算各自运动参数的误差概率。
第11行:由各自误差概率 p 1 , p 2 , p 3 p_1,p_2,p_3 p1,p2,p3相乘得到的组合误差概率。
将粒子初始姿态 x t − 1 x_{t-1} xt−1和里程计读数 u t u_t ut作为输入,输出一个随机 x t x_t xt服从 p ( x t ∣ u t , x t − 1 ) p(x_t|u_t,x_{t-1}) p(xt∣ut,xt−1)的分布
将传感器光束 z t k z_t^k ztk扫描到的障碍物, 映射到map坐标系。这需要了解:
那么光束 z t k z_t^k ztk测量到障碍物在map中的坐标
[ x z t k y z t k ] = [ x y ] + [ cos θ − sin θ sin θ cos θ ] [ x k , s e n s e y k , s e n s e ] + z k [ cos ( θ + θ k , s e n s e ) sin ( θ + θ k , s e n s e ) ] \begin{bmatrix}x_{z_t^k} \\ y_{z_t^k} \end{bmatrix} = \begin{bmatrix}x \\ y \end{bmatrix} + \begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix}x_{k,sense} \\ y_{k,sense} \end{bmatrix}+ z_k\begin{bmatrix}\cos(\theta + \theta_{k,sense}) \\ \sin(\theta + \theta_{k,sense}) \end{bmatrix} [xztkyztk]=[xy]+[cosθsinθ−sinθcosθ][xk,senseyk,sense]+zk[cos(θ+θk,sense)sin(θ+θk,sense)]
这些坐标只有当传感器检测到一个障碍物时才是有意义的。如果测距传感器输出了最大值 z = z m a x z= z_{max} z=zmax,则这些坐标在物理世界没有任何意义(即使测量的确携带了信息)。似然域测量模型简单地将最大距离读数丢弃。
测量噪声
测量过程引起的噪声使用高斯进行建模。它涉及寻找地图上最近的障碍物。
测量失败
假定最大距离读数具有非常大的似然,可用点群分布 p m a x p_{max} pmax进行建模。
无法解释的随机测量
用一个均匀分布 p r a n d p_{rand} prand为感知中的随机噪声建立模型。
最终期望概率 p ( z t k ∣ x t , m ) p(z_t^k|x_t,m) p(ztk∣xt,m)集成了三种分布
p ( z t k ∣ x t , m ) = z h i t p h i t + z r a n d p r a n d + z m a x p m a x p(z_t^k|x_t,m)=z_{hit}p_{hit} +z_{rand}p_{rand} +z_{max}p_{max} p(ztk∣xt,m)=zhitphit+zrandprand+zmaxpmax
基于某些定位性能的评估增加一些随机粒子,提升鲁棒性。
每次更新粒子群,也会更新计算 w a g v , w s l o w , w f a s t w_{agv},w_{slow},w_{fast} wagv,wslow,wfast,并且重采样。重采样时一部分完全随机,另一部分按照权重作为概率抽样。
粒子滤波原理推导