ROS-----pluginlib使用总结_all processes on machine have died, roslaunch will(1)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pluginlib利用了C++多态的特性,不同的插件只要使用统一的接口,便可以替换使用。这样用户通过调用在插件中实现的统一的接口函数,不需要更改程序,也不需要重新编译,更换插件即可实现功能修正。

利用pluginlib编写插件的方法大致包括如下四步:

  1. 创建插件基类,定义统一接口(如果为现有接口编写插件,则跳过该步)
  2. 编写插件类,继承插件基类,实现统一接口
  3. 导出插件,并编译为动态库
  4. 将插件加入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行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值