您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.
在 IBM 云 Kubernetes 上部署 [社区贡献]
关于
本文介绍如何使用 Docker 文件在 IBM 云上运行 ROS 2。文章首先简要介绍了 docker 映像及其在本地的工作方式,然后探讨了 IBM 云以及用户如何在其上部署容器。然后,简要介绍了用户如何在 IBM 云上使用自己从 github 上定制的 ROS 2 软件包。此外,还将介绍如何在 IBM Cloud 上创建集群和使用 Kubernetes,最后在集群上部署 Docker 映像。最初发布 这里 和 这里.
IBM 云上的 ROS 2
在本教程中,我们将向您展示如何在 IBM Cloud 上轻松集成和运行 ROS 2 与您的自定义软件包。
ROS 2 是新一代的 ROS,可对多机器人编队进行更多控制。随着云计算的发展,云机器人技术在当今时代变得越来越重要。在本教程中,我们将简要介绍如何在 IBM 云上运行 ROS 2。教程结束时,您将能够在 ROS 2 中创建自己的软件包,并使用 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) ROS 2 图像
ROS 宣布 2019年1月,ROS 2 docker 将推出用于多个 ROS 发行版的镜像容器。有关 ROS 2 docker 映像使用的更详细说明,请参见 这里.
让我们跳过这些,直接进入正题:创建本地 ROS 2 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 镜像,在其中运行 ROS 2(没错,就是这么简单!)。
备注如果由于权限不足或以下原因导致错误 拒绝批准运行该命令时,请尝试使用 苏都 特权:
$ 装卸工 构建 .
# 你会看到一大堆执行 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 权限执行命令。然后,按下图所示运行你的 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:使用自定义 ROS 2 软件包
现在,我们已经拥有了从创建 Dockerfile 到部署并在 IBM Cloud 上运行的完整管道。但是,如果我们想使用自己(或其他人)创建的一组自定义软件包,该怎么办呢?
这一切都与你如何设置 Dockerfile 有关。让我们使用 ROS 2 提供的示例 这里.创建一个包含新 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 添加自定义软件包:
使用从 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
使用 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/*
构建软件包 你需要
# 构建覆盖源
复制 --从=传授者 $OVERLAY_WS/src ./src ARG OVERLAY_MIXINS="release";
运行 . /opt/ros/$ROS_DISTRO/setup.sh &&; \
胶管 构建 \
--软件包--选择 \
演示节点 \
演示节点 \
--米克辛 $overlay_mixins
运行启动文件
# 运行启动文件
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 云上使用我们为 ROS 2 亲自创建的软件包。
号外删除 Docker 映像
由于您可能会发现自己需要从 IBM 云中删除特定的 docker 映像,因此应该这样做!
列出您拥有的所有图片,并找出所有与这些图片共享 图片 对应于 registry.ng.bluemix.net/ros2nasr/ros2foxy:2 (就我而言)。然后使用 名称
$ 装卸工 rm your_docker_NAMES
使用 IBM Cloud 的 图片 名字
$ 装卸工 rmi registry.ng.bluemix.net/ros2nasr/ros2foxy:2
步骤 4:Kubernetes
a) 创建群集
使用控制台创建群集。说明如下 这里.使用的设置详见下文。这些只是建议,如果需要,可以更改。不过,请确保您了解所做选择的影响:
计划: 标准
协调服务: Kubernetes v1.18.10
基础设施 经典
地点:
资源组: 默认值
地理 北美 (您可以自由更改)
可用性: 单区 (您可以自由更改,但请通过查看 IBM 云文档确保了解您的选择会产生的影响)。
工人区: 多伦多 01 (选择离您最近的地点)
工人库:
虚拟 - 共享,Ubuntu 18
内存:16 GB
每个区域的工作节点 1
主服务终端: 均为私人&;公共端点
资源详情(完全灵活):
集群名称: mycluster-tor01-rosibm
标签 版本:1
创建群集后,您将被重定向到一个页面,该页面详细说明了如何设置 CLI 工具和访问群集。请按照以下说明操作(或查看 这里),并等待进度条通过显示 正常 旁边的群集名称。您也可以从 Kubernetes 内部的 IBM 云控制台进入该屏幕。
b) 部署 Docker 映像 最后
创建名为 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
通过 IBM 云控制台 Kubernetes 导航到您的群集。
点击 Kubernetes 仪表板 页面右上角。
现在,您应该可以看到群集所有不同参数的完整列表,以及 CPU 和内存使用情况。
导航至 豆荚 并点击您的部署。
点击右上角的 Exec into pod
现在,你已经进入了你的 docker 镜像!你可以为你的工作区提供源代码(如果需要),并运行 ROS 2!例如
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 上的 ROS 2 软件包创建自己的 docker 镜像了。只要稍加改动,你也可以使用本地的 ROS 2 软件包。这可能是另一篇文章的主题。不过,我们建议你查看以下内容 Dockerfile 使用演示软件仓库的本地副本。同样,您也可以使用自己的本地软件包。