# シミュレーションの実行方法(with pyRoIS_higashi)
pyRoIS_higashiのHRIエンジンを用いたシミュレーションの実行方法は以下の通りです。


## 環境
- OS: Linux 18.04  
- ROS: ROS merodic

まず[公式サイト](http://wiki.ros.org/melodic/Installation/Ubuntu)を参考にROSのインストールをし、以下の要領でセットアップ。


## セットアップ
```shell
$ mkdir gazebo_RoIS_ws
$ cd gazebo_RoIS_ws 
$ git clone --recursive https://inohira.mns.kyutech.ac.jp/git/tanacchi/gazebo_RoIS_tanacchi.git src
# "--recursive"を付けることで サブモジュールも合わせてcloneできる
$ cd src
$ catkin_init_workspace
$ sh install_packages.sh
$ cd ..
$ catkin_make
$ echo "source ${PWD}/devel/setup.bash" >> ~/.bashrc` # 必要があれば 
```

<!-- ## pyRoIS_higashi
gazebo_RoIS_tanacchi/route_guidance_ros/scriptsリポジトリにpyRoIS_higashiのgazebo_roisブランチをサブモジュールとして接続している。
submoduleのインストールは以下の通り。
```shell
git submodule update --init --recursive
``` -->

## シミュレーション実行方法
ロボットサービスのシミュレーションの実行方法を起動するターミナルごとに分けて説明する。  
ワークスペースのディレクトリ(セットアップの通りであればgazebo_RoIS_ws)の上で下記を実行する。

#### ターミナル1
シミュレーション環境，ロボットモデル，自律移動のためのROSノードを起動する．use_multi_robot 引数をtrue にすると複数ロボット用の，falseにすると単一ロボット用のシステムが起動する．true の場合は省略可能．現時点では単一ロボットによるテストのみ成功しているためここではfalseとする．
```shell
$ roslaunch rois_bringup navigation.launch use_multi_robot:=false
```

#### ターミナル2
ユーザのモデル，ユーザの自己位置推定，キーボード操作のためのROS ノードを起動する． ユーザのモデル操作はこのターミナルにフォーカスした状態でキーボードを操作する． キーボード操作の方法はteleop_twist_keyboard の公式サイトを参照されたい．
```shell
$ roslaunch rois_gazebo spawn_human.launch
```
キーボードによる操作方法が示された後、下記エラーメッセージが表示された場合、上記プロセスを中止(ctrl+c)し、メッセージと同じように実行する
```shell
$ sudo rosdep init
$ rosdep update
```
上記1行目を実行し、rosdepが存在しなかった場合は下記を実行しrosdepをインストールする．そののち、再度上記の1行目、2行目と実行する．
```shell
$ sudo apt-get install python-rosdep
```

#### ターミナル3
route_guidance パッケージのscripts ディレクトリに移動する．
Python3 インタプリタからRoIS Framework におけるHRI コンポーネントを起動する.
```shell
$ roscd route_guidance_ros/scripts/  
$ python3  
>>> import setup_comp_servers
>>> setup_comp_servers.setup_single_robot()
```

#### ターミナル4
HRIエンジンを実行する．
```shell
$ roscd route_guidance_ros/scripts/
$ export PYTHONPATH="$(pwd)/pyRoIS_higashi:$PYTHONPATH"
$ python3
>>> from pyRoIS_higashi import HRI_Engine_sample
>>> HRI_Engine_sample.test_engine(8000,"engine_profile_gazebo", "client_info_gazebo", None, None)
```

#### ターミナル5
サービスアプリケーションを実行する．route_guidanceパッケージのscriptsディレクトリに移動する必要があることに注意．
```shell
$ roscd route_guidance_ros/scripts/
$ export PYTHONPATH="$(pwd)/pyRoIS_higashi:$PYTHONPATH"
$ python3 service_app_with_eng_client.py
```
ここで、ターミナル2 にフォーカスしキーボードからユーザを少し操作してhuman1/amcl ノードに自己位置推定結果をパブリッシュさせる．パブリッシュされ次第，ユーザの位置に向かってロボットの自律移動が開始される．

#### ターミナル6
Speech Recognition コンポーネントに文字列を送信する．"point_a"は送信される文字列である．
```shell
$ rostopic pub /robot1/detected_text std_msgs/String "data: 'point_a'"
```
送信された文字列が目的地の名称として有効であれば，その地点に向かって自律移動が開始される．有効な目的地の名称と座標の関係を次に示す．

point_a: (25, 20, 0), 
point_b: (25, 10, 0), 
point_c: (25, 0, 0), 
point_d: (15, 0, 0), 
point_e: (10, 0, 0), 
point_f: (0, 0, 0), 
point_g: (0, 0, 0), 
point_h: (0, 10, 0), 
point_i: (0, 20, 0), 
point_j: (0, 20, 0)