ROS学习(24)plugin插件

2023-05-16

文章目录

  • 前言
  • 一、工作原理
  • 二、具体实现
    • 1、创建基类
    • 2、创建plugin类
    • 3、注册插件
    • 4、编译插件的动态链接库
    • 5、将插件加入ROS
    • 6、调用插件
    • 7、运行效果


前言

  ROS中的插件就是可以动态加载的扩展功能类。
  ROS中的pluginlib功能包提供了加载喝卸载plugin的C++库,开发者在使用插件时,不需要考虑plugin类的链接位置,只需要将插件注册到pluginlib中,即可直接动态加载。

一、工作原理

如图所示:
在这里插入图片描述
实现一个插件需要如下几个步骤:

  1. 创建基类,定义统一接口(如果基于现有基类实现插件,跳过该步)
  2. 创建plugin类,继承基类,实现统一的接口
  3. 注册插件(使用pluginlib的宏完成注册)
  4. 编译生成插件的动态链接库(修改CMakefile.txt文件)
  5. 将插件加入到ROS中(创建喝修改相应xml文件)

二、具体实现

按照上述步骤,下面利用pluginlib实现一个插件。创建名为pluginlib_tutorials的功能包,命令如下:

catkin_create_pkg pluginlib_tutorials roscpp pluginlib

注意,创建时添加pluginlib依赖。

1、创建基类

在include/pluginlib_tutorials/polygon_bash.h文件中,创建polygon基类,定义一些接口,注意initialize()接口的使用。文件内容如下:

#ifndef PLUGINLIB_TUTORIALS_POLYGON_BASE_H_
#define PLUGINLIB_TUTORIALS_POLYGON_BASE_H_

namespace polygon_base 
{
    
class RegularPolygon
{
public:
    //pluginlib要求构造函数不能带有参数,所以定义initialize来完成需要初始化的工作
    virtual void initialize(double side_length) = 0;

    //计算面积的接口函数
    virtual double area() = 0;

    virtual ~RegularPolygon(){}

protected:
    RegularPolygon(){}
};

};
#endif

2、创建plugin类

在include/pluginlib_tutorials/polygon_plugins.h文件中,定义rectangle_plugin和triangle_plugin类,实现基类的接口,也可以添加plugin自身需要的接口。文件内容如下:

#ifndef PLUGINLIB_TUTORIALS_POLYGON_PLUGINS_H_
#define PLUGINLIB_TUTORIALS_POLYGON_PLUGINS_H_
#include <pluginlib_tutorials/polygon_base.h>
#include <cmath>

namespace polygon_plugins 
{
    
class Triangle : public polygon_base::RegularPolygon
{
public:
    Triangle() : side_length_() {}

    // 初始化边长
    void initialize(double side_length)
    {
        side_length_ = side_length;
    }

    double area()
    {
        return 0.5 * side_length_ * getHeight();
    }

    // Triangle类自己的接口
    double getHeight()
    {
        return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
    }

private:
    double side_length_;
};

class Square : public polygon_base::RegularPolygon
{
public:
    Square() : side_length_() {}

    // 初始化边长
    void initialize(double side_length)
    {
        side_length_ = side_length;
    }

    double area()
    {
        return side_length_ * side_length_;
    }

private:
    double side_length_;

};

};
#endif

3、注册插件

在src/pluginlib_tutorials/polygon_plugins.cpp文件中,注册创建好的插件。文件内容如下:

//包含pluginlib的头文件,使用pluginlib的宏来注册插件
#include <pluginlib/class_list_macros.h>
#include <pluginlib_tutorials/polygon_base.h>
#include <pluginlib_tutorials/polygon_plugins.h>

//注册插件,宏参数:plugin的实现类,plugin的基类
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon);
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon);

4、编译插件的动态链接库

修改CMakefile.txt文件,如下:

add_library(pluginlib_tutorials src/polygon_plugins.cpp)
target_link_libraries(pluginlib_tutorials ${catkin_LIBRARIES})

5、将插件加入ROS

  1. 创建src/pluginlib_tutorials/polygon_plugins.xml文件,内容如下:
<library path="lib/libpluginlib_tutorials">
    <class name="pluginlib_tutorials/regular_triangle" type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
        <description>This is a triangle plugin.</description>
    </class>
    <class name="pluginlib_tutorials/regular_square" type="polygon_plugins::Square" base_class_type="polygon_base::RegularPolygon">
        <description>This is a square plugin.</description>
    </class>
</library>

这个XML主要描述了plugin的动态库路径、实现类、基类、功能描述等信息。

  1. 修改src/pluginlib_tutorials/package.xml文件,内容如下:
<?xml version="1.0"?>
<package>
  <name>pluginlib_tutorials</name>
  <version>0.1.10</version>
  <description>The pluginlib_tutorials package</description>
  <maintainer email="d.stonier@gmail.com">Daniel Stonier</maintainer>
  <license>BSD</license>

  <url type="website">http://www.ros.org/wiki/pluginlib/Tutorials</url>
  <url type="bugtracker">https://github.com/ros/common_tutorials/issues</url>
  <url type="repository">https://github.com/ros/common_tutorials/</url>

  <author>Eitan Marder-Eppstein</author>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>pluginlib</build_depend>
  <build_depend>roscpp</build_depend>

  <run_depend>pluginlib</run_depend>
  <run_depend>roscpp</run_depend>

  <export>
    <pluginlib_tutorials plugin="${prefix}/polygon_plugins.xml" />
  </export>
</package>

可以使用如下命令,查看功能包的插件路径:

