警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

快速打包 ROS 2 应用程序 [社区贡献]

什么是卡扣?

卡扣 是捆绑应用程序及其所有依赖项的容器。它们提供了多种功能,可解决在机器人平台交付过程中遇到的重要问题:

  • 容器解决方案:Snaps 将您的应用程序与所有必要的依赖项(包括 ROS 2)和资产捆绑在一个软件包中。这样,您的应用程序就可以轻松地安装在数十种 Linux 发行版上,而且可以跨发行版安装。

  • 严格监禁:卡扣设计用于 安全隔绝 从底层系统和其他应用程序中 专用接口 来访问主机。

  • 管理更新:快照可以更新 自动和交易确保您的机器人永不损坏并始终保持最新。

  • 发布管理:快照 多种发布渠道 您可以使用基于角色的访问控制和应用程序版本控制,从而轻松进行 A/B 测试,更快地发布修复程序。

创建快照

本教程将演示如何使用 snapcraft 将 ROS 2 应用程序打包为快照,以及如何使用它。

首先,让我们安装 snapcraft。

苏都  安装 --经典 snapcraft

(请注意,apt 软件仓库中的 snapcraft debian 软件包已基本过时。应使用 snap 软件包)。

Snapcraft 内置支持 科尔康.

在示例中,您将使用 演示节点 软件包中的 ros2_demos.

在此初始化一个新的 snapcraft 项目:

mkdir ~/demo_nodes_cpp_snap
CD ~/demo_nodes_cpp_snap snapcraft 启动

这将在子目录中创建一个文件 snap/snapcraft.yaml.

snapcraft 文件

打开新创建的 snap/snapcraft.yaml 文件,并复制以下内容:

名字: ros2-talker-listener
版本: '0.1'
摘要: ROS 2 通话器/监听器示例
描述: |
  该示例启动了 ROS 2 通话器和监听器。

监禁: devmode
基础: 核心 20

部件:
  ros-演示:
    插头: 胶管
    消息来源: https://github.com/ros2/demos.git
    源分支: 狐狸
    包装: [演示节点]
    构建包: [生产, gcc, g++]
    阶段包: [ros-foxy-ros2launch]

应用程序:
  ros2-talker-listener:
    指挥部: opt/ros/foxy/bin/ros2 launch demo_nodes_cpp talker_listener.launch.py
    扩展: [ros2-foxy]

让我们来分析一下。

元数据

名字: ros2-talker-listener
版本: '0.1'
摘要: ROS 2 通话器/监听器示例
描述: |
  该示例启动了 ROS 2 通话器和监听器。

这是基本的 元数据 是所有嗅探针都需要的。这些字段不言自明,但要注意的是,名称必须在所有 Snap 中都是全局唯一的。

基地

基础: 核心 20

"(《世界人权宣言》) 基础 关键字定义了一种特殊的 snap,它提供了一个运行时环境,其中包含一组大多数应用程序通用的最小库。 核心 20 是当前扣件建筑的标准基础,其依据是 Ubuntu 20.04 LTS.因此,它是狐狸的基础。

安全模式

监禁: devmode

开始时,您不会限制此应用程序。未限制的应用程序用 devmode只能向 边缘 的 snapcraft 商店频道。有关 snapaps 安全模式的更多信息,请参阅 在线文档.

部件

部件:
  ros-演示:
    插头: 胶管
    消息来源: https://github.com/ros2/demos.git
    源分支: 狐狸
    包装: [演示节点]
    构建包: [生产, gcc, g++]
    阶段包: [ros-foxy-ros2launch]

部件定义了如何构建应用程序。在本例中,您有一个: ros-演示.部件可以指向本地目录、远程 git 仓库或压缩包。在这里,您需要将源代码指定为某个分支的 GitHub 仓库。您还特别告诉 科尔康 以建立 演示节点 软件包。此外,您还可以告诉 snapcraft 如下软件包 生产 在构建时是必要的,而软件包 ros-foxy-ros2launch 在运行时是必要的。有关插件及其选项的更多信息,请参考 在线文档.

应用程序

应用程序:
  ros2-talker-listener:
    指挥部: opt/ros/foxy/bin/ros2 launch demo_nodes_cpp talker_listener.launch.py
    扩展: [ros2-foxy]

应用程序是面向最终用户的命令。应用程序下的每个键都是应在用户系统上提供的命令名称。命令名称 指挥部 关键字指定要运行的命令,如其名称所示。最后,扩展 ros2-foxy 主要是设置 ROS 2 apt 软件包库和必要的环境变量。

构建扣件

现在,一切准备就绪,让我们开始制作快照吧:

CD ~/demo_nodes_cpp_snap snapcraft --启用实验扩展功能

给予:

*EXPERIMENTAL* 扩展 启用。启动 a 虚拟机。已启动: snapcraft-ros2-talker-listener
[...] 部分  失踪 图书馆  不能  满足  任何 可用 阶段包 已知  snapcraft: libnddsc.so libnddscore.so libnddscpp.so librosidl_typesupport_connext_c.so librosidl_typesupport_connext_cpp.so librticonnextmsgcpp.so 已抢购 ros2-talker-listener_0.1_amd64.snap

备注

关于缺少库的警告是误报。这些库只是构建时的依赖项。今后发布的 snapcraft.

这需要几分钟时间。从日志中可以看到 snapcraft 正在使用 rosdep 为您的示例调用依赖项,但也要 科尔康 建立应用程序。

测试卡扣

这个 snap 是完全独立的:它包括 ROS 2 和你的应用程序,这意味着你甚至不需要在主机系统上安装 ROS 2。让我们来测试一下:

苏都  安装 ros2-talker-listener_0.1_amd64.snap --devmode

请注意,您使用 --devmode 在这里,因为快速限制被设置为 devmode.关键时刻,它会跑吗?

ros2-talker-listener
[脱口秀-1] [信息] [1646934735.523191674] [话匣子]: 出版: '你好,世界: 1';
[听众-2] [信息] [1646934735.524428480] [听众]: I 听说: [您好 世界: 1]
[脱口秀-1] [信息] [1646934736.523025881] [话匣子]: 出版: '你好,世界: 2';
[听众-2] [信息] [1646934736.523614075] [听众]: I 听说: [您好 世界: 2]

确实如此!你会看到预期的输出结果!

您可以在 snapcraft 文档ROS 2 快速页面.