创建您的第一个ROS 2包 [待校准@7117]
Goal目标: using使用CMake或Python创建一个新包,并运行其可执行文件。 [待校准@7118]
教程级别: 初学者 [Alyssa@7088]
时间: 15分钟 [Alyssa@6755]
内容
背景
1什么是ROS 2包? [待校准@7119]
包可以被视为ROS 2代码的容器。如果你想安装你的代码或者与其他人共享,那么你需要把它组织成一个包。有了包,你可以释放你的ROS 2工作,并允许其他人轻松构建和使用它。 [待校准@7120]
ROS 2中的包创建使用ament作为其构建系统,colcon作为其构建工具。您可以使用官方支持的CMake或Python创建包,尽管确实存在其他构建类型。 [待校准@7121]
2什么构成了ROS 2包? [待校准@7122]
ROS 2 Python和CMake包各有各自的最低要求内容: [待校准@7123]
包含包裹元信息的``package.xml`` file [待校准@7125]
描述如何在包中构建代码的``CMakeLists.txt`` file [待校准@7126]
包含包裹元信息的``package.xml`` file [待校准@7125]
[需手动修复的语法]``setup.py`` containing如何安装包装的说明 [待校准@7128]
setup.cfg
is required when a package has executables, soros2 run
can找到他们 [待校准@7129]/<package_name>
- a directory with the same name as your package, used by ROS 2 tools to find your package, contains__init__.py
[待校准@7130]
最简单的包可能具有如下所示的文件结构: [待校准@7131]
my_package/
CMakeLists.txt
package.xml
my_package/
setup.py
package.xml
resource/my_package
工作区中的3个包 [待校准@7132]
单个工作区可以包含任意数量的包,每个包都在自己的文件夹中。您还可以在一个工作区 (CMake、Python等) 中拥有不同构建类型的包。您不能有嵌套包。 [待校准@7133]
最佳实践是在你的工作空间里有一个 src
文件夹,并在那里创建你的包。这使工作区的顶层保持 “干净”。 [待校准@7134]
琐碎的工作区可能如下所示: [待校准@7135]
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/package_2
...
package_n/
CMakeLists.txt
package.xml
先决条件
按照 previous tutorial 中的说明操作后,您应该有一个ROS 2工作区。您将在此工作区中创建包。 [待校准@7136]
任务
1创建包
首先, sourc 你的ROS 2 安装空间 。 [小鱼@7138]
让我们为您的新包使用您在 previous tutorial, `` dev_ws ”中创建的工作区。 [待校准@7139]
在运行包创建命令之前,请确保您位于 src
文件夹中。 [待校准@7140]
cd ~/dev_ws/src
cd ~/dev_ws/src
cd \dev_ws\src
在ROS 2中创建新包的命令语法是:
ros2 pkg create --build-type ament_cmake <package_name>
ros2 pkg create --build-type ament_python <package_name>
在本教程中,您将使用可选参数 --node-name
,它在包中创建一个简单的Hello World类型可执行文件。 [待校准@7142]
在终端中输入以下命令: [待校准@7143]
ros2 pkg create --build-type ament_cmake --node-name my_node my_package
ros2 pkg create --build-type ament_python --node-name my_node my_package
现在,您将在工作区的 src
目录中有一个新文件夹,名字为 my_package
。 [小鱼@7144]
运行命令后,终端将返回以下消息: [待校准@7145]
going to create a new package
package name: my_package
destination directory: /home/user/dev_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/dev_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
您可以看到为新包自动调用y生成的文件。 [待校准@7146]
2构建一个包 [待校准@7147]
将包放入工作区特别有价值,因为您可以通过在工作区根目录下运行 colcon build
来同时构建多个包。否则,您将必须单独构建每个包。 [待校准@7148]
返回工作区的根目录: [待校准@7149]
cd ~/dev_ws
cd ~/dev_ws
cd \dev_ws
现在,您可以构建您的包: [待校准@7150]
colcon build
colcon build
colcon build --merge-install
Windows不允许长路径,因此 merge-install
会将所有路径合并到 install
目录中。
从上一个教程重新调用,你的 ros_tutorials
包也在你的 dev_ws
。你可能已经注意到运行 colcon build
也建立了 turtlesim
包。当你的工作空间里只有几个包的时候没关系,但是当有很多包的时候, colcon build
可能需要很长时间。 [待校准@7151]
要下次只构建 my_package
包,您可以运行: [待校准@7152]
colcon build --packages-select my_package
3电源安装文件 [待校准@7153]
要使用新的包和可执行文件,请首先打开一个新的终端,并为主ROS 2安装源文件。 [待校准@7154]
然后,在 dev_ws
目录中,运行以下命令来为您的工作区提供源文件: [待校准@7155]
. install/setup.bash
. install/setup.bash
call install/local_setup.bat
既然您的工作区已添加到路径中,您将能够使用新包的可执行文件。 [待校准@7156]
4使用包装 [待校准@7157]
要运行您在包创建期间使用 --node-name
参数创建的可执行文件,请输入以下命令: [待校准@7158]
ros2 run my_package my_node
它将向您的终端返回一条消息: [待校准@7159]
hello world my_package package
Hi from my_package.
5检查包装内容 [待校准@7160]
在 dev_ws/src/my_package
内部,您将看到 ros2 pkg create
自动调用y生成的文件和文件夹: [待校准@7161]
CMakeLists.txt include package.xml src
[需手动修复的语法]``my_node.cpp`` is inside the src
directory。这就是你所有的自定义c + + 节点在未来的去向。 [待校准@7162]
my_package package.xml resource setup.cfg setup.py test
[需手动修复的语法]``my_node.py`` is inside the my_package
directory。这就是将来所有自定义Python节点的去向。 [待校准@7163]
6自定义包.xml [待校准@7164]
创建包裹后,您可能已经在回复信息中注意到 description
和 license
字段包含 TODO
注释。这是因为包描述和许可证声明不是自动调用y集,但如果您想释放包,则是必需的。 maintainer
田地也可能需要填写。 [待校准@7165]
从 dev_ws/src/my_package
,使用您喜欢的文本编辑器打开 package.xml
: [待校准@7166]
<?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
,请在 maintainer
线上输入您的姓名和电子邮件。然后,编辑 description
行来总结包: [待校准@7167]
<description>Beginner client libraries tutorials practice package</description>
然后更新 license
线。你可以阅读更多关于开放源文件许可证 here 的信息。由于此软件包仅用于实践,因此使用任何许可证都是安全的。我们使用 Apache License 2.0
: [待校准@7168]
<license>Apache License 2.0</license>
完成编辑后,不要忘记保存。 [待校准@7169]
在许可证标签下面,你会看到一些以 _depend
结尾的标签名称。这是你的 package.xml
列出它对其他包的依赖的地方,供colcon搜索。 my_package
很简单,没有任何依赖关系,但是你会在即将到来的教程中看到这个空间。 [待校准@7170]
你们现在都完了! [待校准@7171]
[需手动修复的语法] setup.py
文件包含与 package.xml
相同的描述、维护者和许可字段,因此您也需要设置它们。它们需要在两个文件中完全匹配。版本和名称 ( package_name
) 也需要精确匹配,并且应该自动调用y填充在两个文件中。 [待校准@7172]
使用您喜欢的文本编辑器打开 setup.py
。 [待校准@7173]
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
。 [待校准@7174]
不要忘记保存文件。 [待校准@7175]
总结
您已经创建了一个包来组织您的代码,并使其易于他人使用。 [待校准@7176]
您的包被自动调用y填充了必要的文件,然后您使用colcon构建它,以便您可以在本地环境中使用其可执行文件。 [待校准@7177]
下一步
接下来,让我们向包中添加一些有意义的内容。你将从一个简单的出版商/订阅者系统开始,你可以选择用 C++ or Python 写。 [待校准@7178]