> 文章列表 > 【ROS2指南-11】创建ROS2功能包

【ROS2指南-11】创建ROS2功能包

【ROS2指南-11】创建ROS2功能包

目标:使用 CMake 或 Python 创建一个新包,并运行其可执行文件。

教程级别:初学者

时间: 15分钟

内容

  • 背景

    • 1 什么是 ROS 2 包?

    • 2 什么构成了 ROS 2 包?

    • 3 工作区中的包

  • 先决条件

  • 任务

    • 1 创建一个包

    • 2 构建一个包

    • 3 获取安装文件

    • 4 使用包

    • 5 检查包装内容

    • 6 自定义 package.xml

  • 概括

  • 下一步

背景

1 什么是 ROS 2 包?

一个包可以被认为是你的 ROS 2 代码的容器。如果您希望能够安装您的代码或与他人共享,那么您需要将其组织在一个包中。借助软件包,您可以发布您的 ROS 2 作品并允许其他人轻松构建和使用它。

ROS 2 中的包创建使用 ament 作为其构建系统,并使用 colcon 作为其构建工具。您可以使用官方支持的 CMake 或 Python 创建包,但确实存在其他构建类型。

2 什么构成了 ROS 2 包?

ROS 2 Python 和 CMake 包都有自己的最低要求内容:

  • package.xml包含有关包的元信息的文件

  • CMakeLists.txt描述如何在包中构建代码的文件

最简单的包可能具有如下所示的文件结构:

my_package/CMakeLists.txtpackage.xml

3 工作区中的包

一个工作区可以包含任意数量的包,每个包都在自己的文件夹中。您还可以在一个工作区(CMake、Python 等)中包含不同构建类型的包。但不能有嵌套的包!

最佳做法是在您的工作区中有一个src文件夹,并在其中创建您的包。这使工作区的顶层保持“干净”。

一个普通的工作区可能看起来像:

workspace_folder/src/package_1/CMakeLists.txtpackage.xmlpackage_2/setup.pypackage.xmlresource/package_2...package_n/CMakeLists.txtpackage.xml

先决条件

按照上一教程中的说明进行操作后,您应该拥有一个 ROS 2 工作区。您将在此工作区中创建包。

任务

1 创建一个包

首先,获取您的 ROS 2 安装源。

这里使用上一章节创建的 dev_ws 工作空间。

在运行包创建命令之前,请确保您位于该文件夹中。

cd ~/dev_ws/src

在 ROS 2 中创建新包的命令语法是:

ros2 pkg create --build-type ament_cmake <package_name>

对于本教程,您将使用可选参数--node-name在包中创建一个简单的 Hello World 类型可执行文件。

在您的终端中输入以下命令:

ros2 pkg create --build-type ament_cmake --node-name my_node my_package

现在,您的工作区目录中将有一个名为 my_package 的文件夹.

运行命令后,终端将返回信息:

going to create a new package
package name: my_package
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp

您可以看到为新包自动生成的文件。

2 构建一个包

将包放在工作区中特别有价值,因为您可以通过在工作区根目录中运行来一次构建许多包。否则,您将不得不单独构建每个包。

返回到工作区的根目录:

cd ~/dev_ws

现在你可以构建你的包了:

colcon build

回想一下上一教程,ros_tutorials也在dev_ws中。您可能已经注意到也运行构建了这个包。当您的工作区中只有几个包时,这很好,但是当有很多包时,可能会花费很长时间。

colcon build turtlesim

colcon build my_package

下次只构建包,你可以运行:

colcon build --packages-select my_package

3 获取安装文件

要使用您的新包和可执行文件,首先打开一个新终端并获取您的主要 ROS 2 安装源。

然后,从dev_ws目录内部运行以下命令来获取您的工作区:

. install/setup.bash

现在您的工作区已添加到您的路径中,您将能够使用新包的可执行文件。

4 使用包

要运行您在包创建期间使用参数创建的可执行文件--node-name,请输入命令:

ros2 run my_package my_node

这将向您的终端返回一条消息:

hello world my_package package

5 检查包装内容

dev_ws/src/my_package 里面,你会看到自动生成的文件和文件夹:

ros2 pkg create

CMakeLists.txt  include  package.xml  src

my_node.cppsrc目录内。这是您所有自定义 C++ 节点将来的位置。

6 自定义 package.xml

您可能已经在创建包后的返回消息中注意到字段descriptionlicense包含TODO注释。这是因为包描述和许可证声明不会自动设置,但如果您想要发布包,则它们是必需的。maintainer字段可能也需要填写。

使用您喜欢的文本编辑器打开 dev_ws/src/my_package/package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>my_package</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="cas5144@163.com">rust</maintainer><license>Apache License 2.0</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

如果尚未自动为您填充,请在第 7 行输入您的姓名和电子邮件。然后,编辑第 6 行的描述以总结包:

<description>Beginner client libraries tutorials practice package</description>

然后,在第 8 行更新许可证。您可以在此处阅读有关开源许可证的更多信息。

由于此包仅用于练习,因此使用任何许可证都是安全的。我们使用:Apache License 2.0

<license>Apache License 2.0</license>

完成编辑后不要忘记保存。

在许可证标签下方,您会看到一些以 . 结尾的标签名称_depend。这是您package.xml将列出它对其他包的依赖项的地方,供 colcon 搜索。my_package很简单,没有任何依赖关系,但您会在接下来的教程中看到这个空间的使用。

你现在已经完成了!

概括

您已经创建了一个包来组织您的代码并使其易于为他人使用。

您的包会自动填充必要的文件,然后您使用 colcon 构建它,以便您可以在本地环境中使用它的可执行文件。

下一步

接下来,让我们向包中添加一些有意义的东西。您将从一个简单的发布者/订阅者系统开始,您可以选择用C++或Python编写它。