rospack plugins --attrib=plugin pluginlib_tutorials

如果配置正确,效果如下:
在这里插入图片描述

6、调用插件

上面已经实现了该插件的所有代码,现在开始调用该插件,创建src/pluginlib_tutorials/polygon_loader.cpp文件,内容如下:

#include <boost/shared_ptr.hpp>

#include <pluginlib/class_loader.h>
#include <pluginlib_tutorials/polygon_base.h>

int main(int argc, char** argv)
{
    // 创建一个ClassLoader,用来加载plugin
    pluginlib::ClassLoader<polygon_base::RegularPolygon> poly_loader("pluginlib_tutorials", "polygon_base::RegularPolygon");

    try
    {
        // 加载Triangle插件类,路径在polygon_plugins.xml中定义
        boost::shared_ptr<polygon_base::RegularPolygon> triangle = poly_loader.createInstance("pluginlib_tutorials/regular_triangle");

        // 初始化边长
        triangle->initialize(10.0);

        ROS_INFO("Triangle area: %.2f", triangle->area());
    }
    catch(pluginlib::PluginlibException& ex)
    {
        ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
    }

    try
    {
        boost::shared_ptr<polygon_base::RegularPolygon> square = poly_loader.createInstance("pluginlib_tutorials/regular_square");
        square->initialize(10.0);

        ROS_INFO("Square area: %.2f", square->area());
    }
    catch(pluginlib::PluginlibException& ex)
    {
        ROS_ERROR("The plugin failed to load for some reason. Error: %s", ex.what());
    }

    return 0;
}

修改CMakefile.txt文件,如下:

add_executable(polygon_loader src/polygon_loader.cpp)
target_link_libraries(polygon_loader ${catkin_LIBRARIES})

7、运行效果

编译成功后,运行该插件,命令如下:

rosrun pluginlib_tutorials polygon_loader

效果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习(24)plugin插件 的相关文章

随机推荐

  • 转贴:ERP实施过程中的40个问题

    笔者在多年的实践中 xff0c 结合自身经验和多年的理论积累 xff0c 总结出有关ERP 实施的最关键的39 个问题 xff0c 以问答的形式 xff0c 让您在最短的时间内对ERP 实施有一个全面而客观的认识 xff0c 以免陷入日新月
  • VS Code 常用设置集合

    常用设置 xff08 setting json xff09 34 editor parameterHints enabled 34 true 开启参数预览窗口 设置字体颜色 34 editor semanticTokenColorCusto
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • Px4 ULog文件详解

    Px4 ULog文件详解 简介数据类型文件组织文件头定义段消息标记位消息格式定义消息信息消息复合信息消息参数消息 数据段订阅消息取消订阅消息日志数据消息字符串消息同步消息丢失 附录 简介 ULog 是用于记录数据的文件格式 xff0c 该格
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x
  • pandas使用笔记

    DataFrame使用笔记 dates 61 pd date range span class hljs string 39 20160728 39 span periods 61 span class hljs number 6 span
  • keras

    大神笔记 xff0c 转载自http blog csdn net u012162613 article details 45397033 Keras简介 Keras是基于Theano的一个深度学习框架 xff0c 它的设计参考了Torch
  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • 多维中维度的理解

    项目有段时间了 xff0c 今天需要做一个需求查询调研 必须要照顾楼下业务人员理解的方式吧多维度表述清楚 还真不好讲 xff1a 原以为维度就是一个基准点 xff0c 一个看事情的角度 xff0c 静下来想 xff0c 要描述出来好像还真不
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • ROS学习(9)自定义移动机器人模型Gazebo仿真

    文章目录 前言一 gazebo启动二 创建编译功能包三 更新xacro文件1 更新robot base xacro2 更新robot camera xacro3 更新robot lidar xacro4 更新robot xacro 四 更新
  • ROS学习(11)使用ROS创建地图

    文章目录 前言一 创建编译功能包二 更新启动文件三 启动模型四 保存地图五 加载地图六 总结 前言 创建地图是一件比较复杂的工作 xff0c ROS利用map server地图服务器 xff0c 借助激光雷达和机器人的里程信息来完成这项工作
  • ROS学习(12)使用ROS创建自定义地图

    文章目录 前言一 新建环境二 创建编译功能包三 新建 world文件四 新建world启动文件五 更新启动文件六 建图 前言 上一篇使用的是柳树车库环境 xff0c 实现完整建图工作比较复杂 xff0c 所以准备新建一个简单点的环境 xff
  • ROS学习(13)自定义机器人的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 运行启动文件六 为导航功能包集设置rviz七 导航仿真 前言 上一篇针对我家户型 xff0c 完成了自定义环境的建图工作 本篇主要完成对导航功
  • ROS学习(开篇)Ubuntu16.04安装ROS Kinetic详细教程

    文章目录 前言一 添加ROS软件源 xff08 sources list xff09 二 添加密钥三 更新apt功能包列表四 安装ROS五 初始化 rosdep六 将ROS环境变量添加到 bashrc文件中七 安装rosinstall等工具
  • ROS学习(14)自定义四轮小车的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 导航仿真六 总结 前言 本篇为自定义四轮小车的ROS导航仿真 xff0c 与前面自定义机器人导航类似 该篇源码非原创 xff0c 特此说明 x
  • ROS学习(24)plugin插件

    文章目录 前言一 工作原理二 具体实现1 创建基类2 创建plugin类3 注册插件4 编译插件的动态链接库5 将插件加入ROS6 调用插件7 运行效果 前言 ROS中的插件就是可以动态加载的扩展功能类 ROS中的pluginlib功能包提