栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ROS学习(24)plugin插件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ROS学习(24)plugin插件

文章目录
  • 前言
  • 一、工作原理
  • 二、具体实现
    • 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 
#include 

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 
#include 
#include 

//注册插件,宏参数: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文件,内容如下:

    
        This is a triangle plugin.
    
    
        This is a square plugin.
    

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

  1. 修改src/pluginlib_tutorials/package.xml文件,内容如下:


  pluginlib_tutorials
  0.1.10
  The pluginlib_tutorials package
  Daniel Stonier
  BSD

  http://www.ros.org/wiki/pluginlib/Tutorials
  https://github.com/ros/common_tutorials/issues
  https://github.com/ros/common_tutorials/

  Eitan Marder-Eppstein

  catkin

  pluginlib
  roscpp

  pluginlib
  roscpp

  
    
  

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

rospack plugins --attrib=plugin pluginlib_tutorials

如果配置正确,效果如下:

6、调用插件

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

#include 

#include 
#include 

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

    try
    {
        // 加载Triangle插件类,路径在polygon_plugins.xml中定义
        boost::shared_ptr 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 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

效果如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号