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的更多相关文章

  1. 简单webpack plugin 开发

    重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...

  2. 用Eclipse 创建一个 简单的 Maven JavaWeb 项目

    使用Maven 创建一个简单的 javaWeb 项目: 本篇属于 创建 JavaWeb 项目的第三篇: 建议阅读本篇之前 阅读 用 Eclipse 创建一个简单的web项目  ;本篇是这这篇文章的基础 ...

  3. spring boot一个简单用户管理DEMO

    概述 该Demo旨在部署一个简单spring boot工程,包含数据编辑和查看功能 POM配置 <?xml version="1.0" encoding="UTF- ...

  4. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  5. spring cloud 创建一个简单Eureka Server

    在Spring Cloud实现一个Eureka Server是一件非常简单的事情.下面我们来写一个Eureka Server DEMO. 编码 父项目pom.xml <?xml version= ...

  6. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  7. Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块

    文章目录 1. 实战的开端 – Maven搭建 2. 参数的配置 - 属性参数类 3. 真的很简单 - 简单的服务类 4. 自动配置的核心 - 自动配置类 5. spring.factories 不要 ...

  8. 创建一个简单的terraform module

      terraform module可以实现代码的复用,同时方便分享,下面创建一个简单的基于localfile && template provider 的module module ...

  9. 简单 babel plugin 开发-使用lerna 工具

    babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...

随机推荐

  1. springmvc中拦截器与springmvc全局异常处理器的问题

    最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...

  2. redis key设计技巧

    把表名转换为key前缀, 第二端放置表用于区分区key的字段–对应mysql中的主键的列名如userid. 3.放置主键值,如1,2,3,…..,a,b,c. 4.放要存储的列名 user表 user ...

  3. browser-sync 服务器使用

    1. 安装 npm install browser-sync or yarn add browser-sync 2. 使用(集成gulp) 备注: gulp 安装使用此处不介绍 默认的端口是3000, ...

  4. 用hexo搭建自己的blog

    一.工具准备: 1.1 安装node 作用:用来生成静态页面的 到Node.js官网下载相应平台的最新版本,一路安装即可. 1.2 安装Git 作用:把本地的hexo内容提交到github上去. 安装 ...

  5. Java 编码规范

    package(包) 包名的命名规范:1.小写 2.至少有一层目录 3.域名倒置书写 package baidu; package com.baidu.www; Class(类)-----大驼峰法 类 ...

  6. java md5 函数

    private static final String md5(final String s) { final String MD5 = "MD5"; try { // Creat ...

  7. EMI (电磁干扰)

    EMI是指电子产品工作会对周边的其他电子产品造成干扰,与此关联的还有EMC规范.是电子电器产品经常遇上的问题.干扰种类有传导干扰和辐射干扰. 电磁干扰(Electromagnetic Interfer ...

  8. 【原创】官方文档-hive 启动命令

    [一起学Hive]之十六-Hive的WEB页面接口-HWI Apache Hive 管网 hive metrics hive常用命令整理 Hive学习之HiveServer2服务端配置与启动 启动hi ...

  9. 1146 Topological Order

    题意:判断序列是否为拓扑序列. 思路:理解什么是拓扑排序就好了,简单题.需要注意的地方就是,因为这里要判断多个,每次判断都会改变入度indegree[],因此记得要把indegree[]留个备份.ps ...

  10. 2014.8.25 CAD系统事件触发流程

    各进近.离场.进场Arinc424数据录入界面在CADDataManager/UC/UCIAP(UCSID)下 UCAirport是一抽象用户控件类,在FormADHP初始化时实例化成airport控 ...