目标:使用 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 包都有各自的最低要求内容:
CMake:
描述如何在包内构建代码的
CMakeLists.txt
文件包含包公共头文件的
include/<package_name>
目录包含包元信息的
package.xml
文件包含包源代码的目录
Python:
包含包元信息的
package.xml
文件标记文件为包
当包含有可执行文件时,需要
setup.cfg
,以便ros2 run
能够找到它们包含如何安装软件包的说明
<package_name>
- 一个与您的包同名的目录,被 ROS 2 工具用来找到您的包,包含__init__.py
最简单的包可能具有如下的文件结构:
CMake:
my_package/CMakeLists.txtinclude/my_package/package.xmlsrc/
Python:
my_package/package.xmlresource/my_packagesetup.cfgsetup.pymy_package/
3. 工作区中的包
一个工作空间可以包含任意多的包,每个包都在自己的文件夹中。你也可以在一个工作空间中拥有不同构建类型的包(CMake、Python 等)。你不能有嵌套的包。
最佳实践是在工作区内有一个 src
文件夹,并在其中创建你的包。这样可以保持工作区顶层的“整洁”。
一个简单的工作空间可能看起来像:
workspace_folder/src/cpp_package_1/CMakeLists.txtinclude/cpp_package_1/package.xmlsrc/py_package_1/package.xmlresource/py_package_1setup.cfgsetup.pypy_package_1/...cpp_package_n/CMakeLists.txtinclude/cpp_package_n/package.xmlsrc/
先决条件
您在遵循上一教程的指导后,应该有一个 ROS 2 工作空间。您将在此工作空间中创建您的包。
任务
1. 创建一个包
首先,配置您的 ROS 2 安装。
让我们使用你在上一个教程中创建的工作空间, ros2_ws
,来为你的新包。
确保在运行打包创建命令之前,您在 src
文件夹中。
cd ~/ros2_ws/src
在 ROS 2 中创建新包的命令语法是:
CMake:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>
Python:
ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>
在本教程中,您将使用可选参数 --node-name
和 --license
。 --node-name
选项在包中创建一个简单的 Hello World 类型的可执行文件, --license
声明包的许可信息。
在终端中输入以下命令:
CMake:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
Python:
ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name my_node my_package
您的工作空间的 src
目录中现在将有一个名为 my_package
的新文件夹。
执行命令后,终端会返回消息:
cxy@ubuntu2404-cxy:~/ros2_ws/src$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
going to create a new package
package name: my_package
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: []
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
cxy@ubuntu2404-cxy:~/ros2_ws$ colcon build --packages-select my_package
Starting >>> my_package
Finished <<< my_package [2.39s] Summary: 1 package finished [2.63s]
3 源设置文件
要使用您的新软件包和可执行文件,请首先打开一个新的终端并源于您的主要 ROS 2 安装。
然后,在 ros2_ws
目录内部运行以下命令来配置您的工作区:
source install/local_setup.bash
现在您的工作区已经添加到您的路径中,您将能够使用新包的可执行文件。
4. 使用该软件包
要运行您在包创建过程中使用 --node-name
参数创建的可执行文件,请输入命令:
ros2 run my_package my_node
将返回消息到您的终端:
cxy@ubuntu2404-cxy:~/ros2_ws$ 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
位于 src
目录内。这是您将来所有自定义 C++节点的存放位置。
6 自定义 package.xml
您可能已经注意到,在创建包后的返回消息中,字段 description
和 license
包含 TODO
注释。这是因为包描述和许可声明不会自动设置,但如果您想要发布您的包,这些是必需的。字段 maintainer
也可能需要填写。
从 ros2_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="cxy@todo.todo">cxy</maintainer><license>Apache-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>
如果您的姓名和电子邮件没有自动填写,请在 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
很简单,没有任何依赖性,但您会看到这个空间在即将到来的教程中被利用。
您现在已经完成了!
摘要
您已创建了一个包来组织您的代码,并使其易于他人使用。
您的包已自动填充了必要的文件,然后您使用 colcon 进行构建,以便您可以在本地环境中使用其可执行文件。
下一步
接下来,让我们向包中添加一些有意义的内容。您将从一个简单的发布/订阅系统开始,您可以选择用 C++ https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html 或 Python 编写https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher-And-Subscriber.html。