ROS进阶功能—plugin插件机制
在ROS开发中,常常会接触到一个名词——plugin(插件)。这个名词在计算机软件开发中也经常提到。简单来说,ROS中的插件就是可以动态加载的扩展功能类。ROS中的pluginlib功能包提供了加载和卸载plugin的C++库,开发者在使用插件时,不需要考虑plugin类的链接位置,只需要将插件注册到pluginlib中,即可直接动态加载。这种插件机制非常方便,开发者不需要改动原软件的代码,直接将需要的功能通过插件进行扩展即可。
一、工作原理
假设ROS功能包中已经存在一个polygon的基类(polygon_interface_package),可以通过插件机制实现两种polygon的功能支持:rectangle_plugin(rectangle_plugin_package)和triangle_plugin(triangle_plugin_package)。在这两个功能包的package.xml 中,需要声明polygon_interface_package中的基类polygon,在编译过程中会把插件注册到ROS中,用户可以直接通过rospack命令进行全局插件查询,也可以在开发中直接使用这些插件。
二、实现一个插件
pluginlib 利用了C++多态的特性,不同的插件只要使用统一的接口就可以替换使用。用户在使用过程中也不需要修改代码或者重新编译,选择需要使用的插件即可扩展相应的功能。一般来讲,要实现一个插件,主要分为以下几个步骤。
1)创建基类,定义统一接口(如果基于现有基类实现插件,则不需要这个步骤)。
2)创建plugin类,继承基类,实现统一的接口。
3)注册插件。
4)编译生成插件的动态链接库。
5)将插件加入ROS中。
三、创建基类
在include目录下,新建头文件polygon_base.h来创建基类。
#ifndef SRC_POLYGON_BASE_H
#define SRC_POLYGON_BASE_H
namespace polygon_base{
class RegularPolygon{
public:
virtual void initialize(double side_length) = 0;
virtual double area() = 0;
virtual ~RegularPolygon(){
}
protected:
RegularPolygon(){
}
};
}
#endif //SRC_POLYGON_BASE_H
其中,插件要求构造函数不可以带参数,所以使用initialize函数实现参数初始化。
四、创建plugin类
继承基类,实现统一接口
#ifndef SRC_POLYGON_PLUGINS_H
#define SRC_POLYGON_PLUGINS_H
#include <learn_plugin/polygon_base.h>
#include <cmath>
namespace polygon_plugins{
class Triangle: public polygon_base::RegularPolygon
{