Help us understand the problem. What is going on with this article?

dockerでROSを試したい

More than 3 years have passed since last update.

DockerでROSを試したい

ROSのインストールが色々と面倒そうなので、Docker使うと手っ取り早いかな・・・と思いました。
ググってみると、日本語の良記事を見つけました。

この記事に書いてあることを基にしてROSの新しいバージョンであるjadeをコンテナで試そうとしました。
なお、環境はUbuntu 14.04 LTS、dockerは1.6.2です。

早速動かしてみる

まずはdocker imageをpullしてきます。docker pullに限らず、dockerコマンド使うときはユーザをdockerのgroupに所属させるか、sudo付けてdockerコマンドを実行するかしてください。

imageをpullする
docker pull osrf/ros:jade-desktop-full

次に以下のdockerコマンドを使い、roscoreが動作するコンテナを起動します。

roscoreを動かす
docker run -it --rm --name master --env ROS_HOSTNAME=master osrf/ros:jade-desktop-full roscore
実行結果
... logging to /root/.ros/log/9e1cfde6-e859-11e5-aaef-0242ac110002/roslaunch-903e750fb602-1.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

Unable to contact my own server at [http://master:47759/].
This usually means that the network is not configured properly.

A common cause is that the machine cannot ping itself.  Please check
for errors by running:

    ping master

For more tips, please see

    http://www.ros.org/wiki/ROS/NetworkSetup

The traceback for the exception was written to the log file

どうやらネットワーク周りでトラブっている様子。ROSのWikiを調べると、こんなQ&Aを見つけました。

ところが、ここに書かれている方法では、確かにroscoreは動くものの、先ほどの記事に書かれているtalkerとlistener(ROSのノード)が動きません。
roscoreがlocalhostなので、talkerとlistenerがroscoreを見つけることができないためだと思われます。

実際にroscoreを実行させずにシェルだけ立ち上げて確認すると、コンテナのhostnameは意図したhostname(master)になっていません。

root@cd41badef483:/# hostname
cd41badef483

では、どうしたらよい?

先のQ&Aで問題になっているのは、「コンテナのhostnameが意図と異なるhostnameになっている」ことです。
なら、コンテナのhostnameを明示的に指定すれば良さそうです。

dockerのリファレンスを調べると「Similarly the operator can set the hostname with -h.」とあるので、以下のように-hオプションを追加します。

hostnameを指定してrun
sudo docker run -h master -it --rm --name master --env ROS_HOSTNAME=master osrf/ros:jade-desktop-full roscore

これで、無事コンテナのhostnameがmasterになり、roscoreを立ち上げることができました。

ノード用のコンテナ立ち上げ

次のコンテナ(talkerノード分)を立ち上げると、以下のようなエラーメッセージを吐いてtalkerノードが意図通り動きません。

実行結果
Couldn't find an AF_INET address for [master]
Couldn't find an AF_INET address for [master]
Couldn't find an AF_INET address for [master]
Couldn't find an AF_INET address for [master]
(以下同じ)

どうやらmasterの名前解決ができてない様子。dockerのリファレンスを見ると

--add-host=""    : Add a line to /etc/hosts (host:IP)

と書いてありますので、以下のように--add-hostでmasterとそのIPアドレスを静的に指定して対応します。

add-host(talkerノード実行)
sudo docker run  --add-host="master:masterのIPアドレス" -h talker -it --rm --name talker --env ROS_HOSTNAME=talker --env ROS_MASTER_URI=http://master:11311 osrf/ros:jade-desktop-full talker

これで意図通り動きました。
最後は、listenerです。--add-hostするのはmasterだけでなく、talkerの分も必要になることに気をつけてください。

add-host(listenerノード実行)
sudo docker run -it -h listener --add-host="master:masterのIPアドレス" --add-host="talker:talkerのIPアドレス" --rm --name listener --env ROS_HOSTNAME=listener --env ROS_MASTER_URI=http://master:11311 osrf/ros:jade-desktop-full listener

これでうまく動きました。次のステップに進めそうです。

akachochin
(I'm software engineer in Japan.) おじさんだけど、お仕事ではNetBSD/Linuxカーネルのソースコード読んでる時間が7割程度。エラくはなれないけど、それなりに上々かな。趣味はお名前の通り、居酒屋めぐり。場末の飲み屋でHoppy飲むのが至福です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away