ROS(七)插件
文档维护:Arvin
网页部署:Arvin
▶
写在前面:pluginlib是一个c++库, 用来从一个ROS功能包中加载和卸载插件(plugin)。插件是指从运行时库中动态加载的类。通过使用Pluginlib,不必将某个应用程序显式地链接到包含某个类的库,Pluginlib可以随时打开包含类的库,而不需要应用程序事先知道包含类定义的库或者头文件。
例如:目前我们想在ROS中实现自己的路径规划算法,就需要以plugin
的方式。
下面本文将逐步介绍如何实现A*算法作为ROS中的全局路径规划。
编写the Path Planner Class
这里我们采用A*
算法,其伪代码如下:
1 | * 初始化open_set和close_set; |
编写头文件和源文件
进入你的工作空间:
1 | cd catkin_ws/src |
创建一个功能包:
1 | catkin_create_pkg astar_planner nav_core roscpp rospy std_msgs |
然后在次功能包的src目录中创建两个文件:astar_planner.h
和astar_planner.cpp
编写头文件astar_planner.h
1 |
|
<costmap 2d/costmap 2d ross .h>
和<costmap 2d/costmap 2d.h>
来使用将被路径规划器用作输入映射的costmap 2d::Costmap2D
类。当定义为插件时,路径规划器类将自动访问该地图。不需要订阅costmap2d
来从ROS获取成本映射。<nav core/base global planner.h>
用于导入接口nav core::BaseGlobalPlanner
,插件必须遵守该接口。
为类定义名称空间是一个很好的实践,尽管不是必需的。这里,我们将命名空间定义为GlobalPlanner
类的全局规划器。名称空间用于定义对类的完整引用,如global planner::GlobalPlanner
。然后定义类GlobalPlanner
并从接口nav core:: basegglobalplanner
继承。在nav core:: basegglobalplanner
中定义的所有方法必须被新类GlobalPlanner
覆盖。
构造函数GlobalPlanner(std::string name, costmap 2d::Costmap2DROS* costmap ros)
用于初始化成本映射,这是将用于规划的映射(costmap ros)
,以及计划器的名称(name)
。默认构造函数GlobalPlanner()
也是如此,它用默认值初始化规划器属性。方法initialize(std::string name, costmap 2d::Costmap2DROS* costmap ros)
是BaseGlobalPlanner
的一个初始化函数,它初始化成本映射,即将用于规划的映射(costmap ros)
,以及计划器的名称(name . string)
。
编写源文件astar_planner.cpp
参考链接:https://github.com/hubery05/Astar_Path_Planner
编译
在Cmakelist
中添加:
1 | add_library(astar_planner_lib src/astar_planner.cpp) |
然后在工作空间catkin_make
,这将会在目录~/catkin_ws/devel/lib
中创建.so
文件。
编写Plugin
Plugin Registration
在astar_planner.cpp
中添加以下代码,为了允许动态加载类,必须将其标记为导出类。
1 | PLUGINLIB_EXPORT_CLASS(astar_planner::AstarPlanner, nav_core::BaseGlobalPlanner) |
Plugin Description File
在功能包目录中添加描述文件
1 | <library path="lib/libastar_planner_lib"> |
<library path="lib/libastar_planner_lib">
–指定生成插件的库目录,默认在~/catkin_ws/devel/lib
指定name="astar_planner/AstarPlanner"
用于nav_core
调用,一般格式为namespace + class_name
Registering Plugin with ROS Package System
在功能包的package.xml
中添加:
1 | <export> |
查看ROS路径规划可用插件
1 | rospack plugins --attrib=plugin nav_core |
调用插件
修改move_base_params.yaml
中base_global_planner
的name
。
1 | base_global_planner: "astar_planner/AstarPlanner" |
然后启动导航包即可。
DWA_local_planner
1 | catkin_create_pkg dwa_local_planner angles base_local_planner cmake_modules costmap_2d dynamic_reconfigure nav_core nav_msgs pluginlib sensor_msgs roscpp tf2 tf2_geometry_msgs tf2_ros |
参考链接: