前言

定位是机器人系统中的重要环节,定位是否准确会直接影响到上层算法(如导航等)的效果,因此如何快速准确地完成机器人的定位是机器人开发中不可逃避的课题。本文简要介绍粒子滤波算法的基本思想以及优势,并介绍amcl采用的方案。

粒子滤波的优势

在讨论机器人位置估计时,除了粒子滤波,还有一种经常被提起的方法——卡尔曼滤波,MATLAB官方给出了一个卡尔曼滤波和粒子滤波的简单对比表格:

可以看到,粒子滤波的主要优势是它能够更好地估计非线性,且噪声不是正态分布的系统的状态,而卡尔曼滤波一般只能在噪声近似正态分布时取得较好的效果,具体原因可以参考MATLAB对卡尔曼滤波的介绍视频:【官方中字】什么是卡尔曼滤波器 (Kalman Filters) ?(全7P) MATLAB&Simulink

粒子滤波的基本流程

粒子滤波的流程可以理解为使用大量粒子对目标分布进行拟合的过程,每个粒子即代表了对系统状态的一个估计,粒子滤波算法大体分为如下几个步骤:

  1. 预测:将系统的输入(比如里程计信息)通过系统模型对下一时刻的状态进行预测。
  2. 权重更新:得到观测值(比如激光雷达信息)后对粒子的权重进行更新,也即对模型进行更新。
  3. 重采样:移除权重过低的粒子并进行重新采样以取代这些粒子,这在粒子数量有限的情况下非常必要。
  4. 获取当前的最佳观测状态:比如对机器人在地图中的位姿进行估计。
  5. 重复上述步骤。

    在特征比较少的位置,比如走廊,粒子的分布会趋于发散,而在特征比较多的位置,粒子又会重新收敛。

在实际应用中可以看到,粒子群在经过若干轮迭代后将会收敛到机器人的实际位姿附近。

粒子重采样

何时进行粒子重采样是一个困扰了人们很久的问题,因为如果过于频繁地进行重采样有可能导致粒子匮乏的问题,也就是粒子几乎全部集中在一个位置,失去了多样性;而不进行重采样可能导致在迭代过程中出现大量权值极低的无效粒子,对位置估计不起作用的同时还会浪费对其进行迭代的算力。因此在合适的时机进行重采样非常重要。

现在人们一般使用如下公式来评估粒子的退化程度:

其中 w˜ (i)指的是某个粒子归一化后的权重,这个公式的主要思想是:如果粒子的分布比较接近目标分布的话,这些粒子的权重应该会比较相近,对应的Neff较大;而如果粒子的分布和目标分布相差较大的话,粒子的权重相差会比较大,对应的Neff较小。通过该公式,我们可以在粒子退化程度达到一定阈值时再进行重采样。

KLD

在粒子滤波中,粒子数的选取也是非常重要的问题,粒子数过少会影响定位的效果,过多又会对硬件造成较大的计算负担,AMCL使用了KLD方法来实时调整粒子的数量,通过KLD来判断当前的粒子数量能否准确反映目标分布。KLD的全称是Kullback–Leibler divergence,又叫相对熵,可以用于度量两个分布之间的差异程度,定义如下:

根据粒子覆盖的范围和采样出的概率,经过一通计算,可以得到两个分布之间的似然比(具体可以参考附录中的论文链接)

然后有另外一群老哥说这个东西可以近似于一个卡方分布(J.A. Rice. Mathematical Statistics and Data Analysis. Duxbury Press, second edition, 1995.):

于是我们可以利用卡方分布的性质计算出当n取某个值时两个分布之间差异小于某值的概率,由此可以反过来计算出需要的n:

计算出来的n可以保证采样出的分布和实际的分布之间的相对熵小于ε的概率为1-δ。然后又有一群老哥给出了这个公式的近似(N. Johnson, S. Kotz, and N. Balakrishnan. Continuous univariate distributions, volume 1. John Wiley & Sons, New York, 1994.):

以下是论文中给出的伪代码,核心是13行的用于计算所需粒子数量的公式。

从论文给出的例子可以看出随着时间增加粒子数量会减少到一个较少的水平。

参考文章

Improving Grid-based SLAM with Rao-Blackwellized Particle Filters by Adaptive Proposals and Selective Resampling

Adapting the Sample Size in Particle Filters Through KLD-Sampling

最后修改:2023 年 07 月 18 日
V我五十