docker-composeでROSノードを起動する (ROS Noetic対応)


# はじめに

docker-composeを使用して複数コンテナでROSノードを起動する機会があったので方法をメモ

docker-composeのインストールはこちら
https://docs.docker.com/compose/install/

# 実行環境

ホストPCのOS : ubuntu20.04.4LTS
DockerコンテナのROS : Noetic
docker-composeのバージョン：1.29.2

# 作成するもの

ros_tutorialsのtalkerとlistenerを別々のコンテナで実行してコンテナ間で通信するサンプルを作成する。

https://github.com/ros/ros_tutorials


# Dockerfileの作成

ベースイメージのros:noeticにはros_tutorialはインストールされていないため、ros_tutorialをインストールするDockerfileを作成する

こちらの記事のDockerfileをNoetic用に変更
https://qiita.com/Leonardo-mbc/items/cfd38a4fae8667593cf1

```Dockerfile
FROM ros:noetic-ros-core

RUN apt-get update && apt-get install -y
RUN apt-get install -y ros-noetic-ros-tutorials \
    ros-noetic-common-tutorials \
    && rm -rf /var/lib/apt/lists/
```




Dockefileをbuildしてイメージの作成

```bash
$ docker build --tag ros:ros-tutorials .
```


# docker-compose.ymlファイルの作成





コンテナを作成して実行するためのdocker-compose.ymlファイルを作成する。
以下のチュートリアルを参考に作成

http://wiki.ros.org/docker/Tutorials/Compose

```yaml:docker-compose.yml
version: '3'

networks:
  ros:
    driver: bridge

services:
  ros-master:
    image: ros:noetic-ros-core
    hostname: ros-master
    command: roscore
    networks:
      - ros
    restart: always

  talker:
    image: ros:ros-tutorials
    depends_on:
      - ros-master
    hostname: talker
    environment:
      - "ROS_HOSTNAME=talker"
      - "ROS_MASTER_URI=http://ros-master:11311"
    command: rosrun roscpp_tutorials talker       
    networks:
      - ros
    restart: always

  listener:
    image: ros:ros-tutorials
    depends_on:
      - ros-master
    hostname: listener
    environment:
      - "ROS_HOSTNAME=listener"
      - "ROS_MASTER_URI=http://ros-master:11311"
    command: rosrun roscpp_tutorials listener
    networks:
      - ros
    restart: always
```

### 実行

```bash
$ docker-compose up 
```
バックグラウンドで実行
```bash
$ docker-compose up -d
```


以下のようなメッセージが出ていれば成功

```bash
listener_1    | [ INFO] [1652702560.567117299]: I heard: [hello world 122]
listener_1    | [ INFO] [1652702560.667229181]: I heard: [hello world 123]
listener_1    | [ INFO] [1652702560.767135910]: I heard: [hello world 124]
listener_1    | [ INFO] [1652702560.867152489]: I heard: [hello world 125]
talker_1      | [ INFO] [1652702555.667214803]: hello world 73
talker_1      | [ INFO] [1652702555.766609058]: hello world 74
talker_1      | [ INFO] [1652702555.866571646]: hello world 75
talker_1      | [ INFO] [1652702555.966563110]: hello world 76
```

## docker-compose.yamlファイルの説明

以下yamlファイルの中身の説明

docker-composeで作成するコンテナは以下の3つ
-   ros-master : ROS masterにするコンテナ　roscoreだけ実行する
- talker : tutorials talkerを実行するコンテナ
- listener : tutorials listenerを実行するコンテナ

以下でdocker-composeで使用するネットワークの作成


```yaml:docker-compose.yml
networks:
  ros:
    driver: bridge
```

talkerを実行する部分
depends_on オプションにros-masterを指定することでros-masterが起動した後にtalkerコンテナが起動する。
environment オプションでROS_HOSTNAMEとROS_MASTER_URIの設定。
listenerも同様。

```yaml:docker-compose.yml
  talker:
    image: ros:ros-tutorials
    depends_on:
      - ros-master
    hostname: talker
    environment:
      - "ROS_HOSTNAME=talker"
      - "ROS_MASTER_URI=http://ros-master:11311"
    command: rosrun roscpp_tutorials talker       
    networks:
      - ros
```


# 参考文献

http://wiki.ros.org/docker/Tutorials/Compose

Docker + ROS(kinetic)でチュートリアル

https://qiita.com/Leonardo-mbc/items/cfd38a4fae8667593cf1