Docker ComposeでROS2ノードを起動する

はじめに

Docker Composeを使ってdemo_nodesのlistenerとtalkerを別々のDockerコンテナで起動し、それぞれのDockerコンテナ同士でROS2通信するサンプル。

考试环境

主机PC的操作系统:ubuntu22.04.4LTS
Docker容器的操作系统:ubuntu22.04LTS
Docker容器的ROS2版本:Humble
Docker的版本:24.0.6
docker-compose的版本:2.21.0

安装Docker和Docker Compose。

由于使用环境不同,安装方法也不同,故此省略。
如果要在Ubuntu 22.04上进行安装,请参考以下步骤。

 

安装ROS2的Docker镜像

使用下面的命令拉取ROS2的Docker镜像。

docker pull osrf/ros:humble-desktop
docker images

REPOSITORY                    TAG               IMAGE ID       CREATED         SIZE
osrf/ros                      humble-desktop      f63b30d9bcf7   3 weeks ago     3.11GB

创建docker-compose.yml文件

在不同的容器中分别运行demo_nodes的talker和listener,并进行通信的示例。
不需要ROS_DOMAIN_ID环境变量。
创建了名为ros2的网络,并在每个容器中使用。

version: '3'
# create docker network
networks:
  ros2:
    driver: bridge

services:
  talker:
    image: osrf/ros:humble-desktop
    container_name: talker
    environment:
      - ROS_DOMAIN_ID=1
    command: ros2 run demo_nodes_cpp talker
    networks:
      - ros2
    ipc: host
    restart: always

  listener:
    image: osrf/ros:humble-desktop
    container_name: listener
    environment:
      - ROS_DOMAIN_ID=1
    command: ros2 run demo_nodes_cpp listener
    networks:
      - ros2
    ipc: host
    restart: always

以下是官方文件中的最小示例。

version: '2'

services:
  talker:
    image: osrf/ros:humble-desktop
    command: ros2 run demo_nodes_cpp talker
  listener:
    image: osrf/ros:humble-desktop
    command: ros2 run demo_nodes_cpp listener
    depends_on:
      - talker

depends_onオプションはtalker コンテナが起動してからlistenerコンテナが起動する設定。

执行

docker-compose.ymlのあるディレクトリで以下を実行しtalkerコンテナとlisteneコンテナをまとめて起動する。

docker compose up

或者

docker compose -f docker-compose.yml up

如果出现以下这样的消息,就表示成功。

Creating network "ros2_docker_compose_ros2" with driver "bridge"
Creating ros2_docker_compose_listener_1 ... done
Creating ros2_docker_compose_talker_1   ... done
Attaching to ros2_docker_compose_talker_1, ros2_docker_compose_listener_1
talker_1    | [INFO] [1664355563.968462971] [talker]: Publishing: 'Hello World: 1'
listener_1  | [INFO] [1664355563.969353969] [listener]: I heard: [Hello World: 1]
talker_1    | [INFO] [1664355564.968472582] [talker]: Publishing: 'Hello World: 2'
listener_1  | [INFO] [1664355564.969369471] [listener]: I heard: [Hello World: 2]
talker_1    | [INFO] [1664355565.969120487] [talker]: Publishing: 'Hello World: 3'
listener_1  | [INFO] [1664355565.969678627] [listener]: I heard: [Hello World: 3]

終了する場合

docker compose down

down で終了するとコンテナも削除されるので注意

コンテナ内に入ってトピックの中身を見たい場合

docker execでどれかのコンテナに入ってros2 コマンドを実行

docker exec -it listener bash
root@0004e67a0578:/# source /opt/ros/humble/setup.bash
root@0004e67a0578:/# ros2 topic list
root@0004e67a0578:/# ros2 topic echo /chatter

ホストPCのROS2でトピックの中身を見たい場合

export ROS_DOMAIN_ID=1
ros2 topic echo /chatter

请参考