LGSVL SimulatorとAutowareによる自動運転チュートリアル

# Autowareとシミュレータ
こんにちは、株式会社ティアフォーにてROSによる自動運転オープンソースソフトウェアである「Autoware」の開発に取り組んでます片岡です。
自動運転で一番大変なのは実験だと個人的に考えています。
許可をとって場所を抑えて車両を手配して・・・・超時間がかかります。
そこで重要なのがシミュレータです。
シミュレータならものの10秒で実験環境を用意することが可能で事故ったとしても誰にも迷惑がかかりません。
Autowareでは過去にcat_vehicleというgazeboベースのシミュレータをサポートしていたことがあったのですがいろいろと依存パッケージが古くなり誰もメンテしていないところまで来てしまったためまともなシミュレータがない状況がずっと続いていました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/NgW1P75wiuA/0.jpg)](https://www.youtube.com/watch?v=NgW1P75wiuA&t=2s)
すると今年のROSCONにおいて突如LG電子さんのシリコンバレー研究所がAutowareとAppolo対応の自動運転シミュレータつくったよ！！！というニュースが飛び込んできてこれはもうこの流れに乗るしかないということで現在こちらのシミュレータをサポートするべく作業を進めています。(https://github.com/CPFL/Autoware/issues/1724)
もちろん他のシミュレータは今後一切サポートしないとかではなく当面これに合わせてミニマムな仕様を作っていろんなシミュレータとAutowareのインターフェースを共通化していこうと企んでいます。ご意見いただけたらすごく喜びます。

今回はROSアドベントカレンダー初日ということで街一個シミュレーションしてその中で最もミニマムな構成でAutowareを動かして遊ぶというチュートリアルができればと思っています。

# 用意するもの
1. Linuxマシン(シミュレータ専用のWindows専用マシンがあるとなおよし)

```
CPU Core i7以上 : 8スレッド以上、第八世代だとコンパイルが早くて快適なのでおすすめです。　
GPU GTX 1060以上 : Yoloによる物体検知がしたい場合このくらいは必要です。
メモリ 32GB以上 : Autoware + Simulatorで17~18GB程度は常時消費します。
```
1. ハンドルコントローラ  
Waypointを作成するときにあるとかなり楽です。
このチュートリアルではこのLogicool製[G29ハンドルコントローラ](
https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-LPRC-15000-PLAYSTATION4-PLAYSTATION3%E5%AF%BE%E5%BF%9C-8-1%E3%80%81Windows/dp/B00ZQNBTJW)を使います。　　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/0aa13d3f-40ec-3082-3e9f-b11e8d7952dd.png)
これ以外のハンドルコントローラだとキーアサインがずれてこのチュートリアル通りにやっても車両への制御司令が正しく出ない可能性がありますのでご了承ください。

# LGシミュレータのビルド
LGシミュレータのリポジトリは[こちら](https://github.com/lgsvl/simulator)になります。
バイナリの量が結構あるのでgit lfsで管理されています。
入れていない場合は以下の手順でインストールしておいてください。

```
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt update
sudo apt install git-lfs
```

またLGシミュレータはUnityベースですのでビルドにはUnityが必要です。
[こちら](https://beta.unity3d.com/download/dad990bf2728/public_download.html)からLinux向けのUnityをインストールしておいてください。
次にシミュレータのコードをダウンロードします。

```
git clone https://github.com/lgsvl/simulator.git
```

ただし現状のシミュレータではLidarシミュレーションに不備がありモデルをカスタムする必要があります。
以下のコマンドでカスタムしたLidarのモデルをダウンロードしてください。

```
git clone https://github.com/Tomoya-Sato/lg_velodyne
```
ダウンロードした中にあるLidarSensor.csとシミュレータ内部にあるLidarSensor.csを差し替えXE_Rigged-autoware32.prefabをXE_Rigged-autoware.prefabにリネームした後でシミュレータ内部にあるXE_Rigged-autoware.prefabを上書きしてください。
現在この変更はシミュレータのリポジトリにPRを出していて通るのを待っている状態です。
次にUnityEditorを開いてプロジェクトをビルドしてください。

# Autowareのビルド
シミュレータのビルドが完了したらAutowareをビルドします。
[こちらの手順](https://github.com/CPFL/Autoware/wiki/Source-Build)にしたがってAutowareをビルドしてください。
下記のjoy_vehicle_cmd_senderでAutowareのパッケージを利用するので以下の一文を.bashrcに書き込んで環境変数を通しておいてください。

```
source ~/Autoware/ros/devel/setup.bash
```


# joy_vehicle_cmd_senderのビルド
次に以下の手順でjoy_vehicle_cmd_senderをビルドします。

```
sudo apt install ros-kinetic-rosbridge-server
git clone https://github.com/hakuturu583/joy_vehicle_cmd_sender
cd <catkin_ws>
catkin_make
```

# Waypointの作成
まずはAutowareで追従したい経路を作成します。

## 点群地図等のダウンロード
```
mkdir ~/shared_dir && cd ~/shared_dir
git clone https://github.com/lgsvl/autoware-data.git
```

## Simulatorの立ち上げ
UnityEditorを開きBuild&Runを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/ead73f2b-42ec-2de3-2fb6-6903add1f9d5.png)
こちらの画面まで進んだらFree Roamingを選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/89fef269-a8ec-12db-98bb-f01ee724d527.png)
この画面まで来たらAutowareを立ち上げてください。

```
cd ~/Autoware/ros/
./run
```

Autowareが立ち上がったらruntime_managerという以下のUIが立ち上がります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/b5679e33-6d9b-d5a6-adc2-bec86d3d9d7f.png)
Mapタブを開きPointcloudmapに

```
autoware-data/data/map/pointcloud_map_sf_portion/
```
内部に含まれるpcdファイルをすべて入力してPointCloudのボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/6d95124a-a8f4-61fc-9616-e06837d35039.png)

