创建包
目标:使用 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 packageinclude/<package_name>
directory containing the public headers for the packagepackage.xml
file containing meta information about the packagesrc
directory containing the source code for the package
package.xml
file containing meta information about the packageresource/<package_name>
marker file for the packagesetup.cfg
is required when a package has executables, soros2 run
can find themsetup.py
containing instructions for how to install the package<package_name>
- a directory with the same name as your package, used by ROS 2 tools to find your package, contains__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。
让我们将您在 上一个教程 中创建的工作区 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”和“–license”。 “–node-name”选项在包中创建一个简单的 Hello World 类型可执行文件,“–license”声明包的许可证信息。
在终端中输入以下命令:
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: ['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
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”一次构建多个包。 否则,您必须单独构建每个包。
返回工作区的根目录:
cd ~/ros2_ws
cd ~/ros2_ws
cd \ros2_ws
现在您可以构建您的包:
colcon build
colcon build
colcon build --merge-install
Windows doesn’t allow long paths, so merge-install
will combine all the paths into the install
directory.
回想一下上一个教程,您的“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 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>
<?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”很简单,没有任何依赖关系,但您将在后续教程中看到此空间的使用。
You’re all done for now!
“setup.py” 文件包含与“package.xml” 相同的描述、维护者和许可证字段,因此您也需要设置这些字段。 它们需要在两个文件中完全匹配。 版本和名称(“package_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',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_py_pkg.my_node:main'
],
},
)
编辑 maintainer
、maintainer_email
和 description
行以匹配 package.xml
。
不要忘记保存文件。
摘要
您已创建了一个包来组织您的代码并使其易于他人使用。
您的包已自动填充必要的文件,然后您使用 colcon 构建它,以便您可以在本地环境中使用其可执行文件。
后续步骤
接下来,让我们向包中添加一些有意义的内容。 您将从一个简单的发布者/订阅者系统开始,您可以选择使用 C++ 或 Python 编写。