首页 > 其他分享 > Beginner:Client libraries-10 创建并使用插件

Beginner:Client libraries-10 创建并使用插件

时间:2023-06-03 11:13:46浏览次数:50  
标签:10 插件 polygon Beginner double length base side

目标:学习创建和加载一个简单的插件使用pluginlib

背景

本教程来自于

 http://wiki.ros.org/pluginlib and Writing and Using a Simple Plugin Tutorial.pluginlib是一个c++库,用于从ROS包中加载和卸载插件。插件是从运行库(即共享对象、动态链接库)加载的可动态加载类。使用pluginlib,不必将其应用程序与包含类的库显式链接——相反,pluginlib可以在任何时候打开包含导出类的库,而应用程序事先不知道该库或包含类定义的头文件。插件对于在不需要应用程序源代码的情况下扩展/修改应用程序行为非常有用。

任务

在本教程中,需要创建两个包,一个定义了基类,另一个提供插件。基类定义一个通用的多边形类,然后插件定义具体的形状。

1、创建基类包

ros2 pkg create --build-type ament_cmake polygon_base --dependencies pluginlib --node-name area_node

创建头文件:polygon_base/include/polygon_base/regular_polygon.hpp

里面内容如下:

#ifndef POLYGON_BASE_REGULAR_POLYGON_HPP
#define POLYGON_BASE_REGULAR_POLYGON_HPP

namespace polygon_base
{
  class RegularPolygon
  {
    public:
      virtual void initialize(double side_length) = 0;
      virtual double area() = 0;
      virtual ~RegularPolygon(){}

    protected:
      RegularPolygon(){}
  };
}  // namespace polygon_base

#endif  // POLYGON_BASE_REGULAR_POLYGON_HPP

为了让其他类可以使用这个头文件,在CMakeLists.txt中ament_target_dependencies命令之后编辑如下:

install(
  DIRECTORY include/
  DESTINATION include
)

 

在命令ament_package之前添加:

ament_export_include_directories(
  include
)

2、创建一个插件包

ros2 pkg create --build-type ament_cmake polygon_plugins --dependencies polygon_base pluginlib --library-name polygon_plugins

2.1 source 代码为了插件

在文件/polygon_plugins/src/polygon_plugins.cpp中添加如下

#include <polygon_base/regular_polygon.hpp>
#include <cmath>

namespace polygon_plugins
{
  class Square : public polygon_base::RegularPolygon
  {
    public:
      void initialize(double side_length) override
      {
        side_length_ = side_length;
      }

      double area() override
      {
        return side_length_ * side_length_;
      }

    protected:
      double side_length_;
  };

  class Triangle : public polygon_base::RegularPolygon
  {
    public:
      void initialize(double side_length) override
      {
        side_length_ = side_length;
      }

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

      double getHeight()
      {
        return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
      }

    protected:
      double side_length_;
  };
}

#include <pluginlib/class_list_macros.hpp>

PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)

上面实现了一个正方形和三角形,保存边,计算面积。最后三行说明了插件,会调用一些定义来注册实际的类为插件。

参数宏PLUGINLIB_EXPORT_CLASS:

1.插件类的完全类型:

polygon_plugins::Square

2.基类的完全类型:

polygon_base::RegularPolygon

2.2 插件声明XML

 

标签:10,插件,polygon,Beginner,double,length,base,side
From: https://www.cnblogs.com/gary-guo/p/17453537.html

相关文章

  • IDEA问题之“MyBatis插件安装【MyBatisX】”
    一、场景在SSM框架中带有XML文件的查找很是麻烦,特别是在ID命名有大量重复时而这个插件就可以,让你直接从Service实现类中直接跳到XML中还有些其他功能,可以探索探索一、配置步骤1.打开IDEA设置 2.安装MyBatisX插件】3.重启IDEA三、效果图  ......
  • Beginner:Client libraries-9 使用ros2doctor识别问题
    目标:在ros2系统中通过ros2doctor工具来识别问题。背景当ros2系统没有按预期运行,可以通过ros2doctor来检查设置。ros2doctor检查ros2的所有方面,包括平台,版本,网络,环境,运行系统等等,警告你可能的错误和问题的原因。ros2doctor是ros2cli的一部分。只要ros2cli按照常规安装,就可以使......
  • A1003 Emergency
    题目:Asanemergencyrescueteamleaderofacity,youaregivenaspecialmapofyourcountry.Themapshowsseveralscatteredcitiesconnectedbysomeroads.Amountofrescueteamsineachcityandthelengthofeachroadbetweenanypairofcitiesarem......
  • 【蓝桥杯集训·每日一题】AcWing 1079. 叶子的颜色
    写在前面本人CSDN博客主页:这里一、题目1、原题链接1079.叶子的颜色2、题目描述给一棵有m个节点的无根树,你可以选择一个度数大于1的节点作为根,然后给一些节点(根、内部节点、叶子均可)着以黑色或白色。你的着色方案应保证根节点到各叶子节点的简单路径上都至少包含一个有色节点,哪......
  • 使用du查/mysql/bak目录使用1013g,但使用df查却显示使用2.8t
    问题描述:使用du查/mysql/bak目录使用1013g,但使用df查却显示使用2.8t,如下所示:系统:rhel7.3异常原因:删除文件后,du命令便不会在文件系统目录中统计被删除的文件,若此时存在运行中的进程持有已经被删除的文件句柄,那该类文件就不会真正在磁盘中被删除,分区超级块中的信息也不会更改,df命......
  • Beginner:Client libraries-8 在类中使用参数
    目标:创建和运行一个具有ROS参数的类背景当实现自己节点的时候,可能需要从launch文件中添加参数。本教程的目的是告诉你怎样在c++类中创建这些参数,以及怎样在launch文件中设置。任务1、创建一个包ros2pkgcreate--build-typeament_cmakecpp_parameters--dependenciesrcl......
  • NAS 5105 6005硬件配置要求和装机接线图
    欢迎选购本主板,畅网的主板!硬件选购要点:1、内存选购要求:只要是正品就一定能开机,拒绝假货与水货(开机看运气)!2、硬盘最好选择,硬盘有价数据无价!买新盘,买矿盘有风险!买垂直盘,不要买叠瓦盘!买有质保盘,不买脱保盘! 3、m.2硬盘正品就行,不挑硬盘。4、电源最好200W及以上的,特别是使用企......
  • 查 101.201.62.30 IP信誉方法
    查101.201.62.30IP信誉方法https://www.virustotal.com/#/ip-address/101.201.62.30https://talosintelligence.com/reputation_center/lookup?search=101.201.62.30https://x.threatbook.cn/ip/101.201.62.30......
  • 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
     圈复杂度主要与分支语句(if、else、,switch等)的个数成正相关。如下代码:  1.publicStringcase2(intindex,Stringstring){2.null;3.if(index<0){4.thrownewIndexOutOfBoundsException("exception<0");5.}6.if(index==1){......
  • owsap top 10 2018
    OWASP-Top10Vulnerabilitiesinwebapplications(updatedfor2018) IntroductionOWASP(Openwebapplicationsecurityproject)communityhelpsorganizationsdevelopsecureapplications.Theycomeupwithstandards,freewaretoolsandconferencesthathelp......