创建包

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

教程级别:初学者

时间:15 分钟

背景

1 什么是 ROS 2 包?

包是 ROS 2 代码的组织单元。 如果您希望能够安装代码或与他人共享,则需要将其组织在包中。 使用包,您可以发布您的 ROS 2 工作并允许其他人轻松构建和使用它。

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

2 ROS 2 包由什么组成?

ROS 2 Python 和 CMake 包各自具有各自的最低必需内容:

  • CMakeLists.txt file that describes how to build the code within the package

  • include/<package_name> directory containing the public headers for the package

  • package.xml file containing meta information about the package

  • src directory containing the source code for the package

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

my_package/
     CMakeLists.txt
     include/my_package/
     package.xml
     src/

3 工作区中的包

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

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

一个简单的工作区可能看起来像:

workspace_folder/
    src/
      cpp_package_1/
          CMakeLists.txt
          include/cpp_package_1/
          package.xml
          src/

      py_package_1/
          package.xml
          resource/py_package_1
          setup.cfg
          setup.py
          py_package_1/
      ...
      cpp_package_n/
          CMakeLists.txt
          include/cpp_package_n/
          package.xml
          src/

先决条件

按照 上一个教程 中的说明操作后,您应该有一个 ROS 2 工作区。

您将在此工作区中创建您的包。

任务

1 创建包

首先,source your ROS 2 installation

让我们将您在 上一个教程 中创建的工作区 ros2_ws 用于您的新包。

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

cd ~/ros2_ws/src

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

ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>

对于本教程,您将使用可选参数“–node-name”和“–license”。 “–node-name”选项在包中创建一个简单的 Hello World 类型可执行文件,“–license”声明包的许可证信息。

在终端中输入以下命令:

ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package

现在,您的工作区“src”目录中将有一个名为“my_package”的新文件夹。

运行该命令后,您的终端将返回以下消息:

going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['Apache-2.0']
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 构建包

将包放入工作区特别有用,因为您可以通过在工作区根目录中运行“colcon build”一次构建多个包。 否则,您必须单独构建每个包。

返回工作区的根目录:

cd ~/ros2_ws

现在您可以构建您的包:

colcon build

回想一下上一个教程,您的“ros2_ws”中也有“ros_tutorials”包。 您可能已经注意到,运行“colcon build”也会构建“turtlesim”包。 当您的工作区中只有几个包时,这很好,但是当有许多包时,“colcon build”可能需要很长时间。

如果下次只构建“my_package”包,您可以运行:

colcon build --packages-select my_package

3 获取安装文件

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

然后,在“ros2_ws”目录中,运行以下命令获取工作区:

source install/local_setup.bash

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

4 使用包

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

ros2 run my_package my_node

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

hello world my_package package

5 检查包装内容

在“ros2_ws/src/my_package”里面,你会看到“ros2 pkg create”自动生成的文件和文件夹:

CMakeLists.txt  include  package.xml  src

my_node.cpp is inside the src directory. 这是您所有自定义 C++ 节点将来要去的地方。

6 Customize package.xml

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

From ros2_ws/src/my_package, open package.xml using your preferred text editor:

<?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="user@todo.todo">user</maintainer>
 <license>TODO: License declaration</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>

如果“maintainer”行没有自动填充,请输入您的姓名和电子邮件。 然后,编辑“description”行以总结该包:

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

然后,更新 license 行。 您可以在 此处 阅读有关开源许可证的更多信息。 由于此包仅用于练习,因此使用任何许可证都是安全的。 我们将使用 Apache-2.0

<license>Apache-2.0</license>

编辑完成后,别忘了保存。

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

You’re all done for now!

不要忘记保存文件。

摘要

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

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

后续步骤

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