【ROS2指南-11】创建ROS2功能包

目标:使用 CMake 或 Python 创建一个新包,并运行其可执行文件。

教程级别:初学者

时间: 15分钟

背景

1 什么是 ROS 2 包?

一个包可以被认为是你的 ROS 2 代码的容器。如果您希望能够安装您的代码或与他人共享,那么您需要将其组织在一个包中。借助软件包,您可以发布您的 ROS 2 作品并允许其他人轻松构建和使用它。

ROS 2 中使用 ament 作为包编译构建系统,并使用 colcon 作为其构建工具。您可以使用官方支持的 CMake 或 Python 创建包,也有其他创建方式。

2 什么构成了 ROS 2 包?

ROS 2 Python 和 CMake 包都有自己的最低要求内容:

  • package.xml 包含有关包的元信息的文件

  • CMakeLists.txt 描述如何在包中构建代码的文件

最简单的包可能具有如下所示的文件结构:

my_package/
     CMakeLists.txt
     package.xml

3 工作区中的包

一个工作区可以包含任意数量的包,每个包都在自己的文件夹中。您还可以在一个工作区(CMake、Python 等)中包含不同构建类型的包。但不能有嵌套的包!

最佳做法是在您的工作区中有一个src文件夹,并在其中创建您的包。这会使工作区的顶层保持“干净”。

一个普通的工作区可能看起来像:

workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/package_2
      ...
      package_n/
          CMakeLists.txt
          package.xml

先决条件

按照上一教程中的说明进行操作后,您应该拥有一个 ROS 2 工作区。您将在此工作区中创建包。

任务

1 创建一个包

首先,记得先 source 你的ros2环境变量。

这里使用上一章节创建的 dev_ws 工作空间。

在运行包创建命令之前,请确保您位于该文件夹中。

cd ~/dev_ws/src

在 ROS 2 中创建新包的命令语法是:

ros2 pkg create --build-type ament_cmake <package_name>

对于本教程,您将使用可选参数 --node-name 在包中创建一个简单的 Hello World 类型可执行文件。

在您的终端中输入以下命令:

ros2 pkg create --build-type ament_cmake --node-name my_node my_package

现在,您的工作区目录中将有一个名为 my_package 的文件夹.

运行命令后,终端将返回信息:

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

您可以看到为新包自动生成的文件。

2 构建一个包

将包放在工作区中特别有价值,因为您可以通过在工作区根目录中运行来一次构建许多包。否则,您将不得不单独构建每个包。

返回到工作区的根目录:

cd ~/dev_ws

现在你可以构建你的包了:

colcon build

回想一下上一教程,ros_tutorials 也在 dev_ws 中。您可能已经注意到也运行构建了这个包。当您的工作区中只有几个包时,这很好,但是当有很多包时,可能会花费很长时间。

下次只构建包 my_package ,你可以运行:

colcon build --packages-select my_package

3 获取安装文件

要使用您的新包和可执行文件,首先打开一个新终端并source 你的 ros2 源。

然后,从 dev_ws 目录内部运行以下命令来获取您的工作区:

. install/setup.bash

现在您的工作区已添加到您的路径中,您将能够使用新包的可执行文件。

4 使用包

要运行您在包创建期间使用参数创建的可执行文件--node-name,请输入命令:

ros2 run my_package my_node

这将向您的终端返回一条消息:

hello world my_package package

5 检查包装内容

dev_ws/src/my_package 里面,你会看到自动生成的文件和文件夹:

CMakeLists.txt  include  package.xml  src

my_node.cppsrc目录内。这是您所有自定义 C++ 节点将来的位置。

6 自定义 package.xml

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

使用您喜欢的文本编辑器打开 dev_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="cas5144@163.com">rust</maintainer>
  <license>Apache License 2.0</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>

如果尚未自动为您填充,请在第 7 行输入您的姓名和电子邮件。然后,编辑第 6 行的描述以总结包:

<description>Beginner client libraries tutorials practice package</description>

然后,在第 8 行更新许可证。您可以在此处阅读有关开源许可证的更多信息。

由于此包仅用于练习,因此使用任何许可证都是安全的。我们使用:Apache License 2.0

<license>Apache License 2.0</license>

完成编辑后不要忘记保存。

在许可证标签下方,您会看到一些以 . 结尾的标签名称_depend。这是您package.xml将列出它对其他包的依赖项的地方,供 colcon 搜索。my_package很简单,没有任何依赖关系,但您会在接下来的教程中看到这个标签的使用。

你现在已经完成了!

概括

您已经创建了一个包来组织您的代码并使其易于为他人使用。

您的包会自动填充必要的文件,然后您使用 colcon 构建它,以便您可以在本地环境中使用它的可执行文件。

下一步

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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值