创建软件包
目标 使用 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
文件,其中包含软件包的元信息来源
目录中包含软件包的源代码
package.xml
文件,其中包含软件包的元信息resource/<package_name>;
软件包的标记文件setup.cfg
当软件包有可执行文件时,需要玫瑰2 运行
能找到它们setup.py
包含如何安装软件包的说明<package_name>;
- 与软件包同名的目录,用于 ROS 2 工具查找软件包,包含__init__.py
最简单的软件包的文件结构可能是这样的
my_package/
CMakeLists.txt
include/my_package/
package.xml
源代码
my_package/
package.xml
resource/my_package
setup.cfg
setup.py
my_package/
工作区中的 3 个软件包
一个工作区可以包含任意数量的软件包,每个软件包都有自己的文件夹。您也可以在一个工作区中包含不同构建类型的软件包(CMake、Python 等)。但不能嵌套软件包。
最佳做法是 来源
文件夹,并在其中创建软件包。这样可以保持工作区顶层的 "干净"。
一个琐碎的工作区可能是这样的
工作空间文件夹/
源代码
cpp_package_1/
CMakeLists.txt
include/cpp_package_1/
package.xml
源代码
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
源代码
先决条件
中的说明后,您就应该拥有一个 ROS 2 工作区了。 上一个教程.您将在此工作区创建软件包。
任务
1 创建软件包
首先是 为您的 ROS 2 安装提供源代码.
让我们使用在 上一个教程, ros2_ws
您的新套餐。
确保您在 来源
文件夹,然后再运行软件包创建命令。
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 <软件包名称>;
ros2 pkg create --build-type ament_python --license Apache-2.0 <软件包名称>;
在本教程中,您将使用以下可选参数 --节点名
和 --许可证
.
--节点名
选项会在软件包中创建一个简单的 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
现在,您将在工作区的 来源
名为 我的包
.
运行该命令后,终端将返回信息:
创建一个新软件包
软件包名称: my_package
目标目录:/home/user/ros2_ws/src
包装格式:3
版本: 0.0.0
描述:TODO: 软件包描述
维护者:['<name> <email>']
许可证:['Apache-2.0']
构建类型: ament_cmake
依赖项:[]
节点名称: my_node
创建文件夹 ./my_package
创建 ./my_package/package.xml
创建源代码和 include 文件夹
创建文件夹 ./my_package/src
创建文件夹 ./my_package/include/my_package
创建 ./my_package/CMakeLists.txt
创建 ./my_package/src/my_node.cpp
创建一个新软件包
软件包名称: my_package
目标目录:/home/user/ros2_ws/src
包装格式:3
版本: 0.0.0
描述:TODO: 软件包描述
维护者:['<name> <email>']
许可证:['Apache-2.0']
构建类型: ament_python
依赖项:[]
节点名称: my_node
创建文件夹 ./my_package
创建 ./my_package/package.xml
创建源文件夹
创建文件夹 ./my_package/my_package
创建 ./my_package/setup.py
创建 ./my_package/setup.cfg
创建文件夹 ./my_package/resource
创建 ./my_package/resource/my_package
创建 ./my_package/my_package/__init__.py
创建文件夹 ./my_package/test
创建 ./my_package/test/test_copyright.py
创建 ./my_package/test/test_flake8.py
创建 ./my_package/test/test_pep257.py
创建 ./my_package/my_package/my_node.py
您可以看到为新软件包自动生成的文件。
2 构建软件包
将软件包放在工作区中尤为重要,因为通过运行 胶管 构建
在工作区根目录下。否则,您必须单独构建每个软件包。
返回工作区的根目录:
cd ~/ros2_ws
cd ~/ros2_ws
cd \ros2_ws
现在,您可以构建软件包了:
Colcon build
Colcon build
colcon build --merge-install
Windows 不允许使用长路径,因此 合并安装
会将所有路径合并到 安装
目录。
记得在上一个教程中,您还使用了 教程
软件包中的 ros2_ws
.您可能已经注意到,运行 胶管 构建
还建造了 海龟
包。当工作区中只有几个软件包时,这样做还可以,但当有很多软件包时就不行了、 胶管 构建
可能需要很长时间。
只建立 我的包
下一次,你可以跑了:
colcon build --packages-select my_package
3 源设置文件
要使用新软件包和可执行文件,首先要打开一个新终端,并将 ROS 2 的主安装程序作为源代码。
然后,从 ros2_ws
目录下,运行以下命令来获取工作区的源代码:
source install/local_setup.bash
install/local_setup.bash
调用 install/local_setup.bat
现在工作区已添加到路径中,您就可以使用新软件包的可执行文件了。
4 使用软件包
要运行使用 --节点名
参数,输入命令:
ros2 run my_package my_node
将向终端返回一条信息:
hello world my_package 软件包
你好,来自 my_package。
5 检查包装内容
内部 ros2_ws/src/my_package
您将看到以下文件和文件夹 玫瑰2 包 创建
自动生成:
CMakeLists.txt include package.xml src
my_node.cpp
在 来源
目录。今后,所有自定义 C++ 节点都将放在这里。
my_package package.xml resource setup.cfg setup.py test
my_node.py
在 我的包
目录。今后,您的所有自定义 Python 节点都将放在这里。
6 自定义 package.xml
您可能已经注意到,在创建软件包后的返回信息中,字段 描述
和 许可
蕴含 TODO
注释。这是因为软件包说明和许可证声明不是自动设置的,但如果要发布软件包,则必须设置。软件包说明 维护者
字段也可能需要填写。
来自 ros2_ws/src/my_package
开放 package.xml
使用您喜欢的文本编辑器:
<?xml版本="1.0"?>;
<?xml-model
href="http://download.ros.org/schema/package_format3.xsd";
schematypens="http://www.w3.org/2001/XMLSchema"?>;
<package 格式="3";>;
<名称>;我的包</名称>;
版本>;0.0.0</version>;
<描述>;TODO: 包装 描述</description>;
维护者 电子邮件="[email protected]";>;用户维护人员</maintainer>;
许可证TODO: 许可证 宣言</license>;
构建工具的依赖关系<buildtool_depend>;ament_cmake</buildtool_depend>;
<test_depend>;自动</test_depend>;
<test_depend>;ament_lint_common</test_depend>;
<export>;
<构建类型>;ament_cmake</build_type>;
</export>;
</package>;
<?xml版本="1.0"?>;
<?xml-model
href="http://download.ros.org/schema/package_format3.xsd";
schematypens="http://www.w3.org/2001/XMLSchema"?>;
<package 格式="3";>;
<名称>;我的包</名称>;
版本>;0.0.0</version>;
<描述>;TODO: 包装 描述</description>;
维护者 电子邮件="[email protected]";>;用户维护人员</maintainer>;
许可证TODO: 许可证 宣言</license>;
<test_depend>;版权</test_depend>;
<test_depend>;ament_flake8</test_depend>;
<test_depend>;ament_pep257</test_depend>;
<test_depend>;python3-pytest</test_depend>;
<export>;
<构建类型>;ament_python</build_type>;
</export>;
</package>;
在 维护者
行,如果该行尚未自动填入。然后,编辑 描述
行来概述软件包:
<描述>;初学者 客户 图书馆 教程 练习 包装</description>;
然后,更新 许可
行。您可以阅读更多有关开放源代码许可的信息 这里.由于本软件包仅用于练习,因此使用任何许可证都是安全的。我们将使用 Apache-2.0
:
许可证Apache-2.0</license>;
编辑完成后,别忘了保存。
在许可证标记下方,您会看到一些标记名称以 依赖
.这就是您的 package.xml
会列出它与其他软件包的依赖关系,供 colcon 搜索。
我的包
很简单,没有任何依赖关系,但在接下来的教程中,你会看到这个空间的使用。
你们的任务暂时完成了!
"(《世界人权宣言》) setup.py
文件包含的描述、维护者和许可证字段与 package.xml
因此也需要进行设置。这两个文件必须完全匹配。版本和名称 (包名
) 也需要完全匹配,并应在两个文件中自动填充。
开放 setup.py
使用您喜欢的文本编辑器。
从 设置工具 舶来品 查找软件包, 设置
包名 = 'my_py_pkg';
设置(
名字=包名,
版本='0.0.0',
套餐=查找软件包(排除=['测试';]),
数据文件=[
('share/ament_index/resource_index/packages';,
['资源/'; + 包名]),
('分享/'; + 包名, ['package.xml';]),
],
安装要求=['setuptools';],
zip_safe=正确,
维护者='TODO';,
维护者电子邮件='TODO';,
描述='TODO:软件包描述';,
许可='TODO:许可证声明';,
测试要求=['pytest';],
入口={
'console_scripts';: [
'my_node = my_py_pkg.my_node:main';
],
},
)
编辑 维护者
, 维护者电子邮件
和 描述
行进行匹配 package.xml
.
别忘了保存文件。
摘要
您创建了一个软件包来组织您的代码,并使其便于他人使用。
您的软件包已自动填充了必要的文件,然后您可以使用 colcon 构建它,以便在本地环境中使用其可执行文件。
下一步工作
接下来,让我们为软件包添加一些有意义的内容。您将从一个简单的发布者/订阅者系统开始,您可以选择用以下两种语言编写该系统 C++ 或 Python.