この記事について
ROSの初心者が、あろうことかほぼ使ったことないDocker上でROSのプログラミングに挑戦しようとして、いきなりチュートリアルでくじけそうになりながらもなんとか亀さんを動かすまでの記録です。
なぜDocker上でROSを動かすのかというと、
- MacにもROSはあったりするけどUbuntuほどサポートされていない。
- Dockerでやれば他の人とも簡単に開発環境を共有できる
- Mac上の環境がぐちゃぐちゃにならない
などの理由があります。
この記事はロポットプログラミングやりたいけどMacから離れられない人に役に立つでしょう。
初心者のため間違いなどもあると思いますが、お気付きでしたらご指摘ください。
参考URL
Using ROS with Docker in macOS
前準備
Docker for macをインストールして立ち上げておく
Docker Community Edition for MacをDocker storeからダウンロードしてインストールします。立ち上げると画面右上に鯨のような船のアイコンが表示されます。
Xquartzをインストールしておく
ここから.dmg
ファイルをダウンロードしてインストールします。起動したら環境設定->セキュリティ
と進んでネットワーク・クライアントからの接続を許可
にチェックを入れます。
Docker上でGUIを動かすのに使います。
コンテナ一つで亀さんを動かす
参考URLにあげたやり方ではどちらもコンテナ一つでノードを動かしていて、ネットワークの設定をするのが面倒です。
ここではdocker run
の代わりにdocker exec
を使ってネットワークの設定なしにチュートリアルの亀さんを動かしてみます。
Dockerの準備
Dockefile
ワーキングディレクトリに以下のようなDockerfileを準備します。
# Dockerfileの中身
FROM ros:kinetic
RUN apt-get update \
&& apt-get install -y ros-kinetic-ros-tutorials \
ros-kinetic-common-tutorials \
&& rm -rf /var/lib/apt/lists/
Docker image をbuildする
以下のコマンドでdocke imageをbuildします。
docker build -t ros-tutorials .
Docker runでコンテナを起動する
Docker runでコンテナを起動して、roscoreでmasterノードを立ち上げます。
ただし、ここでは亀さんが出てくる窓を映すためにディスプレイの設定をする必要があります。
また、後で同じコンテナに入るために--name
オプションでわかりやすい名前をつけておきます。
以下のコマンドでディスプレイを設定しmasterノードを立ち上げます。
open -a Xquartz
ip=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}')
echo $ip
xhost + $ip
docker run --rm -e DISPLAY=$ip:0 --name ros-test ros-tutorials roscore
起動したコンテナでturtlesimを実行する
上のコマンドを実行するとターミナルは入力を受け付けなくなるので、新しいターミナルを立ち上げturtlesimを実行します。
# hostのMac内
docker exec -it ros-test bin/bash
# 上で立ち上げたコンテナ内部
source opt/ros/kinetic/setup.bash
rosrun turtlesim turtlesim_node
これで画面に亀が出てきます。最後に同じようにしてキーボード入力を受け付けるノードを立ち上げます。
# hostのMac内
docker exec -it ros-test bin/bash
# 上で立ち上げたコンテナ内部
source opt/ros/kinetic/setup.bash
rosrun turtlesim turtle_teleop_key
最後に入力したターミナルをアクティブにして上下左右キーを押せば亀さんが動くはずです。
亀さんのいる窓をアクティブにしても亀さんは動きませんので注意しましょう。
わざわざdocker exec
するたびにsource opt/ros/kinetic/setup.bash
するのも面倒なのなんかいい方法ありませんかね。
SLAMがやりたくて始めたROSですが、先はまだまだ長そうです。