DockerでROS/ROS 2環境を構築・運用する
海洋ロボコンをやってた人です。
ROSのEOLが来月に迫ってきており、DockerのROS/ROS 2環境を改めて整理・運用しようと思い備忘録として記載していきます。
対象者はROS/ROS 2のDocker環境で開発したい方、または手軽にROSを試したい方とします。
修正点等あればご遠慮なくご指摘ください。
以下箇条書きになりますが、何卒宜しくお願い致します。
1. Preparing Docker Image
Dockerは仮想環境として様々なソフトウェア開発で利用されます。
DockerfileやDocker imgを配布・流用することでソフトウェア開発のライフサイクルを効率よく回すことができます。
Dockerで出てくる用語のイメージは下記です。
1.1. Install docker
公式ドキュメントにしたがってDockerをインストール
docker -v
# Docker version 28.0.4, build b8034c0
docker compose version
# Docker Compose version v2.34.0
1.2. Create Image from Dockerfile
に記載されているSupported tagsまたは
Github:osrf/docker_images のディストリビューションを参照し、Dockerfile
もしくはdocker pull
コマンドをでイメージを作成していきます。
mkdir Docker && cd ~/Docker
sudo nano Dockerfile
# ros:[Supported tags(Reference https://hub.docker.com/_/ros/)]
FROM osrf/ros:jazzy-desktop
# 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"]
# docker build --tag IMAGE_NAME:TAG_NAME
sudo docker build --tag ros:foxy .
1.3. Create Image from Hub
pull
コマンドにより、DockerHubからイメージ作成できます。
# sudo docker pull ros:[Supported tags]
sudo docker pull ros:noetic # 20.04 ROS 1 EOL 01 May 2025
sudo docker pull ros:foxy # 20.04 ROS 2 EOL 01 May 2023
sudo docker pull ros:humble # 22.04 ROS 2 EOL 01 May 2027
sudo docker pull ros:jazzy # 24.04 ROS 2 EOL 01 May 2029
# desktop
sudo docker pull osrf/ros:foxy-desktop # 20.04 ROS 2 EOL 01 May 2023
sudo docker pull osrf/ros:humble-desktop # 22.04 ROS 2 EOL 01 May 2027
sudo docker pull osrf/ros:jazzy-desktop # 24.04 ROS 2 EOL 01 May 2029
1.4. Confirm docker img
ビルドが完了すると、イメージが作成されていることがわかる。
イメージで使用するコマンドは下記。
# Dockerイメージの一覧表示
sudo docker image ls
# Dockerイメージの停止&削除
sudo docker image rm --force [IMAGE ID]
sudo docker image rmi --force [REPOSITORY]:[TAG] # *1
# リポジトリ名、タグ名を変更して複製
sudo docker tag ros_noetic:v0 ros:noetic_v1
Error response from daemon: conflict: unable to delete c445e4e9450d (cannot be forced) - image has dependent child images
2. Preparing Docker Container
イメージからDockerコンテナの作成、起動、削除などを行います。
2.1. Create Container
# Dockerコンテナの一覧表示
sudo docker container ps -a
# コンテナに名前をつけて起動 --name [コンテナ名] [IMAGE ID]
sudo docker container run -it --name ros2_foxy 45f7e3294c0d
# ★コンテナに外部GUI出力を付与して起動
sudo docker container run -it \
--name ros_jazzy_x11 \
--net host \
--privileged \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ros_jazzy_desktop:v1.0.1 \
bash
# コンテナの名前(NAMES)を変更
sudo docker rename ros2_foxy ros2_foxy_x11
# 既存コンテナの起動と停止 (*複数ターミナル開いて入るときにも使用)
# sudo docker containeer start [NAMES]
sudo docker container start ros2_foxy
sudo docker container exec -it ros2_foxy bash
sudo docker container stop ros2_foxy
# コンテナの停止&削除
sudo docker container rm --force [CONTAINER ID]
2.2. Confirm X11 & ROS
コンテナを作成・起動したらx11, ROSコマンドが動くかを確認します。
予めUbuntu Host側でxhostの設定をしておきましょう。
xhost +local:root
Docker側で下記を実行していきます。
sudo apt -y update
sudo apt-get install -y x11-apps
sudo apt -y install ros-$ROS_DISTRO-demo-nodes-cpp ros-$ROS_DISTRO-demo-nodes-py
sudo apt -y install ros-$ROS_DISTRO-rviz* # desktop以外は適宜インストール
xeyes
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_cpp listener
3. Distribute Dockerfile
ros-$ROS_DISTRO-desktop
ではGazeboやMoveitなどはDLされていないので、環境構築したものを一つ作成しておき、Dockerfileとして再配布することで、再利用が可能となります。
ros_jazzy_x11をベースに環境を作っていきます。
sudo docker start ros_jazzy_x11 && sudo docker exec -it ros_jazzy_x11 bash
install pkg
sudo apt -y install ros-$ROS_DISTRO-ament-cmake-google-benchmark
sudo apt -y install python3-colcon-common-extensions
sudo apt -y install ros-$ROS_DISTRO-ros-testing
sudo apt -y install ros-$ROS_DISTRO-graph-msgs
sudo apt -y install ros-$ROS_DISTRO-warehouse-ros-sqlite
sudo apt -y install ros-$ROS_DISTRO-gz-ros2-control
3.1. Export and Import container
# コンテナからイメージをexportする: export [コンテナ名] > [出力ファイル名.tar」
sudo docker export ros_jazzy_x11 > ros_jazzy_x11.tar
# .tarからコンテナをインポートする
cat ros_jazzy_x11.tar | sudo docker import - ros_jazzy_x11:v1.0.1
tarファイルを配布すれば、Docker環境を使いまわすことができます。
ただ、tarファイルなので推奨は'Dockerfile'での運用となります。(T.B.D)
4. Setting Docker-compose
Docker composeを使用して、複数のコンテン、描画ツールを扱ってみます。
Docker composeのイメージは下記。
4.1. Setting yaml
yamlファイルで参照するイメージファイル、起動するコンテナ名、各種設定を記載します。
cd ~/Docker
sudo nano docker-compose.yaml
version: '3'
services:
talker:
image: osrf/ros:jazzy-desktop
container_name: talker
environment:
- DISPLAY=${DISPLAY}
- ROS_DOMAIN_ID=1
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
command: ros2 run demo_nodes_cpp talker
networks:
- ros2
ipc: host
restart: always
privileged: true
listener:
image: osrf/ros:jazzy-desktop
container_name: listener
environment:
- DISPLAY=${DISPLAY}
- ROS_DOMAIN_ID=1
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
command: ros2 run demo_nodes_cpp listener
networks:
- ros2
ipc: host
restart: always
privileged: true
rqt:
image: osrf/ros:jazzy-desktop
container_name: rqt
environment:
- DISPLAY=${DISPLAY}
- ROS_DOMAIN_ID=1
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
command: rqt
networks:
- ros2
ipc: host
restart: always
privileged: true
networks:
ros2:
driver: bridge
4.2. Run Docker Compose
下記で確認します。
sudo docker compose up
Reference
Qiita, porizou1, Docker ComposeでROS2ノードを起動する
以上。
Likeいただけると大変励みになりますので、よろしくお願いいたします。
Discussion