
## シミュレーションの実行手順

2021.11.11 Eiichi Inohira

## システム要件

OS: Ubuntu 18.04
Hardware: NVIDIA GPU
App: docker, tmux
Programming Language: Python, Bash

## Step 0 リポジトリのクローン (初回のみ)

### 0.1 ディレクトリの作成と移動

以下のコマンドでホームディレクトリの下にディレクトリを作成する。

```
mkdir gazebo_RoIS_ws && cd gazebo_RoIS_ws &&
```

### 0.1. リポジトリをクローンする。

```
git clone https://inohira.mns.kyutech.ac.jp/git/tanacchi/gazebo_RoIS_tanacchi.git src
```

## Step 1 (初回のみ)

シミュレーション用のコンテナイメージを作成する。

### 1.1. dockerコンテナを用いてgazeboを起動する。

ターミナルで以下のコマンドを実行する。
```
/src$ bash run_docker.sh
```

### 1.2. コンテナを実行したままターミナルへの復帰

gazeboのウィンドウが起動後ターミナルへの文字出力が止まったらCtrl-p, Ctrl-qを押す。

### 1.3. ターミナルにシェルプロンプトが表示されるので以下のコマンドを実行する。

```
/src$ docker commit sim mysim:melodic-1.10
```

実行中のコンテナのイメージがmysim:melodic-1.10で出力される。
このコンテナイメージを用いてシミュレーションを実行する。

### 1.4. gazeboを終了させるため以下のコマンドを実行する。

```
/src$ docker container stop sim
```

## Step 2

シミュレーションを実行する。

### 2.1. 起動スクリプトを実行する。

```
bash setup_tmux_im.sh
```

tmuxにより複数のセッションが作成され、それぞれのセッションでコマンドが実行される。

1. gazeboの起動とロボットモデルの生成
2. ヒューマンモデル(human1)の生成とteleop_keyboardノードの起動
3. HRI Componentの起動
4. HRI Engineの起動
5. Service Applicationの起動
6. ヒューマンモデルの自動操作によるシミュレーションの自動開始

以上のコマンドが自動的に実行される。自動実行によって、ロボットモデルがhuman1の近くに移動する。
以上のコマンドはt_all.shに書かれている。

セッションの切り替え画面は、Ctrl-b, w（Ctrlを推しながらキーbを押した後両方のキーから指を離し次にキーwを押す）で表示できる。切り替え画面でセッションをカーソルキーで選択し、Enterキーを押すとセッションが切り替わる。

### 2.2. ロボットモデルへの指示

何も操作しなければ、上記の6.のセッションでヒューマンモデルの自動操作完了後にシェルプロンプトが表示される。
'point a'という指示をロボットモデルに送るため以下のコマンドを実行する。

```
docker exec -it sim bash src/t_all.sh t5o
```

コマンド実行後、ロボットモデルはあらかじめ設定されたa地点に移動する。
移動完了を持ってシミュレーション完了となる。

### 2.3. シミュレーションの終了

Ctrl-b, dを推すとtmuxの画面から元のターミナルに復帰できる。

ターミナルで以下のコマンドを実行する。

```
bash close_tmux.sh
```

上記で起動したコンテナ、プログラムをすべて終了させる。

## 改良点

田中氏のプログラムには以下の問題があった。

1. 使用するパッケージのバージョンが固定されておらず実行環境が一定ではないため、シミュレーション実行時にエラーが発生する場合がある。
2. ホストにインストールパッケージ数が1000を超えるため問題発生時に原因の特定、対処が困難である。
3. 少なくとも5個のターミナルを同時に使用し、正しいタイミングでコマンドを実行する必要がある。
4. RoIS Frameworkへの準拠が不完全である。

これまで実行環境の問題は猪平がdockerブランチにおいてdockerコンテナを用いたシミュレーションの実行を試みていた。
また、devブランチにおいて東亮太氏の成果に基づきpython package(pyrois, pyrois-common)を用いたRoIS Frameworkへの準拠が試みていた。
これらの成果に加え、tmuxとwait-for-itを用いたシミュレーションの自動開始プログラムを作成した。

dockerコンテナはlinuxホスト上の隔離された実行環境であり、同じコンテナイメージを使用する限りシミュレーションの実行環境は一定となる。ホストとコンテナイメージは分離されているため、ホストのパッケージを更新しても影響を受けない。
tmuxを用いてセッションを多重化し、それぞれのセッションでコマンドを実行するスクリプトsetup_tmux.shを作成した。これにより、コマンドの自動起動とともにそれぞれのコマンドの出力結果も確認できるようになっている。また、wait-for-itコマンドとpythonスクリプトを使用して、各種サーバプログラムの起動を待ってから所定のコマンドを実行するようになっている。それにより、シミュレーションの自動開始を実現している。
独自に実装したHRI ComponentであるVirtualNavigation.py, Dummy_Speech_Recognition.py, Navigation.py, Person_Localization.pyを除くと、PyPIからインストール可能なpyrois, pyrois-commonを使用しており、独自実装部分も含めRoIS Frameworkに準拠したプログラムに修正されたいる。
以上のようにして問題点は解決された。

## ソースコードの修正方法

### run_docker_im.sh

コンテナイメージ名を変更する場合は'mysim:melodic-1.10'を修正する。
複数ロボットのシミュレーションの場合はstart_im.sh、単一ロボットの場合はstart_i.shを使う。

```
docker run -it --rm --name sim --gpus all \
  -e DISPLAY=$DISPLAY -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
  --device /dev/snd -v "${PWD}:/root/src" \
  mysim:melodic-1.10 bash /root/src/start_im.sh
```

### setup_tmux.sh

必要に応じてtmuxのセッションを追加・削除、セッション内で実行されるコマンドを修正する。

send-keysの次のオプションが作成したセッション内に入力されるコマンドで、C-mがコマンドの実行キーを表す。C-mを削除するとコマンドを入力するだけとなりコマンドは実行されない。

```
tmux new-session -d \; \
    send-keys "bash run_docker_im.sh" C-m \;
```

コンテナ内でコマンドを実行するために```docker exec```コマンドを使う。
1行では書けないのでシェルスクリプトt_all.shを使う。

```
tmux new-window \; \
    send-keys "docker exec -it sim bash src/t_all.sh t5" C-m \;
```

### t_all.sh

tmuxのセッション内で実行される処理が書かれている。
複数のセッションの処理を1個のファイルにまとめるためcase文を利用している。
t_all.shのオプションによって処理が切り替わるようになっている。

```bash
case $1 in
    "t2" )
        wait-for-it localhost:11311 -- echo "ready"
        roslaunch rois_gazebo spawn_human.launch
        ;;
```

wait-for-itコマンドによって、roscoreに接続可能になるのを待ってからroslaunchが起動する。
これがないと、roscoreよりもroslaunchが先に起動する可能性があり、その場合エラーになる。
sleepコマンドにより一定時間待機させる方法が考えられるが、待機時間はホストの負荷、処理速度に依存するため一定ではない。
他のセッションも同様に必要なサーバプログラムが接続可能になるまで待機するようになっている。


# References

- [Ubuntu 18.04]()
- [Docker Documentation](https://docs.docker.com/)
- [tmux](https://github.com/tmux/tmux/wiki)
- 