dockerでROSを動かす。(ホストでGUI【rviz】を起動)


Docker上でROSパッケージを動かして、ホストでrvizを動かす。

ここ1週間ぐらいで勉強したことです。(docker初心者です)

普段ローカル環境やanacondaの仮想環境でROSを動かしていたけど、
DockerでROSを動かした方が研究室の引き継ぎやPC間の移動が楽かなと思い、Docker導入してみた。
普段ローカル環境でROSを動かしていて(自分のPCにROSがあれば○)、
Docker上でもROSを動かしてみたい人が対象です。

環境

ubuntu 16.04
ros kinetic
 (なんでもいいはず)
Docker version 19.03.12(インストールは省きます)

leg_trackerを試す

こちらを試していきます。(これ以外すぐにdemoできるやつが見つからなかった)
https://github.com/angusleigh/leg_tracker.git

bagfileも公開しており、demoですぐ動くのでこちらをdocker上で動かして
ホストでrviz(GUI)の立ち上げをやっていきます。

今回はこちらをピックアップしてますが、手元にbagfile などがあれば、だいたいのパッケージは以下の手順で動きます。

1.docker用のフォルダを作成

下記のようなフォルダを以下のコマンドで作ってください。

$ mkdir -p ~/ros_docker/mount
$ cd ~/ros_docker/mount
$ git clone https://github.com/angusleigh/leg_tracker.git
$ cd ~/ros_docker && touch Dockerfile

ーros_docker(ファルダ)
|ーDockerfile(ファイル:拡張子なし)
|ーmount(フォルダ)
 |ーleg_tracker

2.Dockerfileを開いて以下を記入


FROM osrf/ros:kinetic-desktop-full

RUN mkdir -p /home/catkin_ws/src && \
    cd /home/catkin_ws/src && \
    /bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_init_workspace" && \
    cd /home/catkin_ws && \
    /bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_make" && \
    echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc && \
    echo "source /home/catkin_ws/devel/setup.bash" >> ~/.bashrc && \
    echo "export ROS_PACKAGE_PATH=\${ROS_PACKAGE_PATH}:/home/catkin_ws" >> ~/.bashrc && \
    echo "export ROS_WORKSPACE=/home/catkin_ws" >> ~/.bashrc

ENV DEBCONF_NOWARNINGS yes
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y python-scipy && \
    curl -kL https://bootstrap.pypa.io/get-pip.py | python && \
    pip install munkres && pip install pykalman

WORKDIR /home/catkin_ws/

3.host側の準備

今回はhttps://github.com/angusleigh/leg_tracker
にある通りroslaunch leg_tracker demo_stationary_simple_environment.launchを起動します。なのでコンテナではrvizは起動しないので、mountフォルダにあるdemo_stationary_simple_environment.launchをhost側から好きなエディタでrvizのコメントアウトをしてください。

<!-- コメントアウト --> 
<!-- run rviz --> 
  <!-- <node pkg="rviz" type="rviz" name="rviz"
    args="-d $(find leg_tracker)/rosbags/demos/rviz/demo_stationary_simple_environment.rviz"/>   -->

準備完了、、、おそらく。

4.docker buildする

pull は自動でやってくれるので省略

$ cd ~/ros_docker && sudo docker build --tag ros:leg .
###最初だけ時間かかります###
###確認###
$ sudo docker images -a
###以下のようになっていればおk
REPOSITORY                     TAG  ,,,,,,(省略),,,,,,                       
ros                            leg  ,,,,,,(省略),,,,,,

5.docker run する

一回きりなので --rm オプションをつけてます。(何回か使う場合は外してください)
今回一番共有したかった事!!!
hostでrvizを立ちあげるので、--net=hostとする。

sudo docker run -it --rm  \
    -v ~/ros_docker/mount:/home/catkin_ws/src \
    --name sample \
    --net=host \
    ros:leg bash
###以下コンテナでの作業

6.catkin_make する

rootで入ってしまうのでこのあたりは改善の余地ありですが、基本的に問題無いかと思います。
再度読み込みも。

root@XXXXX:/home/catkin_ws# catkin_make

###こんな感じ###
####
#### Running command: "cmake /home/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/catkin_ws/install -G Unix Makefiles" in "/home/catkin_ws/build"
####

root@XXXXX:/home/catkin_ws# source /home/catkin_ws/devel/setup.bash

7.コンテナでroslaunch する

root@XXXXX:/home/catkin_ws# roslaunch leg_tracker demo_stationary_simple_environment.launch

コンテナでの作業おしまい。
さてここでrvizを立ち上げたいのですが、再度コンテナ(sample)に
sudo docker exec -it sample bash で入ってもいいですが、CUIの操作(rostopic echo など)ならできますが、GUIを系はできないので(設定すればできますが今回は極力簡単かつ普段の使用感と同じであることを目指しました。)
host側でrvizを起動します。

8.rvizで確認する

$ rviz

必要あればaddからtopicを追加
rvizで立ち上がれば完了、、、。

9.最後に

コンテナはexitすれば削除されます。image も必要なければ docker rmi ros:legで削除
また再度使うようであれば --rm オプションを外してください。
そして2度目以降は
docker start sample && docker exec -it sample bash で
catkin_makeせずにコンテナがすぐに使えます

rosのipなどでホスト側にroscoreするなどありましたが、以下の問題からかmessageが受け取れずこのようにしました。
https://qiita.com/ossyaritoori/items/b2336451583ce40d1b9a

だれかのお役に立てれば幸いです。

参考文献

https://github.com/angusleigh/leg_tracker
https://qiita.com/tomoyafujita/items/07937a25bc48aa076056
https://qiita.com/ossyaritoori/items/b2336451583ce40d1b9a
https://qiita.com/tnarihi/items/275c009e9dec1306893f
https://datawokagaku.com/whatisdocker/