matlab非锐化掩蔽和高提升滤波_概率机器人——粒子滤波

794deaabe5707e331df3233df35a5efb.png

我们上次已经学习了卡尔曼滤波,卡尔曼滤波在通讯、导航、控制等领域得到了广泛的应用,也取得了感人的效果。但也不得不说,卡尔曼滤波的线性高斯假设性太强,实际系统中并不能直接使用。即使是利用线性化手段,也要求原系统线性程度较好,否则效果也会较差。同时,我们知道高斯函数为单峰函数,这也为其带来了局限性。例如在定位问题中,卡尔曼滤波便仅适用于位置追踪(position tracking),从其高斯分布的递推估计过程也可以看出。而针对全局定位(global localization)和机器人绑架问题(kidnapped robot problem),卡尔曼便不易解决。

因此,现在我们来学习一种十分流行的非参数滤波——粒子滤波(particle filter)。

先来举个例子吧(网上都被举烂了,我就大概搬过来)

粒子滤波最典型的应用便是定位问题。现在我们假设我们有100只狗去追小偷,狗被放出去后便沿小偷逃跑方向追击,狗通过气味来判断是否为小偷,每隔一段时间便把当时位置的气味与小偷气味做对比,得出所在位置为小偷的概率大小。每只狗所在位置不同,其气味便不同,追击到小偷的概率便不同。我们根据这一概率大小,将概率小的地方的狗赶到概率大的地方,然后继续追击。如此反复,使得狗逐渐聚集,得到小偷位置。这里的每只狗便是一个粒子。

粒子滤波的思路大概如此,详细说明如下:

与之前的高斯滤波不同,非参数滤波中并不给出具体的后验函数,而是以有限数量的值来近似。具体来说,粒子滤波中用一系列后验状态中的采样值来表示后验。这里的每个采样值即称为粒子,也就是某一时刻状态的一种可能假设。

其中

就表示
时刻状态的一种可能假设。

例如下图所示,小竖线即表示粒子,越密集也就是粒子越多的地方表示概率越大。

a49575fd9dfbd84d7aceec12766c4c21.png

这里的

只要不是太小(比如
)就可以较好得近似后验分布。

我们将这种表示方法带入到贝叶斯滤波框架中,便得到粒子滤波。

911fe2943728f97071029e639567f721.png

我们逐行来看:

1:算法的输入为

时刻的粒子也就是
时刻的状态,
时刻的控制与观测

2:定义两个空的粒子集

3:粒子集中数目都为

,针对
时刻的
个粒子逐一处理

4:状态转移,对

时刻的某一可能状态施加控制作用,得到该粒子经过
控制后的状态分布
,并从中采样获得一个新的粒子。所有粒子这样处理后得到的粒子集便是先验
的粒子表示。

5:为每一个粒子计算一个权重,称为重要性因子,该权重的计算是基于观测模型,也就是反应了粒子的可信程度。

6:粒子的状态及其对应的重要性因子组成完整的粒子集

7:循环结束

以下是粒子滤波的核心内容:重采样/重要性采样

8:处理新得到的粒子集

,将先验粒子集转换为后验粒子集

9:从粒子集

中采样M次以生成新的粒子集,因为每个粒子的可信度并不相同,所以并不能等概率采样,抽取到每个粒子的概率便由重要性因子决定。因此重要性因子高,也就是可信度高的例子被采样到的次数相对较多。因此采样结束后,粒子向可信度高的状态处聚集。所得到的便是后验粒子集。

10:采样到的粒子添加到新的粒子集

11:循环结束

12:得到后验分布的抽样表示

针对重要性采样进行进一步讲解:

这其实就是一个由

推出
的过程,
为一个已知分布的抽样,
为一个未知分布的抽样。
因此核心问题便是如何利用一个已知分布来对一个未知分布进行抽样。

假设

为未知分布函数,称其为
目标分布
为已知分布函数,称其为
提议分布。

如果我们能找到两个间的关系,便可由提议分布得到目标分布。例如:

这里的

为加权因子,表征了
间的不匹配程度。当然也需要保证

来看一组图会更清楚:

我们在提议分布

中依概率采样,结果为下方竖线,可以看出其密集程度与概率分布相关

d5d815028db083fa22cd1d65a37b1a66.png

对每一个提议分布的采样值乘上加权因子,加权因子由目标分布与提议分布的关系获得,也就是两者间的不匹配程度。竖线的高度便表示了权重的大小

862312b65adccd869c54895493b1f751.png

