ROS SLAM代码框架概述

参考:

  • http://blog.csdn.net/heyijia0327/article/details/45030929
  • http://blog.csdn.net/heyijia0327/article/details/45841317

gmapping

摘自《ROS : 修改ROS源代码(overlaying package)》 http://blog.csdn.net/heyijia0327/article/details/45841317

gmapping算法实现的正宗源代码是来自开源项目openslam,ROS的开发者提供了gmapping包和openslam_gmapping包,他们作用各不相同。

  • openslam_gmapping是gmapping创始者Grisetti开发的对外开放的gmapping库,里面有各种函数和接口供使用者调用。
  • ROS中的gmapping包是ROS开发者调用openslam_gmapping 中的函数而完成gmapping的所有功能(包括读取数据(scan,odom),处理数据(粒子滤波,scan match 等),发布数据(map,tf关系等) ),openslam_gmapping包可以理解为opencv,gmapping包可以理解为用opencv中函数实现的一个机器视觉工程。

因此要修改真正的gmapping算法,应该去修改openslam_gmapping中的东西。当然也许你也只是想改改gmapping包而不去修改SLAM原算法,譬如将gmapping得到的最优粒子的轨迹记录到txt中等。

项目地址

  • openslam_gmapping:https://github.com/rosperception/openslam_gmapping
  • gmapping: https://github.com/ros-perception/slam_gmapping

http://wiki.ros.org/navigation/Tutorials

  1. base_global_planner 和 base_local_planner
    从move_base/cfg/MoveBase.cfg可知,
    base_global_planner 默认使用 navfn/NavfnROS
    base_local_planner 默认使用base_local_planner/TrajectoryPlannerROS
  2. navfn包和global_planner关系

摘自《ROS: global_planner 整体解析》http://blog.csdn.net/heyijia0327/article/details/45030929

可以将navfn包和global_planner包理解成一个并列关系,因为他们两个都是用来做全局规划的,两个包里面也都实现了A*,Dijkstra算法。

navfn的源代码里可以看到这个包默认是使用Dijkstra做全局路径规划,虽然有A*的代码,但有bug.

直到13年David Lu 才完成了这部分工作,重新发布了global_planner包,修改好的代码封装性更强,更清晰明了。因此,也可以认为global_planner是navfn的替代者

为了和以前兼容。因此可以看到源代码中两个包都在,并且move_base的那个全局变量参数默认的是navfn,也就是说没用global_planner。

那么如何使用global_planner包而不是navfn包呢?





可是实际使用的时候(14年1月以前),却提示this planner is not registered,意思是这个包没有注册。幸好有人发现这个是bgp_plugin.xml里的bug,后来安装的ROS版本应该修复了这个问题。如果有这个错误,请按照github上的修复(https://github.com/RainCT/navigation/commit/f4a046db553f4127c50cebba9740ed3676f8cd7f)修改cmakelist.txt和bgp_plugin.xml就可以了。

如何使用自己的路径规划?
参考:http://wiki.ros.org/navigation/Tutorials/Writing%20A%20Global%20Path%20Planner%20As%20Plugin%20in%20ROS
思路是使用ROS的插件机制。在自己写的global或者local planner算法里开头加上一句特定的程序(PLUGINLIB_EXPORT_CLASS(…..))就能注册插件机制,然后在xx_plugin.xml等文件里描述下这个插件,在package.xml显式的表明这个插件用来通知ROS我们将使用它,具体过程见官方wiki(ROS的插件机制)。弄完插件机制以后,我们就可以像上面一样将其用参数的形式直接传过去了。之前的bgp_plugin.xml有bug,因此就出现了那个问题。
3. dwa_planner vs. base_local_planner
参考:http://answers.ros.org/question/10718/dwa_planner-vs-base_local_planner/

你可能感兴趣的:(SLAM杂谈)