ROSをDockerで動かそう

ROSを使ってチームでロボットを開発していると,
環境やヴァージョンによって予期せぬトラブルに見舞われることがある.
そこで実行するだけでROS環境をDocker上に構築するスクリプトを書いてみた.

Dockerとは

雑に言うとめっちゃ小さい仮想環境.
仮想のLinuxなので感覚的にはWSLに近い気がするけど,
簡単に構築でき,簡単に削除でき,同じ環境を配布しやすいかな.
VirtualBoxみたいにOS全部再現します!ってわけじゃないから軽量.

Dockerfileで環境構築

Dockerfileは環境構築の設計図で,このファイルを置いてあるディレクトリで
build & runすると構築される. 今回書いたDockerfileはこんな感じ

# install ros image as base image
FROM ros:melodic

# always run at initializing OS
RUN apt-get update && apt-get install -y
ENV ROS_MASTER_URI=http://master:11311

FROM ~で使用するimageを選択.
imageは基礎となる環境かな.これを元にコンテナを作る. ROS imageはここに置いてあります.

https://hub.docker.com/_/ros

RUN ~はimageが起動したら最初に実行されるコマンド
ENVは環境変数
rosのノードごとにコンテナを作っており,コンテナ間で通信するために用意.
roscoreがわかるように.

Docker build & run

とりあえず実行してみる.

docker build -t rosimage ./ # カレントディレクトリにあるDockerfileからrosimageと言う名前で新しいimageを作成
docker run -it rosimage # rosimageからコンテナを作成(コンソールに結果表示)

シェルスクリプト

#!/usr/bin/bash
echo "Welcome to ROS master node !!"
echo "Buiud and lanch ..."
docker build -t rosimage ./ # bulid 'rosimage' image using Dockerfile in current

DIR=$(cd $(dirname $0); pwd)
docker run -it \
-v $DIR"/.ros/:/root/.ros/" \
-v $DIR"/catkin_ws/:/root/catkin_ws/" \
--device=/dev/video0:/dev/video0 \
rosimage    # run ros on docker image
exit 0

-vオプションでローカルとDocker上のフォルダを連動させている.
--deviceオプションでdocker上でもwebcamなどのデバイスを使えるようにしている.
winとかmacのカメラにはアクセスできなかった気がする. 基本的には以上でOKかな.
roscore専用のスクリプトを作っていたりするレポジトリは下記に.

https://github.com/Libra23/ROSDocker

Dockerfileとdocker runで似た機能あるなと思ったけど 開発者と作業者の区別している模様.