前言:最近在学习无人驾驶路径规划和ROS的一些基础理论,过程中遇到了一些问题,写这个系列记录一下个人的学习过程。
遇到这个问题的初衷是看了
小巨同学
一篇帖子
文中提到了向move_base中添加全局路径规划插件RRT的过程,刚好在学习过程中对插件及插件编写的原则这一部分不是很理解,所以跟着原帖复现了一遍并在此做一下记录,如有问题或错误的地方也欢迎指出和讨论。
一、move_base节点及插件
move_base是Navigation功能包中的核心节点,它在导航的任务中处于支配地位,其他的一些package都是它的
插件
:
图片来源:《重德智能机器人操作系统入门》
这里就以小巨同学文章中的自定义RRT算法作为例子来进行插件的编写及添加说明。由于RRT算法属于全局路径规划部分,所以插件类型是
Base Global Planner
。
插件的概念并不是我们抽象的描述,而是在ROS里catkin编译系统能够认出的,并且与其他节点能够耦合的C++库。插件是可以动态加载的类,也就是说插件不需要提前链接到ROS的程序上,只需在运行时加载插件就可以调用其中的功能。
关于插件具体的介绍,可以参考roswiki中的具体介绍
http://wiki.ros.org/pluginlib
。
二、Plugin插件添加
先在工作空间中下载
自定义RRT算法源码:
https://github.com/li-huanhuan/rrt_star_global_planner
git clone https://github.com/li-huanhuan/rrt_star_global_planner
下载完成并catkin_make编译后有如下几个文件:
其中src文件夹中包含了RRT算法的源码,在这由于主要介绍插件的添加过程故不对源码进行解释。
1、插件注册
在src/rrt_star_ros.cpp文件中添加插件注册指令:
PLUGINLIB_EXPORT_CLASS(RRTstar_planner::RRTstarPlannerROS, nav_core::BaseGlobalPlanner)
含义:使RRTstar_planner::RRTstarPlannerROS类注册为move_base包中nav_core::BaseGlobalPlanner类的插件
2、编译
在CMakeLists.txt中添加库文件:
add_library(${PROJECT_NAME} src/rrt_star_ros.cpp)
3、插件描述文件
插件描述文件是一个XML文件,用于以机器可读格式存储有关插件的所有重要信息。它包含有关插件库的信息,插件的名称,插件的类型等。需要创建一个新文件并将其保存在包中的某个位置(如rrt_ star_global_planner包),并给它一个名称,如本例中的rrt_star_planner_plugin.xml
文件内容如下:
<library path="lib/librrt_star_global_planner">
<class name="RRTstar_planner/RRTstarPlannerROS" type="RRTstar_planner::RRTstarPlannerROS" base_class_type="nav_core::BaseGlobalPlanner">
<description>This is RRT Star Global Planner Plugin by Rafael Barreto.</description>
</class>
</library>
第一行 <library path=”lib/librrt_star_global_planner”>指定插件库的路径。路径是lib/librrt_star_global_planner,其中lib是目录中的文件夹 ~/catkin_ws/devel/
第2-3行指定了实现插件的类的名称,例子中是RRTstar_planner::RRTstarPlannerROS,而base_class_type指定了实现插件的基类的名称,例子中是nav_core::BaseGlobalPlanner
第4行<description> 标记提供关于插件的简要说明。
4、注册插件到ROS包系统
在package.xml中指向插件描述文件:
<export>
<nav_core plugin="${prefix}/rrt_star_planner_plugin.xml"/>
</export>
其中在${PREFIX}中确定文件完整的路径
此外package.xml文件还需添加nav_core包的依赖性
...
<build_depend>pluginlib</build_depend>
...
<build_export_depend>pluginlib</build_export_depend>
...
<exec_depend>pluginlib</exec_depend>
...
5、在ROS包系统中,查询可用插件
catkin_make编译后可以通过rospack查询ROS包系统,以查看任何给定的包可用的插件:
rospack plugins --attrib=plugin nav_core
如果插件添加成功,会在终端显示如下结果:
6、在launch文件中的movebase添加新的规划器添加为全局规划器的参数
我这里以《ROS机器人开发实践》中的例程为例进行插件的添加,在mrobot_navigation功能包下的launch文件中找到运行move_base节点的文件,并将注册好的插件添加进来:
…
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<param name="base_global_planner" value="RRTstar_planner/RRTstarPlannerROS" />
…
三、测试插件功能
在终端中运行导航功能包:
roslaunch mrobot_navigation fake_nav_demo.launch
在rviz中找到Global Plan,并选择话题:/move_base/RRTstarPlannerROS/plan
这样就将全局路径规划选中了我们自己添加的RRT算法,最终效果如下:
写在最后
ros中的插件功能方便我们添加自己写的算法,学会插件文件的编写及添加过程对后续在ros平台验证算法很有帮助。
此外由于是第一次写博客,可能有出错或者疏忽地方,还请各位海涵。
PS:我学习ROS主要是参考古月老师的教材:《ROS机器人开发实践》(若有需要PDF书籍的可以在评论区留下邮箱),在这特别感谢
周_云川
同学提供的电子教材。