IBM Cloud Kubernetes上的ROS2 [社区-贡献] [待校准@7232]
目录
关于 [待校准@7233]
本文介绍如何使用Docker文件在IBM Cloud上运行ROS2。它首先简要概述了docker映像以及它们如何工作lo调用y,然后探讨了IBM Cloud以及用户如何在其上部署其容器。之后,简要介绍了用户如何在IBM Cloud上使用来自github的ROS2自定义包。提供了有关如何在IBM Cloud上创建和使用Kubernetes的演练,最后在集群上部署了Docker映像。最初出版的 here and here 。 [待校准@7234]
IBM Cloud上的ROS2 [待校准@7235]
在本教程中,我们将展示如何在IBM Cloud上将ROS2与您的自定义包轻松集成和运行。 [待校准@7236]
ROS2是新一代的ROS,它提供了对多机器人结构的更多控制。随着云计算的进步,云机器人技术在当今时代变得越来越重要。在本教程中,我们将介绍在IBM Cloud上运行ROS2的简短介绍。在本教程结束时,您将能够在ROS2中创建自己的包,并使用docker文件将其部署到云中。 [待校准@7237]
以下说明假设您正在使用Linux,并且已经使用Ubuntu 18.04 (仿生海狸) 进行了测试。 [待校准@7238]
第1步: 设置系统 [待校准@7239]
在我们讨论确切的过程是如何工作的之前,让我们首先确保所有需要的软件都正确安装。我们将为您提供合适的源文件来设置您的系统,并且只突出显示与我们的用例相关的细节。 [待校准@7240]
a) Docker文件? [待校准@7241]
Docker文件是一种容器形式,可以与您的系统分开运行,这样,您可以设置可能数百个不同的项目,而不会相互影响。您甚至可以在一台计算机上设置不同版本的Linux,而无需虚拟机。Docker文件具有节省空间和仅在运行时使用系统源文件的优势。此外,码头工人用途广泛,可转让。它们包含所有单独运行所需的先决条件,这意味着您可以轻松地将docker文件用于特定系统或服务,而无需任何cubersome步骤! [待校准@7242]
兴奋了吗?让我们从按照以下 link 将docker安装到您的系统开始。从本教程中,您应该已经进行了一些健全性检查,以确保docker设置正确。但是,以防万一,让我们再次运行以下使用hello-world docker映像的命令: [待校准@7243]
$ sudo docker run hello-world
您应该获得以下输出: [待校准@7244]
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
b) ROS2图像 [待校准@7245]
2019年1月几种ROS分布的ROS announced 图像容器。有关使用ROS2 docker映像的更多详细说明,请参见 here 。 [待校准@7246]
让我们跳过这一点,立即进入真实交易; 创建本地ROS2 docker。我们将创建自己的Dockerfile (而不是使用就绪映像),因为我们需要这种方法在IBM Cloud上进行部署。首先,我们创建一个新目录,该目录将保存我们的Dockerfile和以后需要的任何其他文件,并导航到它。使用您最喜欢的 $ EDITOR选项,打开一个名为 * Dockerfile * 的新文件 (确保文件命名正确): [待校准@7247]
$ mkdir ~/ros2_docker
$ cd ~/ros2_docker
$ $EDITOR Dockerfile
在 * Dockerfile * 中插入以下内容,并保存它 (也可以找到 here ): [待校准@7248]
FROM ros:foxy
# install ros package
RUN apt-get update && apt-get install -y \
ros-${ROS_DISTRO}-demo-nodes-cpp \
ros-${ROS_DISTRO}-demo-nodes-py && \
rm -rf /var/lib/apt/lists/* && mkdir /ros2_home
WORKDIR /ros2_home
# launch ros package
CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"]
FROM: 从ros:foxy Docker镜像创建图层 [待校准@7249]
运行: 通过将vim安装到容器中并创建调用ed /ros2_home的目录来构建容器 [待校准@7250]
WORKDIR: 通知容器的工作目录应该在哪里 [待校准@7251]
当然,您可以自由更改ROS分布 (此处使用 * foxy *) 或更改目录名称。上面的docker文件设置ROS-foxy并安装C++ 和Python的例程节点。然后它launches文件运行健谈和侦听节点。我们将在几个动作中看到它,但是它们的行为与在 ROS wiki 中发现的出版商-订阅者的例子非常相似 [待校准@7252]
现在,我们准备构建docker映像以在其中运行ROS2 (是的,就这么简单!)。 [待校准@7253]
注意: 如果由于特权不足或 * 权限被拒绝 * 而导致错误,请尝试使用 * sudo * 特权运行命令: [待校准@7254]
$ docker build .
# You will see a bunch of lines that execute the docker file instructions followed by:
Successfully built 0dc6ce7cb487
0dc6ce7cb487 will most probably be different for you, so keep note of it and copy it somewhere for reference. You can always go back and check the docker images you have on your system using:
$ sudo docker ps -as
现在,使用以下命令运行docker文件: [待校准@7256]
$ docker run -it 0dc6ce7cb487
[INFO] [launch]: All log files can be found below /root/.ros/log/2020-10-28-02-41-45-177546-0b5d9ed123be-1
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [28]
[INFO] [listener-2]: process started with pid [30]
[talker-1] [INFO] [1603852907.249886590] [talker]: Publishing: 'Hello World: 1'
[listener-2] [INFO] [1603852907.250964490] [listener]: I heard: [Hello World: 1]
[talker-1] [INFO] [1603852908.249786312] [talker]: Publishing: 'Hello World: 2'
[listener-2] [INFO] [1603852908.250453386] [listener]: I heard: [Hello World: 2]
[talker-1] [INFO] [1603852909.249882257] [talker]: Publishing: 'Hello World: 3'
[listener-2] [INFO] [1603852909.250536089] [listener]: I heard: [Hello World: 3]
[talker-1] [INFO] [1603852910.249845718] [talker]: Publishing: 'Hello World: 4'
[listener-2] [INFO] [1603852910.250509355] [listener]: I heard: [Hello World: 4]
[talker-1] [INFO] [1603852911.249506058] [talker]: Publishing: 'Hello World: 5'
[listener-2] [INFO] [1603852911.250152324] [listener]: I heard: [Hello World: 5]
[talker-1] [INFO] [1603852912.249556670] [talker]: Publishing: 'Hello World: 6'
[listener-2] [INFO] [1603852912.250212678] [listener]: I heard: [Hello World: 6]
如果它工作正常,你应该看到类似于上面显示的东西。可以看出,有两个ROS节点 (发布者和订阅者) 正在运行,它们的输出通过ROS信息提供给我们。 [待校准@7257]
步骤2: 在IBM Cloud上运行映像 [待校准@7258]
以下步骤假定您有一个IBM cloud帐户并安装了ibmcloud CLI。如果没有,请先检查一下这个 link 。 [待校准@7259]
我们还需要通过运行命令来确保已安装IBM Cloud Container注册表的CLI插件。 [待校准@7260]
$ ibmcloud plugin install container-registry
之后,通过终端登录您的ibmcloud帐户: [待校准@7261]
$ ibmcloud login --sso
从这里,让我们创建一个容器注册表名称-空间。确保使用唯一的名称,该名称也描述了它是什么。在这里,我使用了 * ros2nasr *。 [待校准@7262]
$ ibmcloud cr namespace-add ros2nasr
IBM cloud有许多快捷方式,可以帮助我们立即将容器放到云中。下面的命令构建容器,并用名称ros2foxy和版本1标记它。确保使用您创建的正确注册表名称,并且您可以根据需要自由更改容器名称。那个。最后表示 * Dockerfile * 在当前目录中 (这很重要),如果不是,则将其更改为指向包含Dockerfile的目录。 [待校准@7263]
$ ibmcloud cr build --tag registry.bluemix.net/ros2nasr/ros2foxy:1 .
现在,您可以通过运行以下命令来确保容器已被推送到您创建的注册表 [待校准@7264]
$ ibmcloud cr image-list
Listing images...
REPOSITORY TAG DIGEST NAMESPACE CREATED SIZE SECURITY STATUS
us.icr.io/ros2nasr/ros2foxy 1 031be29301e6 ros2nasr 36 seconds ago 120 MB No Issues
OK
接下来,登录注册表以运行docker映像非常重要。同样,如果您面临 * 权限被拒绝 * 错误,请使用sudo特权执行该命令。然后,如下所示运行docker文件。 [待校准@7265]
$ ibmcloud cr login
Logging in to 'registry.ng.bluemix.net'...
Logged in to 'registry.ng.bluemix.net'.
Logging in to 'us.icr.io'...
Logged in to 'us.icr.io'.
OK
$ docker run -v -it registry.ng.bluemix.net/ros2nasr/ros2foxy:1
其中 * ros2nasr * 是您创建的注册表的名称,* ros2foxy:1 * 是docker容器和版本的标签,如前所述。 [待校准@7266]
现在,您应该看到docker文件正在运行,并提供与在计算机上运行lo调用y时看到的输出相似的输出。 [待校准@7267]
第3步: 使用自定义ROS2包 [待校准@7268]
因此,现在我们有了完整的管道,从创建Dockerfile,一直到部署它并看到它在IBM Cloud上运行。但是,如果我们想使用我们 (或其他人) 创建的一组自定义包怎么办? [待校准@7269]
这一切都与你如何设置你的Dockerfile有关。让我们使用ROS2 here 提供的例子。使用新的Dockerfile创建一个新目录 (或覆盖现有目录) 并在其中添加以下内容 (或下载文件 here ) [待校准@7270]
ARG FROM_IMAGE=ros:foxy
ARG OVERLAY_WS=/opt/ros/overlay_ws
# multi-stage for caching
FROM $FROM_IMAGE AS cacher
# clone overlay source
ARG OVERLAY_WS
WORKDIR $OVERLAY_WS/src
RUN echo "\
repositories: \n\
ros2/demos: \n\
type: git \n\
url: https://github.com/ros2/demos.git \n\
version: ${ROS_DISTRO} \n\
" > ../overlay.repos
RUN vcs import ./ < ../overlay.repos
# copy manifests for caching
WORKDIR /opt
RUN mkdir -p /tmp/opt && \
find ./ -name "package.xml" | \
xargs cp --parents -t /tmp/opt && \
find ./ -name "COLCON_IGNORE" | \
xargs cp --parents -t /tmp/opt || true
# multi-stage for building
FROM $FROM_IMAGE AS builder
# install overlay dependencies
ARG OVERLAY_WS
WORKDIR $OVERLAY_WS
COPY --from=cacher /tmp/$OVERLAY_WS/src ./src
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
apt-get update && rosdep install -y \
--from-paths \
src/ros2/demos/demo_nodes_cpp \
src/ros2/demos/demo_nodes_py \
--ignore-src \
&& rm -rf /var/lib/apt/lists/*
# build overlay source
COPY --from=cacher $OVERLAY_WS/src ./src
ARG OVERLAY_MIXINS="release"
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
colcon build \
--packages-select \
demo_nodes_cpp \
demo_nodes_py \
--mixin $OVERLAY_MIXINS
# source entrypoint setup
ENV OVERLAY_WS $OVERLAY_WS
RUN sed --in-place --expression \
'$isource "$OVERLAY_WS/install/setup.bash"' \
/ros_entrypoint.sh
# run launch file
CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"]
通过显示的行,我们可以看到如何通过4个步骤从github添加自定义包: [待校准@7271]
使用从Github克隆的自定义包创建覆盖: [待校准@7272]
ARG OVERLAY_WS
WORKDIR $OVERLAY_WS/src
RUN echo "\
repositories: \n\
ros2/demos: \n\
type: git \n\
url: https://github.com/ros2/demos.git \n\
version: ${ROS_DISTRO} \n\
" > ../overlay.repos
RUN vcs import ./ < ../overlay.repos
使用rosdep安装包依赖项 [待校准@7273]
# install overlay dependencies
ARG OVERLAY_WS
WORKDIR $OVERLAY_WS
COPY --from=cacher /tmp/$OVERLAY_WS/src ./src
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
apt-get update && rosdep install -y \
--from-paths \
src/ros2/demos/demo_nodes_cpp \
src/ros2/demos/demo_nodes_py \
--ignore-src \
&& rm -rf /var/lib/apt/lists/*
构建您需要的包 * [待校准@7274]
# build overlay source
COPY --from=cacher $OVERLAY_WS/src ./src
ARG OVERLAY_MIXINS="release"
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
colcon build \
--packages-select \
demo_nodes_cpp \
demo_nodes_py \
--mixin $OVERLAY_MIXINS
运行launch文件 [待校准@7275]
# run launch file
CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"]
同样,我们可以更改使用的包,安装它们的依赖项,然后运行它们。 [待校准@7276]
返回IBM Cloud [待校准@7277]
使用此Dockerfile,我们可以按照与之前相同的步骤在IBM Cloud上部署它。由于我们已经创建了注册表,并且已经登录到IBM Cloud,因此我们直接构建新的Dockerfile。请注意,我如何保持标签不变,但更改了版本,这样我就可以更新之前创建的docker映像。(如果需要,您可以自由创建一个全新的) [待校准@7278]
$ ibmcloud cr build --tag registry.bluemix.net/ros2nasr/ros2foxy:2 .
然后,确保您已登录到注册表并运行新的docker映像: [待校准@7279]
$ ibmcloud cr login
Logging in to 'registry.ng.bluemix.net'...
Logged in to 'registry.ng.bluemix.net'.
Logging in to 'us.icr.io'...
Logged in to 'us.icr.io'.
OK
$ docker run -v -it registry.ng.bluemix.net/ros2nasr/ros2foxy:2
您应该再次看到相同的输出。但是,这次我们通过github的自定义包来完成此操作,这使我们能够在IBM Cloud上使用为ROS2创建的个人包。 [待校准@7280]
额外: 删除Docker镜像 [待校准@7281]
由于您可能需要从IBM Cloud中删除特定的docker映像,因此您应该这样做! [待校准@7282]
列出您拥有的所有图像,并找到与 * registry.ng.bluemi x.net/ros2nasr/ros2foxy:2 * (在我的情况下) 对应的所有共享 * 图像 * 名称的图像。然后用他们的 * 名字 * 删除他们 [待校准@7283]
$ docker rm your_docker_NAMES
使用其 * image * 名称从IBM Cloud中删除docker映像 [待校准@7284]
$ docker rmi registry.ng.bluemix.net/ros2nasr/ros2foxy:2
步骤4: Kubernetes [待校准@7285]
a) 创建集群 [待校准@7286]
使用控制台创建集群。找到的说明是 here 。下面详细介绍了使用的设置。这些只是建议,如果需要可以更改。但是,请确保您了解选择的含义: [待校准@7287]
计划: * 标准 * [待校准@7288]
编排服务: * Kubernetes v1.18.10 * [待校准@7289]
基础设施: * 经典 * [待校准@7290]
位置: [待校准@7291]
Re源文件组: * 默认 * [待校准@7292]
地理: * 北美 * (您可以自由更改此设置) [待校准@7293]
可用性: * 单一区域 * (您可以自由更改此设置,但请查看IBM Cloud文档,确保您了解选择的影响。) [待校准@7294]
工作区域: * 多伦多01 * (选择物理调用距离您最近的位置) [待校准@7295]
工人池: [待校准@7296]
虚拟共享,Ubuntu 18 [待校准@7297]
内存: 16 GB [待校准@7298]
每个可用区的工作节点: * 1 * [待校准@7299]
主服务端点: * 私有和公共端点 * [待校准@7300]
关于源文件详细信息 (完全灵活): [待校准@7301]
集群名称: * mycluster-tor01-rosibm * [待校准@7302]
标签: * 版本: 1 * [待校准@7303]
创建集群后,您将被重定向到一个页面,该页面详细说明了如何设置CLI工具和访问集群。请按照以下说明操作 (或查看说明 here ),并等待进度条通过在群集名称旁边指示 * 正常 * 来显示您创建的工作节点已准备就绪。您也可以从Kubernetes内部的IBM Cloud控制台访问此屏幕。 [待校准@7304]
b) 部署您的Docker镜像 * 最后!* [待校准@7305]
使用您最喜欢的 $ EDITOR创建名为 * ros2-deployment.yaml * 的部署配置yaml文件,并在其中插入以下内容: [待校准@7306]
apiVersion: apps/v1
kind: Deployment
metadata:
name: <deployment>
spec:
replicas: <number_of_replicas>
selector:
matchLabels:
app: <app_name>
template:
metadata:
labels:
app: <app_name>
spec:
containers:
- name: <app_name>
image: <region>.icr.io/<namespace>/<image>:<tag>
您应该替换 * "< " " >" * 之间显示的标签,如 here 所述。就我而言,文件如下所示: [待校准@7307]
apiVersion: apps/v1
kind: Deployment
metadata:
name: ros2-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ros2-ibmcloud
template:
metadata:
labels:
app: ros2-ibmcloud
spec:
containers:
- name: ros2-ibmcloud
image: us.icr.io/ros2nasr/ros2foxy:2
使用以下命令部署文件 [待校准@7308]
$ kubectl apply -f ros2-deployment.yaml
deployment.apps/ros2-deployment created
现在,您的docker镜像已完全部署在您的集群上! [待校准@7309]
第5步: 将CLI用于Docker映像 [待校准@7310]
通过IBM Cloud控制台Kubernetes导航到您的集群。 [待校准@7311]
单击页面右上角的 * Kubernetes dashboard *。 [待校准@7312]
现在,您应该能够看到群集的所有不同参数及其CPU和内存使用情况的完整列表。 [待校准@7313]
导航到 * pod *,然后单击您的部署。 [待校准@7314]
在右上角,点击 * Exec into pod * [待校准@7315]
现在你在你的docker镜像里面了!您可以源文件您的工作区 (如果需要) 并运行ROS2!例如: [待校准@7316]
root@ros2-deployment-xxxxxxxx:/opt/ros/overlay_ws# . install/setup.sh
root@ros2-deployment-xxxxxxxx:/opt/ros/overlay_ws# ros2 launch demo_nodes_cpp talker_listener.launch.py
最后备注 [待校准@7317]
此时,您可以使用github上的ROS2包创建自己的docker映像。使用本地ROS2包也可以,只需很少的更改。这可能是另一篇文章的话题。但是,我们鼓励您查看以下使用例程仓库本地副本的 Dockerfile 。同样,您可以使用自己的本地包。 [待校准@7318]