警告

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

IBM 云 Kubernetes 上的 ROS2 [社区贡献]

关于

本文介绍如何使用 Docker 文件在 IBM 云上运行 ROS2。文章首先简要介绍了 docker 映像及其在本地的工作方式,然后探讨了 IBM 云以及用户如何在其上部署容器。然后,简要介绍了用户如何在 IBM 云上使用自己从 github 上定制的 ROS2 软件包。此外,还将介绍如何在 IBM Cloud 上创建集群和使用 Kubernetes,最后在集群上部署 Docker 映像。最初发布 这里这里.

IBM 云上的 ROS2

在本教程中,我们将展示如何在 IBM Cloud 上轻松集成和运行 ROS2 与您的自定义软件包。

ROS2 是新一代的 ROS,可对多机器人编队进行更多控制。随着云计算的发展,云机器人技术在当今时代变得越来越重要。在本教程中,我们将简要介绍如何在 IBM 云上运行 ROS2。教程结束时,您将能够在 ROS2 中创建自己的软件包,并使用 docker 文件将它们部署到云上。

以下说明假定您使用的是 Linux,并已在 Ubuntu 18.04 (Bionic Beaver) 上进行了测试。

步骤 1:设置系统

在了解具体流程之前,我们首先要确保所有必要的软件都已正确安装。我们将为您提供适当的资源来设置您的系统,并只强调与我们的使用案例相关的细节。

a) Docker 文件?

Docker 文件是一种可以独立于系统运行的容器形式,通过这种方式,你可以建立数百个不同的项目,而不会相互影响。你甚至可以在一台机器上设置不同版本的 Linux,而无需使用虚拟机。Docker 文件的优势在于节省空间,运行时只占用系统资源。此外,Docker 还具有通用性和可移植性。它们包含了单独运行所需的所有先决条件,这意味着你可以轻松地将一个 docker 文件用于特定的系统或服务,而无需任何其他步骤!

兴奋了吗?首先,让我们按照以下步骤在系统中安装 docker 链接.在教程中,你应该已经做了一些合理性检查,以确保 docker 设置正确。不过,为了以防万一,让我们再次运行以下使用 hello-world docker 镜像的命令:

$ 苏都 装卸工 运行 你好世界

输出结果如下

您好  Docker!这 信息 显示  您的 安装 出现   工作 正确。要 生成  留言 Docker 采取了  接下来 步骤:
 1. "(《世界人权宣言》) Docker 客户 有联系  Docker 守护进程。
 2. "(《世界人权宣言》) Docker 守护进程 拉绳  "hello-world"; 图像   Docker 枢纽。
    (amd64)
 3. "(《世界人权宣言》) Docker 守护进程 创建 a  集装箱   图像 其中 运行     可执行  生产  产量   目前 阅读。
 4. "(《世界人权宣言》) Docker 守护进程 串流  产量   Docker 客户、 其中 发送      您的 终端。至 尝试 什么 更多 雄心勃勃、   运行 一个 乌班图 集装箱 用:
 $ 装卸工 运行 -它 乌托邦 bash 共享 图像 自动 工作流程、  更多  a 免费的 Docker ID:
 https://hub.docker.com/ For 更多 例子  想法 访问:
 https://docs.docker.com/get-started/

b) ROS2 图像

ROS 宣布 2019年1月,ROS2将发布用于多个ROS发行版的镜像容器。有关 ROS2 docker 映像使用的更多详细说明,请参见 这里.

让我们跳过这些,直接进入正题:创建本地 ROS2 docker。我们将创建自己的 Dockerfile(而不是使用现成的映像),因为我们需要用这种方法在 IBM 云上进行部署。首先,我们创建一个新目录,用来存放我们的 Dockerfile 和其他我们稍后需要的文件,然后导航到该目录。使用你喜欢的编辑器,打开一个名为 Dockerfile (确保文件命名正确):