次にG29ハンドルコントローラがPCにつながっていることを確認したあと以下のコマンドでjoy_vehicle_cmd_senderおよびrosbridge_serverを起動します。

```
roslaunch joy_vehicle_cmd_sender sender.launch
```

その後シミュレータのウインドウに移動してRUNをクリックします。
すると以下のような画面に移行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/4f20c852-a995-94c0-a937-222f73d12a3b.png)
Autowareでは自己位置推定にLidarセンサの情報を使用するのでEnable Lidarのチェックボックスにチェックをいれてください。

## Autowareによる自己位置推定
sensingタブを開きvoxelgrid_filterのチェックを入れcomputingタブに移動した後ndt_maching,voxel_grid_filterにチェックを入れてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/dab39ffa-b92a-de85-43d1-d5902f9684ee.png)

次にrvizを立ち上げ2DPoseEstimateによって自己位置推定の初期姿勢を与える。
点群地図とシミュレータからの点群を比較し自己位置推定がハマったとおもったらいよいよWaypointを作る段階に入ります！！

## Waypointの作成
G29ハンドルコントローラを用いてWaypointを作成します。
computingタブを開いてwaypoint_saverを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/b1185e3a-4eb1-2f7f-d3c8-1ab9ed563315.png)
そしてその後G29を使ってシミュレータに/vehicle_cmdに速度司令を送るとwaypoint_severでwaypointが作られます！！楽しい！！
![iOS の画像.jpg](https://qiita-image-store.s3.amazonaws.com/0/160346/00aebf35-5991-fe8f-f29e-84d16e62ef20.jpeg)


# 自動運転開始
それでは作成したWaypointにしたがって自動運転をしていきたいと思います。
もう司令を手動で送る必要はないので

```
roslaunch joy_vehicle_cmd_sender sender.launch
```

は落としてください。
代わりに以下のコマンドでrosbridge_serverだけを立ち上げます。

```
roslaunch rosbridge_server rosbridge_websocket.launch
```

シミュレータ画面でResetをクリックして初期地点に車を戻します。
車が初期地点に戻ったので以前に書いた手順に従って自己位置推定をもとにもどしてください。


次にComputingタブを開いて必要なノードを立ち上げていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/3e743094-08f4-92e2-2403-8e3995b2aa04.png)
まずはlane_rule,lane_sotp,lane_selectを立ち上げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160346/bbe2dc0c-c3bf-698b-c5ab-16a27d45de06.png)
次にobstacle_void,velocity_set,pure_pursuit,twist_filterを立ち上げます。
最後にwaypoint_loaderを立ち上げます。
その際にappタブをクリックしてwaypoint_serverで作成したwaypointのcsvファイルが読み込まれていることを確認してください。
うまく行っていれば動画のように自動運転ができるはずです！！
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/npTvZ09ijPA/0.jpg)](https://www.youtube.com/watch?v=npTvZ09ijPA&t=109s)

# 最後に
今回はAutowareとそれに対応したシミュレータを使って最もミニマムな構成で自動運転する手順を紹介しました。
シミュレータ自体がAutowareをサポートしているだけのことはあってかなり少ない手間で自動運転までもっていくことができました。
現在このシミュレータとAutowareの組み合わせをさらに使いやすいものとするべくgithubのissue上で議論をしています。
(https://github.com/CPFL/Autoware/issues/1724)
今後はこのシミュレータをつかって大規模なシミュレーション（交通流ありの状態で複数のAutowareによる自動運転シミュレーション等）を行っていこうと考えています。
こんな機能がほしい！等の要望がございましたらぜひgithubのissueあるいはAutowareの[developer slack](https://autoware.herokuapp.com)までよろしくお願いします！！