本篇的主旨是对gmapping的源码结构进行说明!
参考资料来源:
http://blog.csdn.net/David_Han008/article/details/71524141?locationNum=16&fps=1
http://blog.csdn.net/roadseek_zw/article/details/53316177
http://blog.csdn.net/David_Han008/article/details/71524141
一、关于gmapping的源码说明
gmapping来源于开源项目openslam
ROS中有两种,一个是openslam_gmapping:是创始者Grisetti开发的对外开放的gmapping,有函数与接口可以提供调用;
另外一个是slam_gmapping,是ROS开发者使用openslam_gmapping中的函数完成的多种功能(读数(scan,odom),处理数据(粒子滤波、scanmatch等),发布数据(map,tf等))的包。
他们两者的关系好比openCV库 与 使用openCV中的函数与接口做的工程。换句话说,slam_gmapping是openslam_gmapping在ros下的二次封装,真正核心的代码都在后者里面。
二、针对openslam_gmapping源码的分析
这里面比较重要的函数就是 gridslamprocessor中的processScan()函数了
这个函数依次执行了以下步骤:
1.运动模型:
更新t时刻粒子群(在模型中加入高斯噪声)drawfrommotion()
计算t-1时刻到t时刻的位移增量,以及角位移增量
2.扫描匹配:
接下来一个if判断,包含了大部分程序:
通过匹配选取最优粒子,如果匹配失败,返回一个默认的似然估计scanMatch()
权重更重采样前更新一次,重采样后又更新一次updateTreeWeights()
重采样,粒子集对目标分布的近似越差则权重方差越大...resample()
地图更新,先得到最优的粒子(用权重和weightSum判断)
...未完待续