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用のフォルダを作成

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

```Bash
$ 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を開いて以下を記入

```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のコメントアウトをしてください。

```html
<!-- コメントアウト --> 
<!-- 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 は自動でやってくれるので省略

```Bash
$ cd ~/ros_docker && sudo docker build --tag ros:leg .
###最初だけ時間かかります###
###確認###
$ sudo docker images -a
###以下のようになっていればおｋ
REPOSITORY                     TAG  ,,,,,,(省略),,,,,,                       
ros                            leg  ,,,,,,(省略),,,,,,
```
###5.docker run する
一回きりなので　--rm　オプションをつけてます。(何回か使う場合は外してください)
**今回一番共有したかった事！！！
hostでrvizを立ちあげるので、--net=hostとする。**

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

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

```Bash
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"
####
```

```bash

root@XXXXX:/home/catkin_ws# source /home/catkin_ws/devel/setup.bash
```
###7.コンテナでroslaunch する

```bash
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で確認する

```bash
$ 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/