增强蒙特卡洛定位
基于粒子滤波的定位算法称为蒙特卡洛定位(Monte Carlo Localization,MCL),也就是我们上一章提到的SIR滤波。但实际定位时,MCL仍存在几个比较大的问题:
- 无法解决机器人绑架问题;
- 粒子数无法动态调整,存在冗余问题; 增强蒙特卡洛定位(Augmented_MCL,AMCL)算法在MCL的基础上,针对上述问题提出了对应的解决方案,使得其成为机器人领域一个非常基础但实用的算法。其是ROS/ROS2 Navigation包官方定位算法,并且AMCL代码接近十年都没有过更改。 同时AMCL也在一些工业机器人场景使用,如国内机器人公司仙工。
这里按照概率机器人这本经典书中的公式,把AMCL过一遍。 首先,给出MCL算法流程如下:
第3行采样次数为,也就是所谓的粒子数为。第4行是”撒粒子“步骤,对应先前说到的先验采样,选用的条件先验概率密度函数作为建议分布,对于机器人定位而言,建议分布对应机器人的运动模型,如轮式编码器模型。第5行计算粒子权重,根据观测方程,即测量模型给出。第9-10行为重采样步骤。
随机粒子
机器人绑定问题指的是机器人定位突然丢失或者突然错误。这种情况在MCL中很显著,当粒子数较少或者粒子分布范围较大时,此时重采样,正确位姿周围可能没有对应的粒子,导致定位失败。解决方案是随机撒一些新的粒子。接下来的问题是撒多少粒子,以及按照什么分布撒?
当定位失败时,观测值的似然概率会落在一个很小的值,因为此时状态不在合理范围内。粒子滤波中,似然概率就是粒子权重,粒子集权重平均为:
但是,似然概率小,不一定对应定位失败,有可能传感器数据噪声本来就很大,或者处于全局定位过程。所以引入一个长期的似然概率平均值和短期的似然概率平均值,通过判断两者有没有明显分化,来识别定位发散的情况,并在此时撒入新的粒子。
这里引入了一个指数移动平均(Exponential Moving Average),在时间维度上去平滑得到和:
指数移动平均(Exponential Moving Average)
定义如下:
其中是当前输出,是之前的输出,是当前输入。在0和1之间,等于1时,则不平滑滤波,等于0时,则一直不更新。越大,受到最近输入的影响越大。 “指数“的含义是之前输入对当前输出的影响指数衰减,可由下式看出:
\begin{aligned} y[n] & =\alpha x[n]+(1-\alpha) y[n-1] \ & =\alpha x[n]+(1-\alpha)(\alpha x[n-1]+(1-\alpha) y[n-2]) \ & =\alpha x[n]+(1-\alpha)(\alpha x[n-1]+(1-\alpha)(\alpha x[n-2]+(1-\alpha) y[n-3])) \ & \ldots \ & =\alpha \sum_{k=0}^n(1-\alpha)^k x[n-k] \end{aligned}
通过设置,那么当定位失败,突然变小,将会更快反应出这个变化,随之变小。因此,随机撒入新的粒子需要满足以下条件:
粒子对应的权重为,即似然概率越小,代表定位结果越差,对应撒的新的粒子的权重就越高。注意,这里提到的定位失败也包含定位结果比较差的情况。
既然机器人碰到绑架问题了,那么说状态先验概率密度函数不灵了,先验采样也失效了,此时应切换到似然采样,将似然函数作为建议分布。参考上一篇文章采样重要性重采样滤波。
对应的AMCL代码流程如下:
与MCL相比,核心变化在13行,当检测到定位失败时,切换到似然采样重新采样,并重新赋予粒子权重。
KLD采样
定位未收敛时,我们希望撒入尽可能多的粒子,覆盖整个状态空间。但当定位收敛时,粒子聚拢在真值附近,只需要采样小部分粒子就可以定位。问题来了,怎么确定需要采样多少个粒子呢?
很直接的思路,就是看我们采样近似的后验概率分布函数与真实分布的差异是否足够小,足够小的时候就不需要再去采样了。这个差距叫做KL距离(Kullback-Leibler distance):
显然,我们是不知道真实分布的,没办法直接求KL距离。但是可以假设后验概率分布函数服从多项分布:分布在个不同的格子,总采样数为且。落入每个格子的概率为且。显然,的似然估计是。接下来我们看一下似然比统计量。简单来说,似然比统计量就是看采样的样本信息是否符合真实概率分布:
其收敛于分布,具体推导可以参考Mathematical Statistics and Data Analysis:$$ 2 \log \lambda_n \rightarrow \chi_{k-1}^2 \quad \text { as } \quad n \rightarrow \infty
K(\widehat{p}, p)=\sum_{j=1}^k \widehat{p}_j \log \left(\frac{\widehat{p}_j}{p_j}\right)
K(\underline{\hat{p}}, \underline{p}) \leq \epsilon
\begin{aligned} &2nK(\underline{\hat{p}}, \underline{p}) \leq 2n\epsilon \ \Rightarrow & \ \ \ \ \ \chi_{k-1}^2 \leq 2n\epsilon \end{aligned}
P\left(\chi_{k-1}^2 \leq \chi_{k-1,1-\delta}^2\right)=1-\delta
n=\frac{1}{2 \epsilon} \chi_{k-1,1-\delta}
n=\frac{1}{2 \epsilon} \chi_{k-1,1-\delta}^2 \doteq \frac{k-1}{2 \epsilon}\left{1-\frac{2}{9(k-1)}+\sqrt{\frac{2}{9(k-1)}} z_{1-\delta}\right}