pluginlib:是一个c++库, 用来从一个ROS功能包中加载和卸载插件(plugin)。插件是指从运行时库中动态加载的类。通过使用Pluginlib,不必将某个应用程序显式地链接到包含某个类的库,Pluginlib可以随时打开包含类的库,而不需要应用程序事先知道包含类定义的库或者头文件。
目录
使用
1准备
创建功能包,导入依赖:roscpp,pluginlib。
在 VSCode中需要配置 .vascode/c_cpp_properties.json文件中关于 includepath 选项的设置。
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/.../yyy工作空间/功能包/include/**" //配置 head 文件的路径 ,如果使用VScode就这样配置,复制头文件的路径过来就可以
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
2创建基类
基类可以自己编写。也可以继承已经有的基类,已经有的基类就不用再写一个基类了
#ifndef XXX_POLYGON_BASE_H_
#define XXX_POLYGON_BASE_H_
namespace polygon_base
{
class RegularPolygon
{
public:
virtual void initialize(double side_length) = 0;//功能函数设置
virtual double area() = 0;
virtual ~RegularPolygon(){}
protected:
RegularPolygon(){}//必须包含无参构造,plug要求
};
};
#endif
3创建插件类
创建自己插件类头文件
#ifndef XXX_POLYGON_PLUGINS_H_
#define XXX_POLYGON_PLUGINS_H_
#include “xxx/polygon_base.h"
#include <cmath>
namespace polygon_plugins
{
class Triangle : public polygon_base::RegularPolygon //命名空间下的基类
{
public:
Triangle(){}
void initialize(double side_length) //使用父类的函数
{
side_length_ = side_length;
}
double area()
{
return 0.5 * side_length_ * getHeight();
}
double getHeight()
{
return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
}
private:
double side_length_;
};
class Square : public polygon_base::RegularPolygon
{
public:
Square(){}
void initialize(double side_length)
{
side_length_ = side_length;
}
double area()
{
return side_length_ * side_length_;
}
private:
double side_length_;
};
};
#endif
4注册插件
关联基类和衍生插件
在 src 目录下新建 polygon_plugins.cpp 文件,内容如下:
//pluginlib 宏,可以注册插件类
#include <pluginlib/class_list_macros.h>//包含头文件如果不对,可以”“和<>更换试试
#include <xxx/polygon_base.h>
#include <xxx/polygon_plugins.h>
//参数1:衍生类 参数2:基类
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)//plug宏使用
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)//编写几个类就写几个
5构建插件库
配置cmklist
include_directories(include)
add_library(自定义名字 src/polygon_plugins.cpp)
调用 catkin_make 编译,编译完成后,在工作空间/devel/lib目录下,会生成相关的 .so 文件
6使插件可用于ROS工具链
配置xml
功能包下新建文件:polygon_plugins.xml,内容如下:
<!-- 定位动态链接库 -->
<library path="lib/libpolygon_plugins">//自己再lib下申辰的文件
<!-- type="插件类" base_class_type="基类" -->//名字是自己前面取得类名
<class type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
<!-- 描述信息 -->
<description>This is a triangle plugin.</description>
</class>
<class type="polygon_plugins::Square" base_class_type="polygon_base::RegularPolygon">
<description>This is a square plugin.</description>
</class>
</library>
导出插件
package.xml文件中设置内容如下:
<export>
<xxx plugin="${prefix}/polygon_plugins.xml" />
</export>
标签<xxx />的名称应与基类所属的功能包名称一致,plugin属性值为上一步中创建的xml文件。
编译后,可以调用rospack plugins --attrib=plugin xxx
命令查看配置是否正常,如无异常,会返回 .xml 文件的完整路径,这意味着插件已经正确的集成到了ROS工具链。