目标:使用 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 包各自有自己最低要求的内容:
Python 包:
package.xml文件,包含包的元信息resource/<package_name>包的标记文件setup.cfg当包有可执行文件时需要,以便ros2 run能找到它们setup.py包含如何安装包的说明<package_name>- 一个与包名同名的目录,供 ROS 2 工具查找您的包,包含__init__.py
最简单的包的文件结构可能如下所示:
Python 包:
my_package/
package.xml
resource/my_package
setup.cfg
setup.py
my_package/
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创建包
首先,加载您的 ROS 2 安装。
让我们使用您在上一个教程中创建的工作空间ros2_ws来存放您的新包。
在运行包创建命令之前,请确保您在src文件夹中。
Linux:
$ cd ~/ros2_ws/src在 ROS 2 中创建新包的命令语法是:
Python 包:
$ ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>在本教程中,您将使用可选参数--node-name和--license。--node-name选项在包中创建一个简单的 Hello World类型可执行文件,--license声明包的许可证信息。
在终端中输入以下命令:
Python 包:
$ ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name my_node my_package现在您将在工作空间的src目录中有一个名为my_package的新文件夹。
运行命令后,您的终端将返回消息:
going to create a new packagepackage name: my_packagedestination directory: /home/user/ros2_ws/srcpackage format: 3version: 0.0.0description: TODO: Package descriptionmaintainer: ['<name> <email>']licenses: ['Apache-2.0']build type: ament_pythondependencies: []node_name: my_nodecreating folder ./my_packagecreating ./my_package/package.xmlcreating source foldercreating folder ./my_package/my_packagecreating ./my_package/setup.pycreating ./my_package/setup.cfgcreating folder ./my_package/resourcecreating ./my_package/resource/my_packagecreating ./my_package/my_package/__init__.pycreating folder ./my_package/testcreating ./my_package/test/test_copyright.pycreating ./my_package/test/test_flake8.pycreating ./my_package/test/test_pep257.pycreating ./my_package/my_package/my_node.py您可以看到为新包自动生成的文件。
2构建包
将包放在工作空间中特别有价值,因为您可以通过在工作空间根目录运行colcon build一次构建多个包。否则,您必须单独构建每个包。
返回到工作空间的根目录:
Linux:
$ cd ~/ros2_ws现在您可以构建您的包:
Linux:
$ colcon build从上个教程中回想一下,您在ros2_ws中还有ros_tutorials包。您可能已经注意到运行colcon build也构建了turtlesim包。当您的工作空间中只有几个包时,这没问题,但是当有很多包时,colcon build可能会花费很长时间。
下次只构建my_package包,您可以运行:
$ colcon build --packages-select my_package3加载设置文件
要使用您的新包和可执行文件,首先打开一个新终端并加载您的主 ROS 2 安装。
然后,从ros2_ws目录内部,运行以下命令来加载您的工作空间:
Linux:
$ source install/local_setup.bash现在您的工作空间已添加到路径中,您将能够使用新包的可执行文件。
4使用包
要运行您在包创建期间使用--node-name参数创建的可执行文件,输入命令:
$ ros2 run my_package my_node这将向您的终端返回一条消息:
Hi from my_package.5检查包内容
在ros2_ws/src/my_package内部,您将看到ros2 pkg create自动生成的文件和文件夹:
Python 包:
my_packagepackage.xmlresourcesetup.cfgsetup.pytestmy_node.py在my_package目录内。将来您所有自定义的 Python 节点都将放在这里。
6自定义 package.xml
您可能已经注意到,在创建包后的返回消息中,description和license字段包含TODO注释。这是因为包描述和许可证声明不是自动设置的,但如果您想发布包,它们是必需的。maintainer字段也可能需要填写。
从ros2_ws/src/my_package,使用您喜欢的文本编辑器打开package.xml:
Python 包:
<?xml version="1.0"?><?xml-modelhref="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><test_depend>ament_copyright</test_depend><test_depend>ament_flake8</test_depend><test_depend>ament_pep257</test_depend><test_depend>python3-pytest</test_depend><export><build_type>ament_python</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很简单,没有任何依赖项,但您将在接下来的教程中看到这个空间被利用。
Python 包:setup.py文件包含与package.xml相同的 description、maintainer 和 license 字段,因此您也需要设置这些字段。它们需要在两个文件中完全匹配。version 和 name(package_name)也需要完全匹配,并且应该自动填充在两个文件中。
用您喜欢的文本编辑器打开setup.py:
from setuptools import find_packages, setuppackage_name = 'my_py_pkg'setup(name=package_name,version='0.0.0',packages=find_packages(exclude=['test']),data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,maintainer='TODO',maintainer_email='TODO',description='TODO: Package description',license='TODO: License declaration',extras_require={'test': ['pytest'],},entry_points={'console_scripts': ['my_node = my_py_pkg.my_node:main'],},)编辑maintainer、maintainer_email和description行以匹配package.xml。
别忘了保存文件。
总结
您已经创建了一个包来组织您的代码,并使他人易于使用。您的包自动填充了必要的文件,然后您使用 colcon 构建它,以便在本地环境中使用其可执行文件。
后续步骤
接下来,让我们向包中添加一些有意义的内容。您将从一个简单的发布者/订阅者系统开始,您可以选择使用C++或Python编写。
本文档完整翻译自 ROS 2 Lyrical 官方文档,仅用于学习交流。
夜雨聆风