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. jslinq 使用总结

    最近一直在用 jslinq 感觉还是不错的.用于增强 Array.find() 上重点: 1: 引用 cnpm install jslinq --save (本人用淘宝镜像--npmFQ感觉也不快-- ...

  2. loadsh学习

    由Underscore与Lodash的差异引发的思考:http://ju.outofmemory.cn/entry/106512 JavaScript工具库之Lodash Underscore和Lod ...

  3. python一个简单的web服务器和客户端

    服务器:      当客户联系时创建一个连接套接字      从这个连接接收HTTP请求(*)      解释该请求所请求的特定文件      从服务器的文件系统获取该文件      并发送文件内容 ...

  4. 善待Erlang 代码 -- 巧用 user_default

    这是一篇水文 ----------------------------------------------------- 很好用的一个技巧 http://www.erlang.org/doc/man/ ...

  5. nginx.conf解读

    通常我们需要配置nginx.conf或者配置子项目的配置文件,那么我们需要解读它里面每一个参数的意义,就来个范例解读吧(有中午注释) #运行用户 user www-data; #启动进程,通常设置成和 ...

  6. centOS下 JDK的三种安装方式

    由于各Linux开发厂商的不同,因此不同开发厂商的Linux版本操作细节也不一样,今天就来说一下CentOS下JDK的安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创 ...

  7. java代码,实现输入编号,输出对应水果的单价~~~~

    总结:总感觉有问题,因为输出我写的太不对劲了,直接把price的价格写了出来然输出显示…… package com.badu; import java.util.Scanner; //从键盘输入次数, ...

  8. Java-API-Package:java.sql百科

    ylbtech-Java-API-Package:java.sql百科 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API.此 API 包括一个框架,凭借 ...

  9. php无刷新上传图片

    1. 引入文件 <!--图片上传begin--> <script type="text/javascript" src="/js/jquery.form ...

  10. Linux - 归档和压缩

    归档 归档就是将多个文件或目录合并成一个文件 归档的目的就是方便备份.还原及文件的传输操作 tar 命令:将多个文件或目录归档到一个文件中,可以根据需要只还原归档文件中的某些指定的文件 c:创建,v: ...