Docker上のROSアプリケーションをホスト側のGUIで表示する


## 概要
* ホスト側のGUIでdocker上のROS系アプリケーションを起動する方法を紹介します
* 簡単に使える dockerfile がなかったので作って公開しました → [chikuta-dockerfiles](https://github.com/chikuta/chikuta-dockerfiles)

## 検証環境
今回検証した環境は以下になります。

**Hardware**
cpu - AMD Ryzen 9 3900X
gpu - Geforce RTX 2060 super
ram - 32G

**Software**
os - ubuntu 20.04.1
kernel - Linux define 5.4.0-48-generic
docker - 19.03.13
nvidia-driver - 450.66
cuda version - 11.0

`nvidia-smi` の出力を添付しておきます。

```bash
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.66       Driver Version: 450.66       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 206...  Off  | 00000000:0E:00.0  On |                  N/A |
| 38%   40C    P8    11W / 175W |    916MiB /  7979MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
```

## 環境整備
最初にnvidia-container-runtimeをインストールします。

```bash
# apt 関連設定
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

# nvidia-container-runtimeインストール
$ sudo apt update
$ sudo apt install nvidia-container-runtime

# docker service の再起動
$ sudo systemctl restart docker.service
```

次に docker group に自身の UID を登録します。docker を使っている人はやっていると思いますが念の為。

```bash
$ sudo usermod -a -G docker `id -un`
$ sudo systemctl restart docker.service
```


## 実行方法
次に dockerイメージのビルドを行います。

```bash
$ git clone https://github.com/chikuta/chikuta-dockerfiles.git
$ cd chikuta-dockerfiles
$ ./docker/ros-bionic-melodic/build-docker-image.bash
```

次に以下のコマンドを実行することでビルドしたイメージのコンテナを起動できます。スクリプトの中身はxhost周りの処理とdockerの引数をラッピングしたものです。必要に応じて編集をすれば自分の環境を作れるで積極的にカスタマイズしましょう。

```bash
$ cd chikuta-dockerfiles
$ ./docker/ros-bionic-melodic/run-docker-container.bash
```

スクリプトを実行するとterminatorが立ち上がります。これは dockerコンテナ上で動いているターミナルアプリケーションになるため、ここで実行したコマンドは全てdockerコンテナ上で処理されます。

コンソールをデフォルトの赤色から青色に変更しているのがおしゃれですね。
![terminator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62361/8225cd02-0496-ecbb-4a09-534cd76fbfcf.png)

terminatorを起動するアイディアは[shadow-robot](https://github.com/shadow-robot/sr-build-tools)のdockerfileを参考にしています。本家はdockerfile上でansibleを実行する過剰な仕様なので必要なところだけを抽出してコンパクトにまとめました。

最後に基本的なGUIアプリを立ち上げてみましょう。

```bash
# 1st terminal
$ roscore

# 2nd terminal
$ rviz

# 3rd terminal
$ gazebo
```

![gazebo_rviz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62361/6c01a68e-dd1f-91b5-95be-5f10616de54d.png)


## 参考
* https://waldeinsamkeit.hatenablog.jp/entry/2019/08/17/002854
* https://nvidia.github.io/nvidia-container-runtime/
* https://medium.com/@benjamin.botto/opengl-and-cuda-applications-in-docker-af0eece000f1