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
请参考