Docker上でROSを動かす
今回はDocker上でROSを動かす手順をまとめた.
概要
昨今,Dockerの登場により自分のローカル環境を汚すことなく開発が可能になっている. それはロボティクスの分野も例外ではなくROSもDockerイメージが提供されている. ROSに関しては,GUIインターフェースが多数提供されている上にそもそもPCに接続されたセンサから値を取得する手順があるためDockerでこれらを実施するのは色々と手間だと思い今まではROSはUbuntu環境で,Dockerを使わずに動かしていた. しかしながら業務の関係でDockerを触るにつれその利便性からROSもDocker化したい思いが募り今回備忘録として手順を残すに至った.
環境
- Docker
使用するセンサー
- RPLidar A1M8
今回の目的
今回の目的は言うまでもなくROSのDocker化であるがチュートリアルをやるといった程度の生ぬるいものではない. やることは以下の二点.
- Dockerコンテナ上で起動したRVizをホストマシン側に表示し,操作できるようにする
- ホストマシンに接続されたセンサデバイスをDockerコンテナから読み取り,ROSプログラムを動かす
それでは粛々と支度をする.
Dockerイメージの取得
公式Docker HubにはROSのDockerイメージが提供されている.
しかしながら,このイメージにはRViz等デスクトップ環境でよく用いられるツールは含まれていない. 本文に記載の通りosrf/rosのイメージにはそれらが含まれているためこちらを取得する.
# 結構時間がかかるので気長に待たれよ
$ docker pull osrf/ros:desktop
Dockerコンテナの起動
取得したイメージを使用してDockerコンテナを起動する. この時,先に述べた目的を達成するために色々とオプションを指定している.
やっていることは
- ユーザーと作業ディレクトリをホストマシンのユーザーとホームディレクトリと同一にする
- PAM周りのファイルも読み取り専用でマウントする
- センサのデバイスファイルは
--device
オプションで指定する - ホストマシンでGUIを表示するためにX11のファイルをマウントする
センサは事前にPCに接続済みでありそのデバイスファイルは/dev/ttyUSB0
である.
$ docker run --rm -it --user=$(id -u):$(id -g) --env=DISPLAY=$DISPLAY --env=QT_X11_NO_MITSHM=1 --workdir="/home/$USER" --volume="/home/$USER:/home/$USER" --volume="/etc/group:/etc/group:ro" --volume="/etc/passwd:/etc/passwd:ro" --volume="/etc/shadow:/etc/shadow:ro" --volume="/etc/sudoers.d:/etc/sudoers.d:ro" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --name myros --device /dev/ttyUSB0:/dev/ttyUSB0 osrf/ros:melodic-desktop-full bash
human@0fe6c296ce66:~$
ビルドと実行
コンテナに入ったらソースコードをビルドし実行する.
human@0fe6c296ce66:~
# ワークスペースの作成
$ mkdir -p ~/catkin_ws/src; cd $_
$ catkin_init_workspace
# rplidarのリポジトリのクローン
$ git clone https://github.com/Slamtec/rplidar_ros.git
$ cd ~/catkin_ws; ls src
--> クローンしたrplidar_rosがあることを確認
# ビルド
$ catkin_make
# パッケージにパスを通す
$ . devel/setup.bash
# デバイスファイルの権限の変更 ( rplidarのデバイスファイル )
sudo chmod 666 /dev/ttyUSB0
# ローンチファイルの実行
$ roslaunch rplidar_ros view_rplidar.launch
--> RVizがホストマシン側の画面に表示されることを確認する.
最後に
こんなに快適ならもっと早くからやっておけば良かったという気がしてくるが ROSを動かすようなコンピュータはリソース消費を抑えたい場合も多いため,Dockerプロセスが消費するリソースの割合によってはあまり現実的でないかもしれない. ただこれから先,ますますハードウェアはより高性能化,小型軽量化,安価になっていくと予想されるため近い将来ROSプログラミングにおいてもDockerがデファクトスタンダードになる気がする. Hotel Docker問題と名付けたい. You can check out anytime you like. But you can never leave.