实现ROS 插件

ros插件介绍
注册使用使用ros创建的工具,我们需要再package.xml中进行插件的注册。
插件是一个能够被动态加载的类
例子:我们为多边形接口功能包提供正方形和三角形插件类,我么需要再package.xml中向ros build system 声明我们为此功能包基类提供插件。这样我们就可以把插件类注册到了ros build systemrospack 查询的时候,可以得到两个插件。

1.注册和导出插件
为了允许动态加载类,必须将其标记为导出类。这是通过特殊宏 PLUGINLIB _ export _ class 完成的。建议写在实现插件类的cpp文件

//后面是基类。前面是插件类
PLUGINLIB_EXPORT_CLASS(costmap_2d::VoronoiLayer, costmap_2d::Layer)
   5 //Declare the Rectangle as a Polygon class
   6 PLUGINLIB_EXPORT_CLASS(rectangle_namespace::Rectangle, polygon_namespace::Polygon)
  1. 插件的描述
    插件描述文件是一个 XML 文件,用于以机器可读的格式存储关于插件的所有重要信息。它包含了插件所在的库(基类)插件名称插件类型等信息。如果我们考虑上面讨论的矩形插件包,那么这个插件描述文件(例如 rectangle _ plugin.xml)看起来应该是这样的:
<library path="lib/librectangle">
  <class type="rectangle_namespace::Rectangle" base_class_type="polygon_namespace::Polygon">
  <description>
  This is a rectangle plugin
  description>
  class>
library>
<class_libraries>
  <library path="lib/libvoronoi_layer">
    <class type="costmap_2d::VoronoiLayer" base_class_type="costmap_2d::Layer">
      <description>A costmap plugin for dynamic Voronoi.description>
    class>
  library>
class_libraries>
  1. 在 ROS 包系统中注册插件
    为了让 pluginlib 在一个系统中查询所有 ROS 包中的所有可用插件,每个包必须明确指定它所导出的插件
    A plugin provider must point to its plugin description file in its package.xml inside the export tag block.
<export>
  <polygon_interface plugin="${prefix}/rectangle_plugin.xml" />
export>
  <export>
    <costmap_2d plugin="${prefix}/costmap_plugins.xml" />
  export>
  1. 查询可用于包的插件
    你可以通过 rospack 查询 ROS 包系统,看看哪些插件可用于任何给定的包。
rospack plugins --attrib=plugin nav_core

这将返回从 nav _ core 包中导出的所有插件。

  1. 使用插件
    pluginlib provides a ClassLoader class available in the class_loader.h header that makes it quick and easy to use provided classes. For detailed documentation of the code-level API for this tool please see pluginlib::ClassLoader documentation. Below, we’ll show a simple example of using the ClassLoader to create an instance of a rectangle in some code that uses a polygon:
    使用插件类加载类去实例化一个插件:
   1 #include <pluginlib/class_loader.h>
   2 #include <polygon_interface/polygon.h>
   3 
   4 //... some code ...
   5 //插件的基类
   6 pluginlib::ClassLoader<polygon_namespace::Polygon> poly_loader("polygon_interface", "polygon_namespace::Polygon");
   7 
   8 try
   9 {//插件实例化
  10   boost::shared_ptr<polygon_namespace::Polygon> poly = poly_loader.createInstance("rectangle_namespace::Rectangle");
  11 
  12   //... use the polygon, boost::shared_ptr will automatically delete memory when it goes out of scope
  13 }
  14 catch(pluginlib::PluginlibException& ex)
  15 {
  16   //handle the class failing to load
  17   ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
  18 }

http://wiki.ros.org/pluginlib

你可能感兴趣的:(ROS,学习,其他)