目标:学习使用 pluginlib
创建和加载一个简单的插件。
教程级别:初学者
时间:20 分钟
目录
背景
先决条件
任务
创建基类包
创建插件包
2.1 插件的源代码
2.2 插件声明 XML
2.3 CMake 插件声明
使用插件
构建并运行
摘要
背景
这个教程源自于 http://wiki.ros.org/pluginlib,以及编写和使用一个简单插件教程。
pluginlib
是一个 C++库,用于在 ROS 包内加载和卸载插件。插件是动态可加载的类,它们从运行时库(即共享对象,动态链接库)中加载。使用 pluginlib,您无需显式地将应用程序与包含类的库链接——相反, pluginlib
可以在任何时候打开包含导出类的库,而无需应用程序事先了解库或包含类定义的头文件。插件对于扩展/修改应用程序行为很有用,而无需应用程序源代码。
先决条件
本教程假设您具有基本的 C++知识,并且已经成功安装了 ROS 2。
任务
在本教程中,您将创建两个新的包,一个定义基类,另一个提供插件。基类将定义一个通用的多边形类,然后我们的插件将定义特定的形状。
1 创建基类包
在您的 ros2_ws/src
文件夹中使用以下命令创建一个新的空包:
cxy@ubuntu2404-cxy:~$ cd ~/ros2_ws/src
cxy@ubuntu2404-cxy:~/ros2_ws/src$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 --dependencies pluginlib --node-name area_node polygon_base
going to create a new package
package name: polygon_base
destination directory: /home/cxy/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['cxy <cxy@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_cmake
dependencies: ['pluginlib']
node_name: area_node
creating folder ./polygon_base
creating ./polygon_base/package.xml
creating source and include folder
creating folder ./polygon_base/src
creating folder ./polygon_base/include/polygon_base
creating ./polygon_base/CMakeLists.txt
creating ./polygon_base/src/area_node.cpp
打开您最喜欢的编辑器,编辑 ros2_ws/src/polygon_base/include/polygon_base/regular_polygon.hpp
,然后将以下内容粘贴进去:
#ifndef POLYGON_BASE_REGULAR_POLYGON_HPP // 如果没有定义 POLYGON_BASE_REGULAR_POLYGON_HPP
#define POLYGON_BASE_REGULAR_POLYGON_HPP // 那么就定义 POLYGON_BASE_REGULAR_POLYGON_HPP
namespace polygon_base // 定义命名空间 polygon_base
{
class RegularPolygon // 定义一个名为 RegularPolygon 的类
{
public:
virtual void initialize(double side_length) = 0; // 定义一个纯虚函数 initialize,接受一个 double 类型的参数 side_length
virtual double area() = 0; // 定义一个纯虚函数 area,返回一个 double 类型的值
virtual ~RegularPolygon(){} // 定义一个虚析构函数
protected:
RegularPolygon(){} // 定义一个受保护的构造函数
};
} // 结束命名空间 polygon_base
#endif // 结束条件编译,如果已经定义了 POLYGON_BASE_REGULAR_POLYGON_HPP,那么就不会再执行这个头文件中的代码