< >
Home » ROS2入门教程 » ROS2入门教程-IBM Cloud Kubernetes的ROS2

ROS2入门教程-IBM Cloud Kubernetes的ROS2

说明:

  • 介绍如何使用Docker文件在IBM Cloud上运行ROS2

步骤:

  • Docker 文件

    Docker 文件是一种容器形式,可以与您的系统分开运行,这样您就可以设置数百个不同的项目而不会相互影响。您甚至可以在一台机器上设置不同版本的 Linux,而无需虚拟机。Docker 文件具有节省空间的优势,并且仅在运行时使用您的系统资源。此外,泊坞窗是多功能且可转移的。它们包含单独运行所需的所有先决条件,这意味着您可以轻松地将 docker 文件用于特定系统或服务,而无需任何繁琐的步骤

  • 安装docker

$ sudo docker run hello-world
  • 使用 hello-world docker 映像的命令
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/
  • 创建本地 ROS2 docker
$ mkdir ~/ros2_docker

$ cd ~/ros2_docker

$ $EDITOR Dockerfile
  • 将以下内容插入Dockerfile并保存
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"]
  • 构建 docker 镜像以在其中运行 ROS2
$ docker build .

# You will see a bunch of lines that execute the docker file instructions followed by:
Successfully built 0dc6ce7cb487
  • 检查系统上的 docker 镜像
$ sudo docker ps -as
  • 运行 docker 文件
$ 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]
  • 在 IBM Cloud 上运行映像

  • 确保安装了 IBM Cloud Container Registry 的 CLI 插件

$ ibmcloud plugin install container-registry
  • 通过终端登录您的 ibmcloud 帐户
$ ibmcloud login --sso
  • 使用ros2nasr
$ ibmcloud cr namespace-add ros2nasr
  • IBM 云有很多捷径可以帮助我们立即将容器放到云上。下面的命令构建容器并用名称ros2foxy和1的版本标记它。确保使用您创建的正确注册表名称,并且您可以随意更改容器名称。的。最后表示 Dockerfile在当前目录中(这很重要),如果不是,则将其更改为指向包含 Dockerfile 的目录
$ ibmcloud cr build --tag registry.bluemix.net/ros2nasr/ros2foxy:1 .
  • 确保容器已推送到您创建的注册表
$ 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 镜像,运行docker 文件
$ 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
  • 使用自定义 ROS2 包

  • 使用新的 Dockerfile 创建一个新目录(或覆盖现有的)并在其中添加以下内容

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"]
  • 从 github 添加自定义包

  • 使用从 Github 克隆的自定义包创建覆盖

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 安装包依赖
# 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
  • 运行启动文件
# run launch file
CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"]
  • 返回 IBM Cloud

  • 使用此 Dockerfile,我们可以按照之前在 IBM Cloud 上部署的相同步骤进行操作。由于我们已经创建了注册表,并且我们已登录到 IBM Cloud,因此我们直接构建了新的 Dockerfile。请注意我如何保持标签不变但更改了版本,这样我就可以更新之前创建的 docker 镜像。(如果需要,您可以自由创建一个全新的)

$ ibmcloud cr build --tag registry.bluemix.net/ros2nasr/ros2foxy:2 .
  • 确保您已登录到注册表并运行新的 docker 镜像
$ 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
  • 删除 Docker 镜像
$ docker rm your_docker_NAMES
  • 使用其IMAGE名称从 IBM Cloud 中删除 docker 映像
$ docker rmi registry.ng.bluemix.net/ros2nasr/ros2foxy:2
  • Kubernetes,创建集群

    使用控制台创建集群 。使用的设置详述如下。这些只是建议,如果需要,可以更改。但是,请确保您了解您的选择的含义:
    计划:标准
    编排服务:Kubernetes v1.18.10
    基础设施:经典
    地点:
    资源组:默认
    地理:北美(您可以自由更改)
    可用性:单区域(您可以自由更改此设置,但请确保通过查看 IBM Cloud 文档了解您的选择的影响。)
    工人区:Toronto 01(选择距离你最近的位置)
    工人池:
    虚拟 - 共享,Ubuntu 18
    内存:16GB
    每个区域的工作节点:1
    主服务端点:私有和公共端点
    资源详情(完全灵活):
    集群名称:mycluster-tor01-rosibm
    标签:版本:1

    创建集群后,您将被重定向到一个页面,其中详细介绍了如何设置 CLI 工具和访问集群。请按照这些说明(或查看此处的说明 )并等待进度条通过在集群名称旁边指示Normal来显示您创建的工作节点已准备就绪。您还可以从 Kubernetes 内的 IBM Cloud Console 访问此屏幕

  • 部署的Docker镜像

使用您喜欢的 $EDITOR创建一个名为ros2-deployment.yaml的部署配置 yaml 文件, 并在其中插入以下内容


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>
  • 替换“<”“>”之间显示的标签
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
  • 部署文件
$ kubectl apply -f ros2-deployment.yaml
deployment.apps/ros2-deployment created
  • 对 Docker 映像使用 CLI

    通过 IBM Cloud 控制台 Kubernetes 导航到您的集群。
    单击页面右上角的Kubernetes 仪表板。
    您现在应该能够看到集群的所有不同参数及其 CPU 和内存使用情况的完整列表。
    导航到Pods并单击您的部署。
    在右上角,单击Exec into pod
    现在你就在你的 docker 镜像中了!您可以获取您的工作区(如果需要)并运行 ROS2!例如:

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

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2入门教程