自動運転シミュレータLGSVLとAutowareを連動させるまで2020年版

#初めに
事の発端は、[「自動運転シミュレータLGSVLのPythonAPIをインストールしてサンプルプログラムを実行する」](https://qiita.com/ddside/items/821194f289183a38a9d2)という記事を見て、自動運転シミュレータが動くということがわかり動かしてみました。その昔少し自動車関連の仕事をしたこともあり、OSSのシミュレータがリアルタイムで動作して、pythonでコントロールできるのは、面白いものでした。ここまでくると、やはり自動運転をやってみたい、ということで探すとLGSVLにAutoware組み合わせて遊べるとのことでやってみました。が、Webの情報が古いのか、思いのほかハマったので、記録を残しておくことにしました。チャレンジする人がいるといいのですが・・。

#参考サイト

[LGSVL Simulator: An Autonomous Vehicle Simulator](https://www.lgsvlsimulator.com/docs/getting-started/)

[Autoware.AI 1.12.0 with LGSVL Simulator](https://www.lgsvlsimulator.com/docs/autoware-instructions/)

#使用システム

- 4コア以上できれば4GHzのx64 CPU
- GForce GTX1060以上のGPU （少々遅くなりますが）
- メモリ16GB
- Ubuntu 18.04 64bit版

#セットアップ

#LGSVLのインストール

###GPUドライバのインストール
すでにインストールしている人は、nvidia-smiで確認してください。今回はDriver: 440.82、       CUDA: 10.2です。インストール方法は[これ](https://qiita.com/yoshiki9636/items/a8fa49b9d785d7b24642)を参考にインストールしてください。

この後、LGSVLで使用するlibvulkan1をインストールします。

```
$ sudo apt install libvulkan1
```

###LGSVLのダウンロードと動作確認

[ここから](https://github.com/lgsvl/simulator/releases/)Linux用のzipファイルをダウンロードします。今回は現時点の最新版2020.03を使います。

```
$ wget https://github.com/lgsvl/simulator/releases/download/2020.03/lgsvlsimulator-linux64-2020.03.zip
```

zipファイルを解凍します。

```
$unzip lgsvlsimulator-linux64-2020.03.zip
```

これで動作するはずです。

```
$ cd lgsvlsimulator-linux64-2020.03/
$ ./simulator
```

灰色のウィンドウが立ち上がるので、中央の「Open Browser...」をクリックしてください。Webブラウザが立ち上がります。

![Screenshot from 2020-05-20 14-14-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/b01aeb32-bd18-015f-fa5e-7a844cdd0b3d.png)

ブラウザ内の左上のタブの「Simulations」をクリックすると5個ほどのシミュレーションが出てきますので、左上の「BorregasAve, no bridge, data collection」をクリックすると、青いチェックマークが出て、右下にLG色のスタートボタンが出るので、クリックして下さい。メインウインドウにシリコンバレーの風景と自動車が出てきます。この状態で手動で運転ができます。

- 左右カーソルキー　ハンドル
- 上カーソルキー　　アクセル
- 下カーソルキー　　ブレーキ
- PgUp　　　　　　　前進ギアー
- PgDn　　　　　　　後進ギアー
- F12　　　　　　　　位置リセット

他にもあるようですが、とりあえずこのキーだけで遊べます。

![Screenshot from 2020-05-20 14-14-292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/57fe0555-14ee-bb6e-2534-787ba1cc66da.png)


ブラウザ画面の右下の停止ボタンを押すと、シミュレーションが止まります。
ブラウザのチェックマークが出た横の四角いアイコンを押すと、シミュレーションの条件を変更できます。Map&Vehiclesのタブでマップと車両を変更できます。サンフランシスコを走り回ることができます。

自動運転のために少々編集が必要です。
Simulationsのリストの中のBorregasAve (with Autoware)を使うので、四角の編集アイコンをクリックして、Map & Vehiclesタブを選択してください。
まずInteractive Modeのチェックボックスを外します。
次に車種をJaguar2015XE(Autoware)にしてください。
下のSubmitボタンを押して編集を確定してください。
このシミュレーションは自動運転で使用します。


#Autowareのインストール
Autowareをコンパイルする記事が多いのですが、[本家](https://www.lgsvlsimulator.com/docs/autoware-instructions)に載っているdockerを使う方法を使用します。
まずはdockerがない人はインストール。[ここ](https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu1804.html)の方法とかが有効と思います。

###dockerのインストール
GPGキーをインストールします。

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
キーを確認

```
$ sudo apt-key fingerprint 0EBFCD88
```

レポジトリを追加します。

```
$ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
```

dockerをインストールします。

```
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

動作確認をします。

```
$ sudo docker run --rm hello-world
```

###Autowareの環境作成
まずは、git lsfを使うので、インストールします。2行目は確認。

```
$ sudo apt install git-lfs
$ git lfs install
```
Autowareのdockerの中とシェアするためのディレクトリshare_dirを作成します。名前はこの通りにしてください。場所はホームにしてください。その中で使うファイルをダウンロードします。

```
$ mkdir ~/shared_dir
$ cd ~/shared_dir
$ git clone https://github.com/lgsvl/autoware-data.git
```

ワークディレクトリを作成して、docker用のファイルをダウンロードします。ここでは単純にworkという名前にします。

```
$ mkidr work
$ cd work/
$ git clone https://gitlab.com/autowarefoundation/autoware.ai/docker.git
```

#自動運転を動かすまで
###Autowareの立ち上げ
以下を実行してください。dockerが立ち上がります。

```
$ cd ~/work/docker/generic
$ ./run.sh -t 1.12.0

Using options:
        ROS distro: melodic
        Image name: autoware/autoware
        Tag prefix: latest
        Cuda support: on
        Pre-release version: off
        UID: <1000>
Launching autoware/autoware:latest-melodic-cuda
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

autoware@machinename:~$
```
autowareというユーザになっています。
起動に向けて、以下のおまじないをして起動します。

```
$ sudo apt update && sudo apt install ros-$ROS_DISTRO-image-transport-plugins -y
$ roslaunch runtime_manager runtime_manager.launch
```

これでAutowareのGUIであるRuntime Managerが立ち上がります。

###自動運転のwaypointデータの作成
さてここからが本番です。
まずwaypointデータを作成します。
Runtime ManagerのQuick Startタブを選択すると、6か所のファイル指定ができるところがあります。

![Screenshot from 2020-05-20 14-16-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/8fb541e9-2fff-c247-bb1d-e57fe3c090e1.png)

まずここの上５つを埋めます。まず上段のMapのRefボタンを押します。するとファイル選択画面になるので、以下のパスのディレクトリに入ります

~autoware/shared_dir/autoware-data/BorregasAve/my_launch/

の中のmy_map.launchを選択してください。
その他のSensing, Localization, Detection, Mission Planning　についても同じディレクトリ内にある、my_sensing_simulator.launch, my_localization.launch, my_detection.launch, my_mission_planning.launch をそれぞれ選択してください。Motion Planningは今回必要ないようです。

次にMapボタンを押します。しばらくすると右端にOKが出ます。
次にSensingとLocalizationボタンを順に押します。右端には特に何も出ません。
次に右下のRVizボタンを押します。新たなウィンドウが開き、マップが表示されます。シミュレータでのスタート位置付近の地図となります。

ここで、LGSVLのウェブ画面に移り（立ち上げてない場合は立ち上げて）先ほど編集したBorregasAve(with Autoware)を選択して、右下の実行ボタンでスタートします。これでスタート地点に自動車が停止した状態になっています。
ここでRVizの画面に戻り、自車の位置を教えます。画面上側中央の2D Pose Estimatorボタンを押して、LGSVLで自車が表示されているあたり付近をポインティングします。このポインティングは少々変わっていて、場所を押した後、そのまま向いている方向にドラックすることで方向を指定します。うまくいくと、Lidarでスキャンしていますという感じのたくさんの赤い点が同心円状に出現します。うまくいかないと、付近を探索始めてどっかに行ってしまうので、根気よく合わせてください。これで、シミュレータの車の位置と、内部マップ上での位置が合います。

![Screenshot from 2020-05-20 14-30-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/0c0178f4-5ef3-f902-04eb-39696be03c8b.png)

ここでまだ自動運転には行けません。
まず自動運転予定ルートであるwaypointを作成します。
Runtime Managerに戻り、Computingのタブを選択するとたくさんの項目がちらちらとちらつきながら出ます（少なくとも私のマシンでは）。右側の項目の中にwaypoint_saverという項目があるので、そこのappボタンを押します。Save Fileという項目があるので、作るwaypointファイルが消えないように、shared_dirに保存するようにパスやファイル名を変更します。ここでは、以下のパスにします。
/home/autoware/shared_dir/waypoint.csv

OKで閉じたら、waypoint_saverにチェックを入れます。これでセーブの準備ができました。
LGSVLの画面で自動車を手動動作させて、自分で決めたゴールにまで誘導してください。
ゴールに停止したら、Runtime Managerに戻り、waypoint_saverのチェックを外します。
dockerの外からも確認できるところに保存したので、他のターミナルでファイルを確認してみてください。

###自動運転の試行
さて本番です。

LGSVLのWeb画面から右下のボタンでシミュレーションを停止してください。
Runtime ManagerのQuick Startタブに移り、RVizのボタンを押して、RVizの画面を閉じてください。Localization, Sensing, Mapの各ボタンも順に押して元の状態にしてください。
これは本当に必要かどうかはわかりませんが、現時点でうまくいっている方法です。

次にまたMap, Sensing, Localizationと順番に押します。
RVizのボタンを押してマップ画面を開きます。
LGSVLのWeb画面から右下のボタンでシミュレーションを開始してください。
RVizの画面に戻り2D Pose Estimateボタンで、自分の位置を設定してください。
ここまではwaypoint_saverと同じです。

次にRuntime ManagerのQuick startタブで、Detection, Mission Planningとボタンを押します。
RVizに戻ると、マップにオレンジ色のラインが追加されます。これがレーンの情報で、この上を自車が走行します。その上にゴールを置く必要があります。2D Nav Goalボタンを押して、先ほどの自動運転のゴール付近のオレンジラインの上でドラッグしてください。位置を教える時と同じように、位置と方向を設定します。マップの操作方法は、少々変わっています。

![Screenshot from 2020-05-20 14-32-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/7db177a3-2fb4-a08f-ae54-fe2af8b52dfe.png)

左ドラッグ　：回転
右ドラッグ　：拡大縮小
Shift + 左ドラッグ　：平行移動

うまく設定されると、自車の位置からゴールまで水色のラインが引かれます。
これでルートが設定されました。

Runtime Managerに戻り、Computingのタブで設定をします。
まずlane_rule, lane_stop, lane_selectのチェックを入れます。
waypoint_loaderのappボタンを押して、先ほどセーブしたwaypoint.csvを選択します。
waypoint_loaderにチェックを入れます。
astar_avoid, velocity_set, pure_pursuit, twist_filterを順にチェックを入れます。

![Screenshot from 2020-05-20 14-44-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/50672963-91f2-16b3-9a1d-d74aa82a64be.png)

![Screenshot from 2020-05-20 14-34-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/2b891e2a-51e2-057e-1ed9-2055aebc75d4.png)

これで動き出す、はずなのですが、私の環境では動きません。
ここからQuick Startに戻り、Mission Planningを一度押して解除して、もう一度押して入れなおすと動き出すことがあります。それでもダメな場合は、RViz画面に行き、2D Nav Goalを設定しなおすと動き出します。

![Screenshot from 2020-05-20 14-35-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/e8a6000b-a102-9bac-6f31-a05b18c6b4fb.png)


もしどなたか、他に動作させる方法等ありましたら、コメントいただけると嬉しいです。