实现一个简单的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 ...
随机推荐
- NOIP2013 DAY2题解
DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...
- 深入浅出K-Means算法
在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示. ...
- MonGoDB问题笔记
1. 最近出了一个问题,就是按日期查查不出来数据,经过折腾后发现,mongodb中的存储数据的日期格式与查询时使用的日期格式不匹配,导致查询出不来 //{"$and":[{ &qu ...
- 【转】Jmeter和LR上传文件和下载
背景: 在某个申请业务中,需要上传附件文件,然后才能提交该申请 遇到的问题: 1, 在使用Jmeter或者LR进行录制时,无法录制到上传文件的请求,只能通过Fiddler能查看到该请求 2, 因为 ...
- 解决JAVA_HOME nor the JRE_HOME environment variable is defined
从别的地方复制了一个tomcat, 启动后一闪即退, 使用记事本打开 startup.bat文件, 在文件底部修改, 并追加如下内容 call "%EXECUTABLE%" run ...
- mysql库操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- python's eighth day for me
f : 变量,f_obj, file, f_handler,...文件句柄. open : windows 的系统功能. windows 默认编码方式:gbk. Linux 默认编码方式:utf ...
- Three.js导入gltf模型和动画
核心代码 复杂的3D模型一般都是用第三方建模工具生成,然后加载到three中 three官方推荐使用gltf格式的文件,代表编辑器是blender 本文生成了自定义生成了一个blender模型,并且应 ...
- 小程序二维码生成接口API
获取小程序码 我们推荐生成并使用小程序码,它具有更好的辨识度.目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口. 接口A: 适用于需要的码数量较少的业务场景 接口地址: http ...
- Python 编码机制
python 编码转换 Python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动 ...