# Dockerを用いたGazeboの実行

Dockerコンテナ内に必要なROS環境を用意しGazeboを実行する。1個のDockerイメージをダウンロードするだけで実行環境が整う。Dockerイメージに含まれるdebパッケージ数はおよそ700である。

## System requirements

* amd64 PC
* NVIDIA graphic card
* Ubuntu 18.04
* Docker
* NVIDIA driver
* NVIDIA Container Toolkit

Dockerイメージeinohira/ros:gazebo-nvはNVIDIA graphic card上で描画することを前提としている。
AMD/ATI graphic card、およびIntel内蔵グラフィクスを利用する場合は、run_docker.shを修正する必要がある。

## Build environment

* Core i5 9600k
* NVIDIA GeForce GT 1030
* Ubuntu 18.04
* Docker Engine Community Edition 19.03.7
* NVIDIA driver 440.64
* NVIDIA Container Toolkit 1.0.5

### Dockerのインストール

https://docs.docker.com/install/を参考にDockerをインストール

```docker run hello-world```が正常に実行できれば成功

### NVIDIA driverのインストール

おおまかな流れ

1. https://www.nvidia.co.jp/download/index.aspx?lang=jpからLinux用のドライバをダウンロード
1. 標準でインストールされるドライバnouvueaをblacklistに入れ、起動時にロードされないようにする
1. 再起動する
1. GUI環境ではドライバをインストールできないので、```sudo init 1```でシングルモードに移行する
1. ./NVIDIA*.runを実行し、ドライバをインストールする
1. ドライバのインストールに成功したら再起動する  

### NVIDIA Container Toolkitのインストール

Dockerコンテナ内でGPUを利用可能にするために、NVIDIA Container Toolkitをインストールする。

Docker, NVIDIA driverをインストールした後に、

https://github.com/NVIDIA/nvidia-docker に従い、nvidia-container-toolkitパッケージをインストール

```
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-Docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart Docker
```

### Docker imageの取得

```
$ sudo docker pull einohira/ros:gazebo-nv 
```

### リポジトリの取得

作業用ディレクトリの作成

```
$ mkdir gazebo_RoIS_ws
$ cd gazebo_RoIS_ws
```

リポジトリの取得とブランチの切り替え

```
$ git clone https://inohira.mns.kyutech.ac.jp/tanacchi/gazebo_RoIS_tanacchi.git src
$ cd src
$ git checkout docker
```

### containerの起動

```
$ bash run_docker.sh
```

内部で、simという名前のDockerコンテナを起動し、コンテナ内で初期化を行う。初期化後、Gazebo, rvizのウィンドウが表示される。

### terminal 2

```
$ sudo docker exec -it sim bash
# . devel/setup.bash
# roslaunch rois_gazebo spawn_human.launch
```

人間のモデルがシミュレーション内に出現し、キーボードによる遠隔操作が可能となる。

### terminal 3

```
$ sudo docker exec -it sim bash
# . devel/setup.bash
# roscd route_guidance_ros/scripts/
# python3
>>> import utilities
>>> utilities.setup_single_robot()
```

HRI Component, HRI Engineが起動する

### terminal 4

```
$ sudo docker exec -it sim bash
# . devel/setup.bash
# roscd route_guidance_ros/scripts/
# python3 service_app_lv2.py
```

Service Applicationが起動する

### terminal 5

```
$ sudo docker exec -it sim bash
# . devel/setup.bash
# rostopic pub /robot1/detected_text std_msgs/String "data: 'point_a'"
```
# Dockerfile

nvidia/openglをbase imageとし、ros:melodic-ros-coreのDockerfileの内容を加えて、さらにシミュレーションに必要なパッケージを追加したものである。