$ mkdir ~/ros2_docker $ CD ~/ros2_docker $ 编辑 Dockerfile

Dockerfile并保存它(也可以找到 这里):

 ros:foxy

# 安装 ros 软件包
运行 apt-get 更新 &&; apt-get 安装 -y \
      ${罗斯_迪斯特罗}-demo-nodes-cpp \
      ${罗斯_迪斯特罗}-demo-nodes-py &&; \
    rm -rf /var/lib/apt/lists/* &&; mkdir /ros2_home 工作目录 /ros2_home

# 启动 ros 软件包
CMD ["ros2";, "launch";, "demo_nodes_cpp";, "talker_listener.launch.py";]
  • :从 ros:foxy Docker 镜像中创建一个层

  • 运行:在容器中安装 vim 并创建名为 /ros2_home 的目录,从而构建容器

  • 工作目录通知容器它的工作目录在哪里

当然,您也可以自由更改 ROS 的发行版 (狐狸 或更改目录名。上面的 docker 文件设置了 ROS-foxy,并安装了 C++ 和 Python 的演示节点。然后,它会启动一个文件,运行一个对话者(talker)和一个监听者(listener)节点。我们很快就会看到它们的运行,但它们的行为与《ROS-foxy》中的 "发布者-订阅者"(publisher-subscriber)示例非常相似。 ROS 维基百科

现在,我们准备好构建 docker 镜像,在其中运行 ROS2(没错,就是这么简单!)。

备注如果由于权限不足或以下原因导致错误 拒绝批准运行该命令时,请尝试使用 苏都 特权:

$ 装卸工 构建 .

# 你会看到一大堆执行 docker 文件指令的行,后面还有:
成功 建成 0dc6ce7cb487

0dc6ce7cb487 对你来说很可能会有所不同,所以请记录下来并复制到某个地方作为参考。你可以随时回头检查你系统中的 docker 镜像:

$ 苏都 装卸工 ps -作为

现在,使用

$ 装卸工 运行 -它 0dc6ce7cb487
[信息] [启动]: 全部 登录 文件   发现 低于 /root/.ros/log/2020-10-28-02-41-45-177546-0b5d9ed123be-1
[信息] [启动]: 默认值 伐木 冗语  设置  信息
[信息] [脱口秀-1]: 处理 开始  pid [28]
[信息] [听众-2]: 处理 开始  pid [30]
[脱口秀-1] [信息] [1603852907.249886590] [话匣子]: 出版: '你好,世界: 1';
[听众-2] [信息] [1603852907.250964490] [听众]: I 听说: [您好 世界: 1]
[脱口秀-1] [信息] [1603852908.249786312] [话匣子]: 出版: '你好,世界: 2';
[听众-2] [信息] [1603852908.250453386] [听众]: I 听说: [您好 世界: 2]
[脱口秀-1] [信息] [1603852909.249882257] [话匣子]: 出版: '你好,世界: 3';
[听众-2] [信息] [1603852909.250536089] [听众]: I 听说: [您好 世界: 3]
[脱口秀-1] [信息] [1603852910.249845718] [话匣子]: 出版: '你好,世界: 4';
[听众-2] [信息] [1603852910.250509355] [听众]: I 听说: [您好 世界: 4]
[脱口秀-1] [信息] [1603852911.249506058] [话匣子]: 出版: '你好,世界: 5';
[听众-2] [信息] [1603852911.250152324] [听众]: I 听说: [您好 世界: 5]
[脱口秀-1] [信息] [1603852912.249556670] [话匣子]: 出版: '你好,世界: 6';
[听众-2] [信息] [1603852912.250212678] [听众]: I 听说: [您好 世界: 6]

如果运行正常,就会看到与上图类似的内容。可以看到,有两个 ROS 节点(一个发布者和一个订阅者)正在运行,它们的输出通过 ROS INFO 提供给我们。

步骤 2:在 IBM 云上运行映像

以下步骤假定您已拥有 IBM 云帐户并安装了 ibmcloud CLI。如果没有,请检查此 链接 先把这件事做完。

我们还需要确保 IBM 云容器注册表的 CLI 插件已安装,方法是运行命令

$  插头 安装 容器注册表

然后,通过终端登录您的 ibmcloud 账户:

$  登录 --苏

从这里开始,让我们创建一个容器注册表命名空间。确保使用一个唯一的名称,同时也能描述它是什么。在这里,我使用了 ros2nasr.

$  cr 命名空间添加 ros2nasr

IBM 云有很多快捷方式,可以帮助我们立即将容器放到云上。下面的命令将构建容器并为其标记名称 ros2foxy 的版本,以及 1.请确保使用您创建的正确注册表名称,您也可以随意更改容器名称。容器名称 . 末尾的 Dockerfile 是在当前目录下(这很重要),如果不是,则应将其指向包含 Dockerfile 的目录。

$  cr 构建 --标签 registry.bluemix.net/ros2nasr/ros2foxy:1 .

现在,您可以通过运行以下命令来确保容器已被推送到您创建的注册表中

$  cr 图像列表 图像...资料库               标签   摘要         名称空间   创建         尺寸     安全 状态 us.icr.io/ros2nasr/ros2foxy   1     031be29301e6   ros2nasr    36 秒钟    120 MB   没有 问题 OK

接下来,登录注册表来运行 docker 镜像就很重要了。同样,如果你遇到 拒绝批准 错误,请使用 sudo previliges 执行命令。然后,按下图所示运行你的 docker 文件。

$  cr 登录 登录   'registry.ng.bluemix.net';...登录   'registry.ng.bluemix.net';.记录   'us.icr.io';...登录   'us.icr.io';.OK $ 装卸工 运行 -v -它 registry.ng.bluemix.net/ros2nasr/ros2foxy:1

地点 ros2nasr 是您创建的注册表的名称,而 ros2foxy:1 是 docker 容器的标签,版本如前所述。

现在,你应该能看到你的 docker 文件正在运行,并提供与你在本机运行时类似的输出。

步骤 3:使用自定义 ROS2 软件包

现在,我们已经拥有了从创建 Dockerfile 到部署并在 IBM Cloud 上运行的完整管道。但是,如果我们想使用自己(或其他人)创建的一组自定义软件包,该怎么办呢?

这一切都与你如何设置 Dockerfile 有关。让我们使用 ROS2 提供的示例 这里.创建一个包含新 Dockerfile 的新目录(或覆盖现有目录),并在其中添加以下内容(或下载文件 这里)

ARG 从图像=ros:foxy ARG OVERLAY_WS=/opt/ros/overlay_ws

# 多级缓存 $FROM_IMAGE AS 传授者

# 克隆覆盖源
ARG 工作目录 $OVERLAY_WS/src RUN 回响 "\
repositories:\n\
  ros2/demos:\n\
    type: git\n\
    url: https://github.com/ros2/demos.git\n\
    版本: ${罗斯_迪斯特罗} \n\
"; >; ./overlay.repos RUN vcs 舶来品 ./ <; ./overlay.repos

# 复制清单以便缓存
工作目录 /opt RUN mkdir -p /tmp/opt &&; \
    找到 ./ -名称 "package.xml"; | \
      xargs cp --父母 -t /tmp/opt &&; \
    找到 ./ -名称 "COLCON_IGNORE"; | \
      xargs cp --父母 -t /tmp/opt || 

# 多阶段建设 $FROM_IMAGE AS 建筑工人

# 安装叠加依赖项
ARG 工作目录 $OVERLAY_WS
复制 --从=传授者 /tmp/$OVERLAY_WS/src ./src RUN . /opt/ros/$ROS_DISTRO/setup.sh &&; \
    apt-get 更新 &&; rosdep 安装 -y \
      --从路径 \
        src/ros2/demos/demo_nodes_cpp \
        src/ros2/demos/demo_nodes_py \
      --忽略源代码 \
    &&; rm -rf /var/lib/apt/lists/*

# 构建覆盖源
复制 --从=传授者 $OVERLAY_WS/src ./src ARG OVERLAY_MIXINS="release";
运行 . /opt/ros/$ROS_DISTRO/setup.sh &&; \
    胶管 构建 \
      --软件包--选择 \
        演示节点 \
        演示节点 \
      --米克辛 $overlay_mixins

# 源入口点设置
环境 OVERLAY_WS $OVERLAY_WS
运行 欙腓 --就地 --表达 \
      '$isource"$OVERLAY_WS/install/setup.bash"'; \
      /ros_entrypoint.sh

# 运行启动文件
CMD ["ros2";, "launch";, "demo_nodes_cpp";, "talker_listener.launch.py";]

通过所示行文,我们可以看到如何通过 4 个步骤从 github 添加自定义软件包:

  1. 使用从 Github 克隆的自定义软件包创建覆盖层:

ARG 工作目录 $OVERLAY_WS/src RUN 回响 "\
repositories:\n\
  ros2/demos:\n\
    type: git\n\
    url: https://github.com/ros2/demos.git\n\
    版本: ${罗斯_迪斯特罗} \n\
"; >; ./overlay.repos RUN vcs 舶来品 ./ <; ./overlay.repos
  1. 使用 rosdep 安装依赖软件包

# 安装叠加依赖项
ARG 工作目录 $OVERLAY_WS
复制 --从=传授者 /tmp/$OVERLAY_WS/src ./src RUN . /opt/ros/$ROS_DISTRO/setup.sh &&; \
    apt-get 更新 &&; rosdep 安装 -y \
      --从路径 \
        src/ros2/demos/demo_nodes_cpp \
        src/ros2/demos/demo_nodes_py \
      --忽略源代码 \
    &&; rm -rf /var/lib/apt/lists/*
  1. 构建软件包 你需要

# 构建覆盖源
复制 --从=传授者 $OVERLAY_WS/src ./src ARG OVERLAY_MIXINS="release";
运行 . /opt/ros/$ROS_DISTRO/setup.sh &&; \
    胶管 构建 \
      --软件包--选择 \
        演示节点 \
        演示节点 \
      --米克辛 $overlay_mixins
  1. 运行启动文件

# 运行启动文件
CMD ["ros2";, "launch";, "demo_nodes_cpp";, "talker_listener.launch.py";]

同样,我们也可以更改所使用的软件包,安装它们的依赖包,然后运行它们。

返回 IBM 云

有了这个 Dockerfile,我们就可以按照之前的步骤将其部署到 IBM Cloud 上。由于我们已经创建了注册表,并且登录了 IBM Cloud,所以我们可以直接构建新的 Dockerfile。请注意,我保持了标签不变,但更改了版本,这样就可以更新之前创建的 docker 镜像。(如果你愿意,也可以创建一个全新的)。

$  cr 构建 --标签 registry.bluemix.net/ros2nasr/ros2foxy:2 .

然后,确保你已登录注册表,并运行新的 docker 镜像:

$  cr 登录 登录   'registry.ng.bluemix.net';...登录   'registry.ng.bluemix.net';.记录   'us.icr.io';...登录   'us.icr.io';.OK $ 装卸工 运行 -v -它 registry.ng.bluemix.net/ros2nasr/ros2foxy:2

您应该会再次看到相同的输出。不过,这次我们是通过 github 上的自定义软件包完成的,这样我们就可以在 IBM 云上使用我们为 ROS2 亲自创建的软件包。

号外删除 Docker 映像

由于您可能会发现自己需要从 IBM 云中删除特定的 docker 映像,因此应该这样做!

  1. 列出您拥有的所有图片,并找出所有与这些图片共享 图片 对应于 registry.ng.bluemix.net/ros2nasr/ros2foxy:2 (就我而言)。然后使用 名称

$ 装卸工 rm your_docker_NAMES
  1. 使用 IBM Cloud 的 图片 名字

$ 装卸工 rmi registry.ng.bluemix.net/ros2nasr/ros2foxy:2

步骤 4:Kubernetes

a) 创建群集

使用控制台创建群集。说明如下 这里.使用的设置详见下文。这些只是建议,如果需要,可以更改。不过,请确保您了解所做选择的影响:

  1. 计划: 标准

  2. 协调服务: Kubernetes v1.18.10

  3. 基础设施 经典

  4. 地点:

  • 资源组: 默认值

  • 地理 北美 (您可以自由更改)

  • 可用性: 单区 (您可以自由更改,但请通过查看 IBM 云文档确保了解您的选择会产生的影响)。

  • 工人区: 多伦多 01 (选择离您最近的地点)

  1. 工人库:

  • 虚拟 - 共享,Ubuntu 18

  • 内存:16 GB

  • 每个区域的工作节点 1

  1. 主服务终端: 均为私人&;公共端点

  2. 资源详情(完全灵活):

  • 集群名称: mycluster-tor01-rosibm

  • 标签 版本:1

创建群集后,您将被重定向到一个页面,该页面详细说明了如何设置 CLI 工具和访问群集。请按照以下说明操作(或查看 这里),并等待进度条通过显示 正常 旁边的群集名称。您也可以从 Kubernetes 内部的 IBM 云控制台进入该屏幕。

b) 部署 Docker 映像 最后

  1. 创建名为 ros2-deployment.yaml 使用您最喜欢的 $EDITOR,在其中插入以下内容:

apiVersion: apps/v1 kind: 部署元数据:
  名: 规格:
  复制品: <number_of_replicas>;
  选择器:
    matchLabels:
      应用程序 <应用程序名称>;
  模板:
    元数据:
      标签
        应用程序 <应用程序名称>;
    规格:
      集装箱
      - 名: <应用程序名称>;
        图像 <region>.icr.io/<namespace>/<image>:<tag>;

您应该替换 "<" ">" 如上所述 这里.在我的案例中,文件看起来是这样的:

apiVersion: apps/v1 kind: 部署元数据:
  名: ros2 部署规范:
  复制品: 1
  选择器:
    matchLabels:
      应用程序 ros2-ibmcloud
  模板:
    元数据:
      标签
        应用程序 ros2-ibmcloud
    规格:
      集装箱
      - 名: ros2-ibmcloud
        图像 us.icr.io/ros2nasr/ros2foxy:2

使用以下命令部署文件

$ kubectl 应用 -f ros2-deployment.yaml deployment.apps/ros2-deployment 创建

现在,你的 docker 镜像已经完全部署在集群上了!

第 5 步:为 Docker 映像使用 CLI

  1. 通过 IBM 云控制台 Kubernetes 导航到您的群集。

  2. 点击 Kubernetes 仪表板 页面右上角。

现在,您应该可以看到群集所有不同参数的完整列表,以及 CPU 和内存使用情况。

  1. 导航至 豆荚 并点击您的部署。

  2. 点击右上角的 Exec into pod

现在,你已经进入了你的 docker 镜像!你可以为你的工作区提供源代码(如果需要),并运行 ROS2!例如

root@ros2-deployment-xxxxxxxx:/opt/ros/overlay_ws# . install/setup.sh root@ros2-deployment-xxxxxxxx:/opt/ros/overlay_ws# 玫瑰2 启动 演示节点 talker_listener.launch.py

最后评论

至此,你就可以使用 github 上的 ROS2 软件包创建自己的 docker 镜像了。只要稍加改动,你也可以使用本地的 ROS2 软件包。这可能是另一篇文章的主题。不过,我们建议你查看以下内容 Dockerfile 使用演示软件仓库的本地副本。同样,您也可以使用自己的本地软件包。