- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Machine Perception and Interaction Group (MPIG)
gwt@
基于二维激光的机器人室内构图
宫婉婷
MPIG Open Seminar 0095
内容概要
粒子滤波
粒子滤波算法源于Monte carlo思想,即以某事件出现的频率来指代该事件的概率。因此在滤波过程中,需要用到概率如P(x)的地方,一概对变量x采样,以大量采样及其相应的权值来近似表示P(x)。而Karman则只能处理线性高斯分布的概率问题
论文理论研究
机器人图模型
通过RBPF滤波器构图
SIR滤波流程
弊端:
在新观测到临时,每次评估抓取粒子的权重。当随时间增长轨迹长度增加时,这些流程的精确性将会失效。
引入:
Doucet et al.使用递归的方程计算权重,限制提议分布满足给定假设:
许多存在的粒子滤波严格依赖与公式(6),然而通用的算法指定用于计算地图的具体框架,并不确定提议分布怎样计算与何时执行重采样。,Gmapping算法描述了怎样计算精确的提议分布,且进行适应性的重采样。
算法介绍:
GMapping是一种改进的Rao-Blackwellized粒子滤波法,采样的每个粒子都包含环境地图信息。关键问题是怎样降低粒子数。在ROS中是一个第三方包,包含openSLAM的Gmapping的一个ROS封装。Gmapping的ROS节点slam_gmapping提供基于激光的SLAM,依靠移动机器人的激光和位姿数据,使用slam_gmapping创建2D网格地图。
贡献:
1.采用adaptive techniques降低RBPF的粒子数,执行选择性重采样,限制粒子耗尽问题。
2.提出方法计算精确的建议式分布,同时考虑机器人运动和最近观测信息
GMapping算法
精确的提议分布
提议分布π:一种对于目标分布的近似模拟
目标分布:理想的粒子分布形态
作用:作用是预测阶段从提议分布π抽样获取下一批粒子,同时用来计算权重,用来理论上代替目标分布。
直观上,提议分布越近似目标分布,滤波器性能越好,理想情况下不需要重采样步骤,(目标分布与提议分布差距太大的情况会引入重采样)在SLAM中闭合后验是不能得到的。
模拟提议分布的多种方法
里程运动模型,权重由观测模型计算
优点:运动模型易于计算,可以根据观测模型计算权重,
缺点:当传感器信息精度远高于基于里程计的机器人运动估测的情况下是次优的。
由于仅有一部分样本覆盖了观测模型下具有高可能性的状态空间,所以每次独立采样的权重差异很大,需要相当多的样本来充分覆盖具有高观测概率的区域。
图1示出了其中传感器观察似然的有意义的区域显著小于运动模型的有意义的区域的情况。所以需要大量粒子来充分覆盖具有高观察可能性的区域
有效计算改进的提议分布
这样,获得一个最优分布的近似闭合形式,使用这个分布可以计算权重:
Adaptive Resampling
GMapping采用Neff决定是否执行采样步骤,每当采样粒子数下降到N / 2的阈值以下时,进行重新采样,其中N是粒子数。 大量实验表明,这种方法大大降低了好粒子被替换的风险,因而降低重采样操作次数,仅在需要时进行。
算法流程
代码分析
运动模型
更新t时刻的粒子群(模型中添加了高斯噪声)
OrientedPoint MotionModel::drawFromMotion(const OrientedPoint& p, const OrientedPoint& pnew, const OrientedPoint& pold) const{
double sxy=0.3*srr;
OrientedPoint delta=absoluteDifference(pnew, pold);
OrientedPoint noisypoint(delta);
noisypoint.x+=sampleGaussian(srr*fabs(delta.x)+str*fabs(delta.theta)+sxy*fabs(delta.y));
noisypoint.y+=sampleGaussian(srr*fabs(delta.y)+str*fabs(delta.theta)+sxy*fabs(delta.x));
noisypoint.theta+=sampleGaussian(stt*fabs(delta.theta)+srt*sqrt(delta.x*delta.x+delta.y*delta.y));
noisypoint.theta=fmod(noisypoint.theta, 2*M_PI);
if (noisypoint.theta>M_PI)
noisypoint.t
文档评论(0)