VTC上のロボットをROSのnavigation_stackで動かす

# この記事について
 Unreal Engine上で動く移動ロボットシミュレータ[VTC](https://github.com/furo-org/VTC)上のロボットをROSのnavigation stackで動かしたので、そのセットアップについて記載した。
追加したコードや各種ライブラリのinstall方法については[ここ](https://github.com/yuataka/vtc_move_base_test)にある。

# 構成
構成としては下記のようにWindows PC上でVTCを動かし、別のLinux PC側のrvizにnav_goalを入力して、それをもとにmove_baseがcmd_velを決定して、cage_ros_stackに受け渡し、cage_ros_stackがcmd_velをVTCに受け渡して、VTC上のロボットがnav_goalまで移動するという風になっている。
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/0290b49d-ea95-f454-636d-4da237a9f2cc.png)

# 動作環境
　VTCはUnreal EngineをインストールしたWindows上で動かし、ROSはUbuntuをインストールした別のPCで動かす。
##　Windows側の動作環境
* Windows10 2004 64bit
* Unreal Engine 4.254

## Ubuntu側の動作環境
* Ubuntu18.04
* ROS Melodic

# 各種セットアップ
## Windows側のセットアップ
 VTCの製作者が基本的なセットアップ方法について書いているので、それを参考にセットアップする。
https://github.com/furo-org/VTC/blob/TC2020/docs/editor.md

## Ubuntu側のセットアップ
 * ROS Melodic
 
     ROSのインストールについては[ここ](http://wiki.ros.org/melodic/Installation/Ubuntu)を参照する

 * octomap
 
     point cloudからoccupancygridを生成するのに使用する
   
```
sudo apt-get install ros-${ROS_DISTRO}-octomap
```
 
 * move_base
     nav_goalを受け取り、occupancygridをもとにパスを生成して、制御信号であるcmd_velをpublsihする。

```
sudo apt-get install ros-${ROS_DISTRO}-move-base
```

 * vtc_move_base_test
rvizのnav_goal入力後にpublsihされるgeometry_msgsのPoseStampedをmove_baseで利用されるmove_base_msgsのMoveBaseActionGoalに変換してpublishする。 

```
cd ~/catkin_ws/src
git clone https://github.com/yuataka/vtc_move_base_test.git
cd ..
catkin_make
```
 * [cage_ros_stack](https://github.com/furo-org/cage_ros_stack)

    ubuntu PC側でVTCとのやりとりを行う。インストールに関してはリンク先を参照。
 
# Move_baseの設定

navigation_stakの設定に関しては[ROS公式のTutrial](http://wiki.ros.org/ja/navigation/Tutorials/RobotSetup)をもとに行った。各種configファイルは[ここ](https://github.com/yuataka/vtc_move_base_test/tree/master/config)にある。Turtrialとは各種frameとcostmap_common_params.yamlで、laser_scan_sensorからpoint_cloud_sensorに変更したところが異なる。

# 実行
### VTCを実行する

[VTCのセットアップ](https://github.com/furo-org/VTC/blob/TC2020/docs/editor.md
)を終えた状態でVTC.uprojectをクリックすると下記のようになる。
![VTC - Unreal Editor 2021_07_27 13_12_46 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/90ee2175-92b2-00c4-27cb-48041a6f2bd7.png)

右上のプレイを押すと下記のような画面になるので、Randomize Layoutを押す。
![VTC - Unreal Editor 2021_07_27 13_06_49 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/4c173fc0-a48b-6d68-cefb-08c7e569a36d.png)
これでVTCの実行は完了。カラーコーンの先のロボットを別のPCからROSで動かす。
![VTC - Unreal Editor 2021_07_27 13_15_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/30637fa5-cd88-a7a7-85f5-86982f599b46.png)

### cage_ros_stackを起動する
下記コマンドをLinux PC側で実行することでcage_ros_stackを起動する。Windows側のIPアドレスは調べて、パラメーターとして受け渡す必要がある。

```
roslaunch vtc_bringup bringup.launch ip:=[your Windows PC IP address]
```

### octomap、move_base等を起動する

```
roslaunch vtc_move_base_test vtc_map_move.launch 

```

# 動作結果
VTC側の動作
![vtc_output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/e24c53e4-a4bc-fc8c-bcbd-abef95aea0ea.gif)

Rviz側の操作
![rviz_output(2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352014/d653dbcc-d8dc-ab4c-6392-3bd81de2fea4.gif)
#今後の改良点
今の構成だとoctomapが自己位置にIMUの情報のみを利用しているので、自己位置推定のために何らかのslamのライブラリをかませる必要がある。lio-samとLego-loamをとりあえず試してはいるが、Lego-loamは回転方向の蓄積誤差が多く問題がある。lio-samについては、おそらくVTC側のLiDARとIMUのタイムスタンプに問題があるのか、振動が起こるため、VTC側でどのようにタイムスタンプをつけているか確認する必要がある。