关于Gmapping的学习2

本篇的主旨是对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判断)

    

...未完待续

原文地址:https://www.cnblogs.com/cwyblogs/p/8213607.html