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. H5打字机特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. mysql中OPTIMIZE TABLE的作用及使用

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  3. 关于bonecp和QuerRunner

    之前一直以为boneCP和QueryRunner是绑定的,但是其实不是,后者来自于commons-dbUtils,BoneCP就是负责连接池. while preparing SQL: UPSERT ...

  4. 10 Things ASP.NET Developers Should Know About Web.config Inheritance and Overrides(转)

    10 Things ASP.NET Developers Should Know About Web.config Inheritance and Overrides Wednesday, Janua ...

  5. Indy发送邮件被kbas退掉

    用indy开发了发送邮件程序,通过126,sina等发送邮件可以发送出去,而通过tom,163则被退回,显示被 kbas系统退回.后来通过观察Foxmail的通讯过程,区别在foxmail发送EHLO ...

  6. FPGA论剑(续)

    25年之后,第二次华山论剑之时,天下第一的王重阳已然仙逝,郭靖少年英杰刚过二十岁,接东邪黄药师.北丐洪七公300招不败,二人默认郭靖天下第一.南帝段智兴因为出家,法号“一灯”,早已看破名利,故没有参加 ...

  7. Winform判断是否已启动

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  8. Spring security 浅谈用户验证机制

    step1:首先ApplicationUserDetailsService需要实现UserDetailsService接口(在 org.springframework.security.core.us ...

  9. Centos7部署CephFS

    标签(空格分隔): ceph环境,ceph,cephfs cephfs部署之前准备工作: 1. 一个 clean+active 的cluster cluster部署参考:centos7下搭建ceph ...

  10. PLSQL Developer备份恢复oracle数据

    使用PL sql提供的功能可以快速的备份恢复oracle数据. 1  导出存储过程,触发器,序列等所有用户对象.(备份) 在PL/SQL Developer的菜单Tools(工具) => Exp ...