乐于分享
好东西不私藏

机器人系统——ROS2文档—创建包

机器人系统——ROS2文档—创建包

目标:使用 CMake  Python 创建一个新包,并运行其可执行文件。教程级别:入门级时间: 15 分钟

目录

  • 背景
    • 什么是 ROS 2 包?
    • 2 ROS 2 包由什么组成?
    • 工作空间中的包
  • 前置条件
  • 任务
    • 创建包
    • 构建包
    • 加载设置文件
    • 使用包
    • 检查包内容
    • 自定义 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工作空间中的包

单个工作空间可以包含任意数量的包,每个包在自己的文件夹中。您也可以在一个工作空间中包含不同构建类型的包(CMakePython 等)。您不能有嵌套的包。

最佳实践是在工作空间中有一个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 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_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source folder
creating folder ./my_package/my_package
creating ./my_package/setup.py
creating ./my_package/setup.cfg
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/my_package/__init__.py
creating folder ./my_package/test
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py
creating ./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_package

3加载设置文件

要使用您的新包和可执行文件,首先打开一个新终端并加载您的主 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.pytest

my_node.pymy_package目录内。将来您所有自定义的 Python 节点都将放在这里。

6自定义 package.xml

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

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

Python 包:

<?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>
<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相同的 descriptionmaintainer  license 字段,因此您也需要设置这些字段。它们需要在两个文件中完全匹配。version  namepackage_name)也需要完全匹配,并且应该自动填充在两个文件中。

用您喜欢的文本编辑器打开setup.py

from setuptools import find_packages, setup
package_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'
],
},
)

编辑maintainermaintainer_emaildescription行以匹配package.xml

别忘了保存文件。

总结

您已经创建了一个包来组织您的代码,并使他人易于使用。您的包自动填充了必要的文件,然后您使用 colcon 构建它,以便在本地环境中使用其可执行文件。

后续步骤

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

本文档完整翻译自 ROS 2 Lyrical 官方文档,仅用于学习交流。