实现一个简单的Plugin
1.准备
1)安装pluginlib_tutorials包:

2)创建一个包



2.创建基类
创建一个基类,所有的插件都将从基类继承,如RegularPolygon基类
创建一个基类头文件


其内容如下

在这里创建了一个抽象类名为RegularPolygon。
需要注意的是这个初始化方法,在使用pluginlib,类需要一个没有参数的构造函数,所以如果需要任何参数,则使用initialize方法来初始化对象。
3.创建插件
这里创建了两个插件,一个是Triangle,另一个是Square
在文件夹/home/gary/catkin_ws/src/pluginlib_tutorials_/include/pluginlib_tutorials_下创建一个文件polygon_plugins.h
在里面加入如下内容
4.注册插件
下面将开始做pluginlib特定的工作,因为我们声明了Triangle类和Square类作为插件
在src文件下新建文件polygon_plugins.cpp
其内容如下:

头文件 #include <pluginlib/class_list_macros.h>,这个包含pluginlib宏定义,允许注册类作为插件
对于PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)
以上是注册Triangle类作为插件;PLUGINLIB_EXPORT_CLASS宏参数:
1)完全限定类型的插件类,polygon_plugins::Triangle
2)完全限定类型的基类,polygon_base::RegularPolygon
5.构建插件库
在CMakeLists.txt文件添加如下内容:
include_directories(include)
add_library(polygon_plugins src/polygon_plugins.cpp)
现在可以到catkin_ws下面进行编译,catkin_make
生成了库文件

6.使插件可用于ROS工具链
1)上面的步骤使得我们的插件库被加载,就可以创建插件实例。
2)但插件加载器仍然需要一种方式来找到该库,并知道在该库中引用。
3)为此,我们还将创建一个XML文件,以及在包清单中的特殊导出行,将所有有关插件的必要信息提供给ROS工具链。
在包目录下新建一个XML文件polygon_plugins.xml

<library path="lib/libpolygon_plugins">,该library标签给出库的相对路径,其包含我们希望导出插件库。
<class type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
<description>This is a triangle plugin.</description>
</class>
class标签声明我们希望从我们的库导出的插件。
参数含义:
1)type,完全限定类型的插件,polygon_plugins::Triangle
2)base_class,完全限定基类类型的插件, polygon_base::RegularPolygon
3)description,插件的描述它做什么的
4)name,(在上面的例子中不使用):这指的是插件的名称
- 我们输出为plugin_namespace/PluginName。
- 因为我们使用包名称作为我们的regular_triangle插件的命名空间
- 这导致我们使用pluginlib_tutorials_/regular_triangle。
- 之后的API改变,这个属性不再是必需的。
7.导出插件
要导出我们创建的插件,我们必须以下行添加到我们的任何的manifest.xml(rosbuild包)或package.xml(catkin包):

在上面的标签,上面为 pluginlib_tutorials_,应该更改为base_class所在的包,示例里基类和继承类都在同一包,但很多情况下是分别独立不同包里。
plugin 属性应该指向上面创建的XML文件。
验证是否生效:

您应该看到输出给出polygon_plugins.xml文件的完整路径。
这意味着ROS工具链已经正确设置,可以使用您的插件。
8.使用插件
上面已经成功地创建并导出了插件,下面去使用。
在src目录下创建polygon_loader.cpp,其内容如下

- 创建ClassLoader,加载插件。有两个参数:
- 第一个是包含基类的包名,如pluginlib_tutorials_,
- 第二个是基类,如polygon_base::RegularPolygon
- 实际加载pluginlib_tutorials_/regulare_triangle插件,插件构造器不带参数,可以调用initialize增加参数。
9.运行插件
在CMakeLists.txt文件添加如下

编译catkin_make,
运行之

实现一个简单的Plugin的更多相关文章
- 简单webpack plugin 开发
重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...
- 用Eclipse 创建一个 简单的 Maven JavaWeb 项目
使用Maven 创建一个简单的 javaWeb 项目: 本篇属于 创建 JavaWeb 项目的第三篇: 建议阅读本篇之前 阅读 用 Eclipse 创建一个简单的web项目 ;本篇是这这篇文章的基础 ...
- spring boot一个简单用户管理DEMO
概述 该Demo旨在部署一个简单spring boot工程,包含数据编辑和查看功能 POM配置 <?xml version="1.0" encoding="UTF- ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- spring cloud 创建一个简单Eureka Server
在Spring Cloud实现一个Eureka Server是一件非常简单的事情.下面我们来写一个Eureka Server DEMO. 编码 父项目pom.xml <?xml version= ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...
- Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块
文章目录 1. 实战的开端 – Maven搭建 2. 参数的配置 - 属性参数类 3. 真的很简单 - 简单的服务类 4. 自动配置的核心 - 自动配置类 5. spring.factories 不要 ...
- 创建一个简单的terraform module
terraform module可以实现代码的复用,同时方便分享,下面创建一个简单的基于localfile && template provider 的module module ...
- 简单 babel plugin 开发-使用lerna 工具
babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...
随机推荐
- LeetCode Construct Binary Tree from String
原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-string/description/ 题目: You need to ...
- C#网络编程(接收文件) - Part.5
这篇文章将完成 Part.4 中剩余的部分,它们本来是一篇完整的文章,但是因为上一篇比较长,合并起来页数太多,浏览起来可能会比较不方便,我就将它拆为两篇了,本文便是它的后半部分.我们继续进行上一篇没有 ...
- PHP 操作XML文档
<<<操作符需PHP5.3以上版本才能支持,下面程序在wamp环境下测试完成. <?php // Set the content type to be XML, so that ...
- MongoDB高级查询用法大全 (转)
http://www.cnblogs.com/t2xingzhe/p/3555268.html
- FIR滤波器和IIR滤波器的区别
数字滤波器广泛应用于硬件电路设计,在离散系统中尤为常见,一般可以分为FIR滤波器和IIR滤波器,那么他们有什么区别和联系呢. FIR滤波器 定义: FIR滤波器是有限长单位冲激响应滤波器,又称为非递归 ...
- 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)
拦截导弹简单版 时间限制: 1 Sec 内存限制: 128 MB提交: 40 解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...
- PHP下的命令行执行 php -S localhost -t public(public是根目录,也是入口文件所在目录,是LARAVEL的)
PHP 的命令行模式 以下是 PHP 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,您随时可以通过 PHP -h 命令来查询这些参数. Usage: php [option ...
- 编译openwrt失败 “Please install theopenssl library”
make menuconfig出现了错误 Build dependency: Please install theopenssl library(with development headers) P ...
- oracle 分析函数加order by的影响
create table test (id number(2), name varchar2(10), salary number(6,2));insert into test values (1,' ...
- IntelliJ IDEA 安装 Julia 插件
打开 IntelliJ IDEA 点击 Configure 选择 Plugins 然后点击 Browse repositories 搜索 Julia,然后点击 Install 进行安装 安装完重启一下 ...