再依照权重因子进行重采样,所得结果便是目标分布的采样。

633dc9f56e21a6a623c6a8939c6dfddb.png

上图为理想结果,实际重采样效果应该会比这个差一些。但应该不影响理解。粒子滤波其实要求提议分布与目标分布相差较小,像上图中差距巨大的话重采样效果也不佳。

例如下图中蓝色为激光传感器的观测模型,绿色为运动模型,里程计的不确定度相比于激光传感器要明显大一些。我们从目标分布中采样得到先验的粒子分布,再结合观测模型计算粒子权重。那便产生一个问题,只有靠近观测模型的均值处的例子的权重较大,而较远处的粒子的权重可能很小,又由于运动模型的方差很大,结果表示高权重的粒子数或许很少,大多数粒子的权重很低。在这样的情况下重采样将使精度降低,低权重粒子的意义又不大,浪费了大量计算。

因此为了使得粒子滤波能够继续较为可靠的进行,我们需要较多的粒子数,使得大权重粒子较多,同时每一步运动后都要进行重采样剔除掉低权重粒子。经典的基于粒子滤波的SLAM算法FastSLAM大致就是这种方案。另外,在进一步改进版的基于粒子滤波SLAM算法GMapping中,在运动模型中采样后得到粒子后,在每个粒子周围再选取粒子,通过扫描匹配的方法,选取其中更优的一个粒子。从下图来看,就是使得运动模型的例子向观测模型的均值靠近。为了解决这类问题,不同的SLAM算法也有其不同的应对策略,以后有机会可以把不同的基于激光的SLAM算法详细讲解一遍。

a11e4b8a149130e9ebae353d703fe3f6.png

现在,问题的关键变成了获得目标分布与提议分布间关系,即不匹配程度的表达。

粒子滤波中,目标分布就是状态的后验分布,提议分布就是状态的先验分布,而两者的关系正是观测模型!

这样通过观测模型,我们便把先验与后验联系起来,获得了后验的抽样表示。

其实在粒子滤波中,我们也完全也可以选择不进行重采样,而是为每一个粒子维护一个权重,这样我们用粒子和其权重表示了状态的后验分布。但这样的问题是低权重粒子可能很多,使得计算效率精度等不理想。因此,我们使用重采样来增加大权重粒子的数量,来用粒子和其数量表示后验分布。

两种较为常用的重采样算法:轮盘赌、低方差采样

轮盘赌采样:(书上没有,我简单试着写一下,简单在word里敲得,好丑……)

943e33ccb01d01c8c67646e488f77a99.png

算法其实很简单,不详细解释了,就像它的名字一样,就是那种下面这种转盘赌博的方式。每个粒子对应的权重大小就是图中各奖项对应的面积大小。每次采样就是转动一次转盘。

af15209603ef3f9ffc75dba65e7974ff.png
来源于百度图片

但这种采样方式有一些缺点,我们举个例子来看。假设机器人静止,且没有观测输入,也就是机器人不知道有关其位置的任何信息,也就是其位置在下图空间中属于均匀分布,我们以下图中均匀抽样的粒子表示。

6a01256d3444bf5461b9a1358b088f61.png

如果在此基础上采用轮盘赌采样进行粒子滤波,理想结果应该为粒子保持不动。因为机器人没有移动,且没有观测,每个粒子的权重也相等。但实际情况并非如此,采样后结果如下图所示。

8964faeffc8bbadda177a2da431cf3c8.png

重采样使得粒子的多样性降低。这将加大采样误差。

因此在实际使用中要制定合理策略,控制采样条件,例如状态静止时停止采样等。总结来说,当权重偏向大数量样本时,可以降低采样频率,以减小状态多样性的丢失。当权重偏向小数量样本时,应该进行重采样。

还有另外一种应对策略就是低方差采样

3ec881ff282a3621bec15db906e47ba7.png

可以看出,低方差采样只在第三行进行了一次随机抽取,随后便等间隔(

)的抽取样本。类似于下图所示。就好像发扑克牌的过程,刚开始切牌那一下决定了你可以拿到什么牌,后面只是按照固定顺序抽取而已。

6c41484f722a1667534ea0fd6b33d3da.png

低方差采样以一个更有序的形式覆盖了整个样本空间。这样便可避免上述极端例子中出现的缺陷。

粒子滤波的基本思想大体如此,但在实际使用中可能会有些许修改,特别是在重采样策略方面。


参考文献:

Thrun S. Probabilistic robotics[M]. MIT Press, 2006.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值