创建包
目标: 使用 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
文件,描述如何在包内构建代码include/<package_name>
目录,包含包的公共标头package.xml
文件,包含有关包的元信息src
目录,包含包的源代码
package.xml
文件包含有关包的元信息resource/<package_name>
包的标记文件当包有可执行文件时,需要
setup.cfg
,以便ros2 run
可以找到它们setup.py
包含有关如何安装包的说明<package_name>
- 与您的包同名的目录,ROS 2 工具使用它来查找您的包,包含__init__.py
最简单的包可能具有如下文件结构:
my_package/
CMakeLists.txt
include/my_package/
package.xml
src/
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 创建包
首先,source your ROS 2 installation。
让我们将您在 previous tutorial 中创建的工作区 ros2_ws
用于您的新包。
在运行包创建命令之前,请确保您位于 src
文件夹中。
cd ~/ros2_ws/src
cd ~/ros2_ws/src
cd \ros2_ws\src
在 ROS 2 中创建新包的命令语法是:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>
ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>
对于本教程,您将使用可选参数“–node-name”,它在包中创建一个简单的 Hello World 类型可执行文件。
在您的终端中输入以下命令:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
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: ['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
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: ['TODO: License declaration']
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”一次构建多个包。 否则,您必须单独构建每个包。
返回工作区的根目录:
cd ~/ros2_ws
cd ~/ros2_ws
cd \ros2_ws
现在您可以构建您的包:
colcon build
colcon build
colcon build --merge-install
Windows 不允许长路径,因此“merge-install”会将所有路径合并到“install”目录中。
回想一下上一个教程,您的“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
. install/local_setup.bash
call install/local_setup.bat
现在您的工作区已添加到路径中,您将能够使用新包的可执行文件。
4 使用包
要运行您在包创建期间使用“–node-name”参数创建的可执行文件,请输入以下命令:
ros2 run my_package my_node
这将向您的终端返回一条消息:
hello world my_package package
Hi from my_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++ 节点将来要去的地方。
my_package package.xml resource setup.cfg setup.py test
my_node.py
is inside the my_package
directory.
这是您所有自定义 Python 节点将来要去的地方。
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="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>
<?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 License 2.0
:
<license>Apache License 2.0</license>
编辑完成后,别忘了保存。
在许可标签下方,您将看到一些以“_depend”结尾的标签名称。 这是您的“package.xml”将列出其对其他包的依赖关系的地方,供 colcon 搜索。 “my_package”很简单,没有任何依赖关系,但您将在后续教程中看到此空间的使用。
You’re all done for now!
“setup.py” 文件包含与“package.xml” 相同的描述、维护者和许可证字段,因此您也需要设置这些字段。 它们需要在两个文件中完全匹配。 版本和名称(“package_name”)也需要完全匹配,并且应该自动填充在两个文件中。
使用您喜欢的文本编辑器打开“setup.py”。
from setuptools import setup
package_name = 'my_py_pkg'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
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',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_py_pkg.my_node:main'
],
},
)
编辑“maintainer”、“maintainer_email”和“description”行以匹配“package.xml”。
不要忘记保存文件。
摘要
您已创建了一个包来组织您的代码,以便其他人轻松使用。
您的包已自动填充了必要的文件,然后您使用 colcon 构建了它,以便您可以在本地环境中使用其可执行文件。
后续步骤
接下来,让我们向包中添加一些有意义的内容。 您将从一个简单的发布者/订阅者系统开始,您可以选择使用 C++ 或 Python 编写。