Skip to content

快速参考

  • 由……维护: (注:原文中“Maintained by:”后面应该还有具体的维护者信息,但题目中未给出,所以翻译只能到此为止。)
    开源机器人基金会

  • 哪里可以获得帮助:
    Docker 社区 Slack、Server Fault、Unix & Linux 或 Stack Overflow

支持的标签及各自的 Dockerfile 链接

快速参考(续)

什么是 ROS?

机器人操作系统(ROS)是一组软件库和工具,可帮助您构建机器人应用程序。从驱动程序到最先进的算法,再加上强大的开发人员工具,ROS 为您的下一个机器人项目提供了所需的一切。而且它都是开源的。

wikipedia.org/wiki/机器人操作系统

logo

如何使用此图像

创建一个 Dockerfile 来安装 ROS 软件包

要创建您自己的 ROS Docker 镜像并安装自定义软件包,以下是一个简单的示例,通过 apt-get 使用官方发布的 Debian 软件包来安装 C++、Python 客户端库演示。

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/*

# launch ros package
CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener_launch.py"]

注意:所有 ROS 图像都包含一个默认的入口点,该入口点在执行配置的命令(在本例中为演示包启动文件)之前会获取 ROS 环境设置。然后,您可以像这样构建和运行 Docker 映像:

$ docker build -t my/ros:app .
$ docker run -it --rm my/ros:app
[INFO] [launch]: process[talker-1]: started with pid [813]
[INFO] [launch]: process[listener-2]: started with pid [814]
[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [listener]: I heard: [Hello World: 2]
...

创建一个 Dockerfile 以构建 ROS 软件包

要创建您自己的 ROS Docker 镜像并构建自定义软件包,以下是一个简单的示例,用于安装软件包的构建依赖项,从源代码进行编译,并将生成的构建产物安装到最终的多阶段镜像层中。

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"]

上述示例首先使用 vcstool 将感兴趣的源存储库克隆到缓存器阶段。同样,也可以使用 COPY 将本地构建上下文中的代码放入源目录中。然后,软件包清单文件会缓存在一个临时目录中,接下来的构建器阶段可以从该目录中复制以使用 rosdep 安装必要的依赖项。这样做是为了在将其余源文件复制之前保留多阶段构建缓存,因为未更改的清单不会更改声明的依赖项,从而节省时间和带宽。然后使用 colcon 构建覆盖层,将入口点更新为源工作区,并将默认命令设置为启动演示。

注意:在此将 --from-paths--packages-select 如此设置,是为了仅为演示 C++ 和 Python 包(在已克隆的演示 git 存储库中的众多包中)安装依赖项并进行构建。要为源工作区中的所有包安装依赖项并进行构建,只需通过设置 --from-paths src/ 并删除 --packages-select 参数来更改范围。

对于更多高级示例,例如将多个覆盖工作区进行菊花链式连接以改善 Docker 映像构建层的缓存,使用诸如 ccache 之类的工具通过 colcon 加速编译,或使用 buildkit 即使在依赖项发生变化时也能节省构建时间和带宽,ROS 2 Navigation2 存储库中的项目 Dockerfile 是极好的资源。

部署用例

此 Docker 化的 ROS 镜像旨在提供一个简化且一致的平台,以构建和部署分布式机器人应用程序。它基于官方的 Ubuntu 镜像和 ROS 的官方 Debian 软件包构建,包含近期受支持的版本,以便快速访问和下载。这为研究和工业领域的机器人专家提供了一种简便的方法,用于开发、复用和交付用于自主行动和任务规划、控制动力学、定位和映射、群集行为以及一般系统集成的软件。

开发具有新发布算法的前沿实现的此类复杂系统仍然具有挑战性,因为在创新竞赛中,机器人软件的可重复性和可再现性可能会被忽视。由于在编码、调整和部署跨越多个工程学科的多个软件组件方面存在额外的困难,一种更具协作性的方法变得具有吸引力。然而,在多个机器人和平台上共享和维护一组软件的技术困难在一段时间内所耗费的时间和精力超过了许多较小的实验室和企业所能承受的范围。

随着软件容器的进步和标准化,机器人专家们准备获得一系列用于构建和交付软件的改进型开发工具。为了帮助缓解采用新实践所带来的成长烦恼和技术挑战,我们专注于为将 ROS 与这些新技术结合使用提供官方资源。

对于每个 ROS 发行版所支持的架构和基础镜像的完整列表,请阅读关于 ROS 1 或 ROS 2 的目标平台的官方 REP。

部署建议

可用的标签包括受支持的发行版以及基于最常见的元包依赖关系的层次结构标签,旨在具有较小的占用空间和简单的配置:

  • ros-core :最小化 ROS 安装
  • ros-base :基本工具和库(也使用带有 LTS 版本的发行版名称标记为 latest
  • ros1-bridge :用于运行混合 ROS 1 - ROS 2 系统以及在它们之间桥接消息的工具和库

为使 ros-core 标签在图像大小方面保持最小,诸如 rosdepcolconvcstools 之类的开发工具并非随 ros_core 一起提供,而是在 ros-base 中提供。

其余常见的元包,如 desktop ,托管在 OSRF 的 Docker Hub 配置文件下的存储库中,链接在此。这些元包包括图形依赖项,并挂钩许多其他大型包,如 X11、X 服务器等。因此,为了保持官方镜像精简和安全,桌面包仅与 OSRF 的配置文件一起托管。有关可用变体的详细列表,请阅读关于 ROS 1 或 ROS 2 在目标平台上的官方 REP。

卷;册;体积;容量(根据具体语境选择合适的释义)

ROS 使用 ~/.ros/ 目录来存储日志和调试信息。如果您希望在生成这些文件的容器的生命周期之外保留这些文件,则可以将 ~/.ros/ 文件夹挂载到主机上的外部卷,或者派生映像可以指定由 Docker 引擎管理的卷。默认情况下,容器以 root 用户身份运行,因此 /root/.ros/ 将是这些文件的完整路径。

例如,如果某人希望使用已经存在于其本地主目录中、用户名是 ubuntu 的自己的 .ros 文件夹,我们只需使用一个额外的卷参数来启动容器:

$ docker run -v "/home/ubuntu/.ros/:/root/.ros/" ros

设备

某些应用程序可能需要设备访问权限,以便从连接的相机获取图像、从人机接口设备获取控制输入,或使用 GPU 进行硬件加速。这可以通过使用 --device 运行参数将设备挂载到容器内部来实现,从而为容器内部的进程提供硬件访问权限。

网络

ROS 允许使用 ROS 通信基础设施松散耦合的进程(可能分布在多台机器上)进行对等网络连接。ROS 实现了几种不同的通信方式,包括通过服务进行同步 RPC 风格的通信,通过主题进行异步类型数据流式传输,通过动作进行请求/回复和状态/反馈的组合,以及通过参数进行运行时设置的配置。为遵循每个容器一个进程的最佳实践,可以使用 Docker 网络将多个正在运行的 ROS 进程连接在一起。有关更多详细信息,请参阅下面的部署示例。

或者,可以使用更宽松的网络设置将所有主机网络接口与容器共享,例如 host 网络驱动程序,简化与外部网络参与者的连接。但请注意,这会消除容器之间的网络命名空间分离,并可能影响 DDS 参与者在容器之间进行通信的能力,如此处所述。

部署示例

Docker Compose (该词通常不进行逐字翻译,在中文语境中,“Docker Compose”这个英文表述较为常见且被广泛接受)

在这个示例中,我们将展示如何使用 docker-compose 在通过共享软件定义网络连接的单独容器中生成一对消息发布者和订阅者节点。

创建目录 ~/ros_demos 并从上述内容中添加第一个 Dockerfile 示例。在同一目录中,还创建文件 docker-compose.yml ,其中包含使用 C++ 发布者和 Python 订阅者运行的以下内容:

version: '3'

services:
  talker:
    build: ./
    command: ros2 run demo_nodes_cpp talker

  listener:
    build: ./
    environment:
      - "PYTHONUNBUFFERED=1"
    command: ros2 run demo_nodes_py listener

在同一目录内使用 docker-compose 来启动我们的 ROS 节点。鉴于创建的容器源自同一个 docker compose 项目,它们将在共享的项目网络上共存:

$ docker-compose up -d

注意到一个名为 ros_demos_default 的新网络已创建,进一步情况可通过以下方式展示:

$ docker network inspect ros_demos_default

我们可以监控每个容器的记录输出,例如像这样的监听节点:

$ docker-compose logs listener

最后,我们可以在同一目录下使用 docker-compose 停止并删除所有相关容器:

$ docker-compose stop
$ docker-compose rm

注意:自动生成的网络, ros_demos_default ,将一直存在,直到您使用 docker-compose down 明确将其删除。

ROS 1 桥接器

为了简化 ROS 2 迁移, ros1_bridge 是一个 ROS 2 软件包,可在 ROS 1 和 ROS 2 之间提供双向通信。作为一个最小示例,鉴于上述 ROS 2 Dockerfile,我们将在下面创建等效的 ROS 1,并适当地命名 Dockerfile。

FROM ros:noetic

# install ros package
RUN apt-get update && apt-get install -y \
      ros-${ROS_DISTRO}-ros-tutorials \
      ros-${ROS_DISTRO}-common-tutorials && \
    rm -rf /var/lib/apt/lists/*

# launch ros package
CMD ["roslaunch", "roscpp_tutorials", "talker_listener_launch"]

下面的撰写文件会为说话者 - 倾听者演示生成服务,同时通过动态桥接将两者连接起来。然后,您可以查看来自两对说话者和倾听者节点通过 /chatter 主题相互交流的日志输出。

version: '3'

services:
  ros1:
    build:
      context: ./
      dockerfile: ros1.Dockerfile

  ros2:
    build:
      context: ./
      dockerfile: ros2.Dockerfile

  bridge:
    image: ros:foxy-ros1-bridge
    environment:
      - "ROS_HOSTNAME=bridge"
      - "ROS_MASTER_URI=http://ros1:11311"
    command: ros2 run ros1_bridge dynamic_bridge

更多资源

ROS.org:ROS 主要网站
问答:提出问题。获得答案
论坛:聆听最新讨论
博客:保持最新状态
包:发现已索引的包
OSRF:开源机器人基金会

ROS 2

索引:ROS 2 文档
设计:ROS 2 设计文章

ROS 1

维基:ROS 1 文档

许可证

查看此映像中所包含软件的软件包索引以获取许可信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可信息可能会在 repo-info 存储库的 ros/ 目录中找到。

对于任何预构建图像的使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。