收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
pluginlib利用了C++多态的特性,不同的插件只要使用统一的接口,便可以替换使用。这样用户通过调用在插件中实现的统一的接口函数,不需要更改程序,也不需要重新编译,更换插件即可实现功能修正。
利用pluginlib编写插件的方法大致包括如下四步:
- 创建插件基类,定义统一接口(如果为现有接口编写插件,则跳过该步)
- 编写插件类,继承插件基类,实现统一接口
- 导出插件,并编译为动态库
- 将插件加入ROS系统,使其可识别和管理
2.1 创建插件基类
首先,创建工作空间,创建后如下所示
其次,开始编写插件基类,基类所在头文件polygon_base.h放在include/my_plugin_test下即可,
#ifndef POLYGON\_BASE\_H\_
#define POLYGON\_BASE\_H\_
namespace polygon\_base
{
class Polygon{
public:
Polygon() {};
virtual ~Polygon() {};
virtual void init(float side\_len) = 0;
virtual float area() = 0;
};
};
#endif
2.2 创建插件类
所插件类的头文件polygon_plugin.h在放在include/my_plugin_test目录下。
#ifndef POLYGON\_PLUGIN\_H\_
#define POLYGON\_PLUGIN\_H\_
#include <cmath>
#include <my\_plugin\_test/polygon\_base.h>
namespace polygon\_plugin{
class Square: public polygon\_base::Polygon{
public:
Square() {};
virtual ~Square() {};
virtual void init(float side\_len)
{
this->side\_len = side\_len;
}
virtual float area()
{
return (side\_len \* side\_len);
}
private:
float side\_len;
};
class Triangle: public polygon\_base::Polygon{
public:
Triangle() {};
virtual ~Triangle() {};
virtual void init(float side\_len)
{
this->side\_len = side\_len;
}
virtual float area()
{
return 0.5 \* (side\_len \* ( sqrt( (side\_len \* side\_len) - (0.5 \* side\_len)\*(0.5 \* side\_len) ) ) );
}
private:
float side\_len;
};
};
#endif
3 导出插件,并编译为动态链接库
3.1导出插件
利用 pluginlib 库提供的宏操作注册插件,并且编译为动态链接库。
在src目录下添加polygon_plugin.cpp,
#include <pluginlib/class\_list\_macros.h>
#include <my\_plugin\_test/polygon\_base.h>
#include <my\_plugin\_test/polygon\_plugin.h>
//mark Square and Triangle as the exported class
PLUGINLIB\_EXPORT\_CLASS(polygon\_plugin::Triangle, polygon\_base::Polygon)
PLUGINLIB\_EXPORT\_CLASS(polygon\_plugin::Square, polygon\_base::Polygon)
如果要实现class可动态加载,必须要将其标记为可导出的class。通过特定的宏PLUGINLIB_EXPORT_CLASS可以完成导出,该宏通常放置于cpp文件的底部。这个宏第一个参数是插件类全名(含namespace),第二个参数是插件基类全名(含namespace)。
3.2 编译为动态链接库
要将插件编译为动态链接库,需要相应修改CMakeLists.txt文件,添加如下几行:
include\_directories(
include
${catkin\_INCLUDE\_DIRS}
)
## Declare a C++ library
add\_library(polygon\_plugin
src/${PROJECT\_NAME}/polygon\_plugin.cpp
)
4 将插件加入ROS系统,使其可识别和管理
4.1 创建插件描述文件
插件描述文件是一个XML格式的文件,用于存储插件的重要信息(如,插件库路径,插件名称,插件类类型,插件基类类型)。
我们在my_plugin_test目录下,创建名为polygon_plugin.xml的文件,
<library path="lib/libpolygon\_plugin">
<class type="polygon\_plugin::Triangle" base\_class\_type="polygon\_base::Polygon">
<description>This is a triangle plugin.</description>
</class>
<class type="polygon\_plugin::Square" base\_class\_type="polygon\_base::Polygon">
<description>This is a square plugin.</description>
</class>
</library>
这里标签library和其属性path一起定义了主package相对于插件库的路径,一个插件库可以包含多个不同的插件类(如这里是2个插件类)。
这里的标签class用以描述插件库中的插件类,属性type指定插件类的类型(必须全名),属性base_class_type指定插件基类的类型(必须全名),属性description描述插件类的功能。
注意:插件描述文件还有一个标签class_libraries这里没有使用,其可以实现在一个插件描述文件包含多个库,该标签无属性。
4.2 注册插件到ROS系统
为确保pluginlib可以查到ROS系统所有插件,定义插件的package必须显式的指定哪个包导出了什么插件。
这通常在package.xml文件中定义,
<export>
<my\_plugin\_test plugin="${prefix}/polygon\_plugin.xml">
</export>
这里标签my_plugin_test是定义插件基类的package名称,属性plugin是前面定义的插件描述符文件。
**注意:**如果插件类与基类不在同一package,为了使插件的export生效,还必须添加对插件基类所在package的依赖。
`<build\_depend>my_plugin_test</build\_depend>
<run\_depend>my_plugin_test</run\_depend>`
5 check插件是否在ROS下可以查看
在catkin_make执行成功之后,source develop/setup.bash,然后运行如下命令如果能正确看到输出polygon_plugin.xml则ok。
rospack plugins --attrib=plugin my_plugin_test
6 调用插件
6.1 在src目录下创建my_plugin_loader.cpp
#include <ros/ros.h>
#include <pluginlib/class\_loader.h>
#include <my\_plugin\_test/polygon\_base.h>
int main(int argc, char \*\* argv)
{
ros::init(argc, argv, "my\_plugin\_loader");
ros::NodeHandle nh;
float side\_len = 5.0;
std::string param\_name = "polygon\_plugin";
std::string plugin\_class;
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/c99ad424c379ba2db294a3e2f9039d1c.png)
![img](https://img-blog.csdnimg.cn/img_convert/23d725d15b8812d55e32dde041b664c6.png)
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
715902202794)]
[外链图片转存中...(img-ltZ7bmTz-1715902202794)]
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**