プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その3：Autoware.AIとLGSVLシミュレータを使ってみる）


##まずはじめに
Autowareの機能はマップから読み取った自己位置から速度や向きを計算しているため自己位置推定ができないとなにもできません。
今回はAutowareとLGSVLシミュレータを使って自己位置推定をして自動走行するまでの過程をご紹介します。
ここではLGSVLのチュートリアルがバージョン1.14.0で構成されているため、それに合わせて1.14.0を使用します。

Autowareの様々なバージョン使ってるとパラメータとか混乱してくるので`roswtf [launchファイル名]`を使って必要なトピックや構成を確認するといいです。

(2021.04.03:追記、20年6月のバージョンではすでにブリッジできるシミュレーターがあるので追記)

・[その１：Autoware.AIの環境設定](https://qiita.com/penstood/private/aa0328805bb91ad9340f "自動運転AIチャレンジ")
・[その２：ROSの情報まとめ](https://qiita.com/penstood/private/3e6a734bb2196dd72c9f "プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その２：ROSの情報まとめ）")
・[その3：Autoware.AIとLGSVLシミュレータを使ってみる](https://qiita.com/penstood/private/b024c6486af18fe620e6 "プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その3：Autoware.AIとLGSVLシミュレータを使ってみる）")←いまここ

| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 | [1. 環境設定](#1-必要なソフトのインストール) |
| 2 | [2. LGSVLシミュレータの設定](#2-lgsvlシミュレータの設定) |
| 3 | [AutowareとLGSVLシミュレータを接続する](#3-autowareとlgsvlシミュレータを接続する) |
| 4 | [Autowareの自己位置推定](#4-autowareの自己位置推定) |
| 5 | [参考リンク](#5-参考リンク) |


##1. 必要なソフトのインストール
#### Git Large File Storage (LFS)のインストール

```ruby:git_lfsのインストール
sudo apt-get update
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
```

##2. LGSVLシミュレータの設定
####必要なソフト（Linux向け） <-　追加しました。

```ruby:libvulkan1のインストール
sudo apt-get update
sudo apt-get install -y libvulkan1
```
####LGSVLのバイナリダウンロード
[LGSVL Download](https://github.com/lgsvl/simulator/releases/ "LGSVL Download")から最新のバイナリをダウンロードします。
いろいろなMAPを試したい場合は最新版を使用するようにしてください。
なおシミュレータを使用するのにユーザー登録が必要です。
もし起動できない場合は実行属性がないかもしれないので[プロパティ]から[プログラムから実行可能]にチェックが入っているか確認してみてください。

![01_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/fbba7b6a-bd1d-3c25-9749-75dc763b0515.png)


下記のコマンドでも可能です。

```ruby:実行属性の付与
chmod a+x simulator
```
####補足：シミュレーターの選択
(2021.04.03:追記、20年6月のバージョンではすでにブリッジできるシミュレーターがあるので追記)
シミュレーターを選択したら【4. Autowareの自己位置推定からお試し走行まで】に進む
![Screenshot from 2021-04-03 21-08-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/911630e0-bd7d-d050-b271-7441abe622c1.png)


####Mapダウンロード
add newをクリックしたあとMap Nameに「Borregas Avenue」、Map URLに[url](https://content.lgsvlsimulator.com/vehicles/awflexusrx2016/ "AWF Lexus RX 2016")を入力します。

```ruby:Borregas_AvenueのURL
https://content.lgsvlsimulator.com/maps/borregasave/
```

ほかのMapデータはこちら[LGSVL Maps](https://content.lgsvlsimulator.com/maps/ "LGSVL Maps")にあります。
![02_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/2e336ebc-387b-a429-2f7e-66000b7d8cd0.png)



####vehicleダウンロード
add newをクリックしたあとVehicle NameにAWF Lexus RX 2016、Vehicle URLに[url](https://content.lgsvlsimulator.com/vehicles/awflexusrx2016/ "AWF Lexus RX 2016")を入力します。

```ruby:AWF_Lexus_RX_2016のURL
https://content.lgsvlsimulator.com/vehicles/awflexusrx2016/
```

ほかの車両データを使用したい場合ははこちら[LGSVL Vehicles](https://content.lgsvlsimulator.com/vehicles/ "LGSVL Vehicles")にあります。
![03_vehicle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/209f24bd-20c3-2296-9e68-687e370bf280.png)



####vehicleセンサの設定
Bridge TypeにROSを選択、[サンプル](https://www.lgsvlsimulator.com/docs/vehicles-tab/#example-json "Web UI Vehicles Tab Explanation")にあるjsonの中身をSensorsに貼り付けます。

```ruby:Complete_JSON_Configuration
[
[
  {
    "type": "GPS Device",
    "name": "GPS",
    "params": {
      "Frequency": 12.5,
      "Topic": "/nmea_sentence",
      "Frame": "gps",
      "IgnoreMapOrigin": true
    },
    "transform": {
      "x": 0,
      "y": 0,
      "z": 0,
      "pitch": 0,
      "yaw": 0,
      "roll": 0
    }
  },
  {
    "type": "Lidar",
    "name": "Lidar",
    "params": {
      "LaserCount": 32,
      "MinDistance": 0.5,
      "MaxDistance": 100,
      "RotationFrequency": 10,
      "MeasurementsPerRotation": 360,
      "FieldOfView": 41.33,
      "CenterAngle": 10,
      "Compensated": true,
      "PointColor": "#ff000000",
      "Topic": "/points_raw",
      "Frame": "velodyne"
    },
    "transform": {
      "x": 0,
      "y": 2.312,
      "z": -0.3679201,
      "pitch": 0,
      "yaw": 0,
      "roll": 0
    }
  },
  {
    "type": "Keyboard Control",
    "name": "Keyboard Car Control"
  },
  {
    "type": "Vehicle Control",
    "name": "Autoware Car Control",
    "params": {
      "Topic": "/vehicle_cmd"
    }
  }
]

```
![04_sensor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/412a98ff-596d-93ad-996c-53d8ed213acb.png)



####シミュレータの設定
Simulation Nameに適当な名前をつけたあと、Map&Vehiclesを設定する。
![05_simulation_name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/c46bd890-9395-6680-4077-240b7a333dab.png)

Mapは`Borregas Avenue`を選択、Vehicleは`AWF Lexus RX 2016`を設定して`(ROSの動作するPCのIPアドレス):9090`の形式でrosbridgeに対する接続設定を実施します。
（１台で完結させる場合は`localhost:9090`）
![06_simulation_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/11d10e38-ced3-f976-a7f0-14c0e74978a8.png)

右下の赤色の三角をクリックするとシミュレーションを開始できます。
![07_simulation_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/c8a766bc-eda5-9e6c-9a1a-d76e93ded368.png)

##3. AutowareとLGSVLシミュレータを接続する
####Autoware-dockerの起動
今回はマニュアル[Autoware.AI 1.14.0 with LGSVL Simulator ](https://www.lgsvlsimulator.com/docs/autoware-instructions/ "Autoware.AI 1.14.0 with LGSVL Simulator ")にそってV1.14.0をビルドしてシミュレータに接続します。
細かいところは[その１](https://qiita.com/penstood/private/aa0328805bb91ad9340f "その１")を参照してください。

```ruby:Launch_Autoware
# $WORKING_DIRECTORYは任意
cd $WORKING_DIRECTORY
git clone https://github.com/Autoware-AI/docker.git
cd $WORKING_DIRECTORY/docker/generic
./run.sh -t 1.14.0
```

####Autoware-dockerとの複数コンソールでの接続
--rmオプションを削除して起動するとdockerからexitしてもimageが残るようになります。
dockerからexitしてから`docker ps -a`でコンテナを検索すると前回の起動していたコンテナ名がわかります。
起動していない場合は`docker start [イメージ名]`で起動しましょう。
`docker exec`コマンドでdockerに入ることができます。

```ruby:（コンソール１）dockerイメージへの接続
docker ps -a
docker start [イメージ名]
docker exec -it [イメージ名] /tmp/entrypoint.sh
cd $WORKING_DIRECTORY/docker/generic
```
もう一つコンソールを開いてから`docker exec`コマンドを実行すると複数のコンソールでdockerに入ることができます。

```ruby:（コンソール２）dockerイメージへの接続
docker exec -it [イメージ名] /tmp/entrypoint.sh
cd $WORKING_DIRECTORY/docker/generic
```


LGSVLシミュレータとはROSBRIDGEで接続します。
LGSVLシミュレータを立ち上げてからコンソール１でROSBRIDGEを立ち上げて接続してみましょう。

```ruby:（コンソール１）ROSBRIDGE
# Autowareの環境ファイルの読み込み
source Autoware/install/setup.bash
# ROSBRIDGEを立ち上げ
roslaunch rosbridge_server rosbridge_websocket.launch
```

さきほどのコンソール２で接続を確認しましょう。
`rostopic list`コマンドでLGSVLシミュレータからセンサの値などのトピックを確認することができます。

```ruby:（コンソール２）トピックの確認
# Autowareの環境ファイルの読み込み
source Autoware/install/setup.bash
# トピックの確認
rostopic list
```

複数コンソールから接続するときはかならず環境ファイルの読み込みをしましょう。

##4. Autowareの自己位置推定からお試し走行まで
さて、いよいよ自己位置推定です。Autoware-dockerを起動するとホームにshared_dirという共有フォルダが作られます。
shared_dirのデータはAutoware-dockerからも読み書きできるので非常に便利です。

```ruby:（コンソール３）Autoware-data
# LGSVLのサンプルファイルの読み込み
cd ~/shared_dir
git clone https://github.com/lgsvl/autoware-data.git
```

クローンが終わったらコンソール１に戻ってruntime_managerを立ち上げます。
runtime_managerが見つからない、というエラーが出る場合は
`source Autoware/install/setup.bash`（環境ファイルの読み込み）
を忘れているケースが多いです。

```ruby:（コンソール１）runtime_manager
# runtime_managerを立ち上げ
roslaunch runtime_manager runtime_manager.launch
```
runtime_managerが立ち上がったらそれぞれlaunchファイルの設定をしていきます。

```ruby:（コンソール１）runtime_managerでのlaunchファイルの設定
# Map
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_map.launch
# Sensing
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_sensing_simulator.launch
# Localization
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_localization.launch
# Detection
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_detection.launch
# Mission planning
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_mission_planning.launch
# Motion plannning
/home/autoware/shared_dir/autoware-data/BorregasAve/my_launch/my_motion_planning.launch
```
補足：my_localization.launchの44行目を下記のように有効化すると車両モデルが読み込まれます。
  <include file="$(find vehicle_description)/launch/vehicle_model.launch" />

ボタンをクリックしてlaunchファイルを実行します。右下のrvizをクリックするとrvizが立ち上がります。
![09_rviz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/52150234-b9a3-87c3-e8c0-f1e290343e36.png)

Autowareの自己位置推定は初期位置を指定する必要があるので2D Pose Estimateで自分の位置を指定します。
2D Pose Estimateをクリックして緑の矢印になるようにドラッグして指定します。
![10_localization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/260145e0-1eb2-a196-8cd3-587098fd11ad.png)

下記のようになればOKです。LGSVLシミュレータは十字キーで車両を操作することができるのでrvizで確認してみましょう。
![11_localization_matching.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/1b32d55d-6cc7-afc6-b602-185fb22b9625.png)

####Autowareで走行してみる
2D Navi Goalで目的地点をしましょう。2D Navi Goalをクリックして緑の矢印になるようにドラッグして指定します。
そうするとしばらくすると自動で走行します。経路はAutowreが道路にそって作成し走ってくれます。道路はVector_mapという形式でAutowareのパッケージが読み込んでくれます。
![12_automatic_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/7ccda1a1-91be-b830-84e7-2fa6e8d8978d.png)


####まとめ
年末年始にPCの入れ替えがあるのでAutowareのまとめは年明けに時間を見つけてご紹介していきたいと思います。
rvizの2D、3Dの切り替えがわかりません。誰か教えてくださるとありがたいです。

(2021.04.03:追記、rvizの切り替え)
rvizの右側のパネルType:を`ThirdPersonFollower`にすると3Dに表示が切り替わります。
![Screenshot from 2021-04-03 21-28-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339914/8d6d1316-be35-d504-ecde-e55f38366ce4.png)



##5. 参考リンク
・[Git Large File Storage (LFS) ](https://git-lfs.github.com/ "Git Large File Storage (LFS) ")　
・[How To Install "libvulkan1" Package on Ubuntu ](https://zoomadmin.com/HowToInstall/UbuntuPackage/libvulkan1 "How To Install "libvulkan1" Package on Ubuntu ")
・[LGSVL Download](https://github.com/lgsvl/simulator/releases "LGSVL Download")
・[LGSVL Maps](https://content.lgsvlsimulator.com/maps/ "LGSVL Maps")
・[LGSVL Vehicles](https://content.lgsvlsimulator.com/vehicles/ "LGSVL Vehicles")
・[Sample sensor configuration](https://www.lgsvlsimulator.com/docs/autoware-auto-json-example/ "Sample sensor configuration")
・[Web UI Vehicles Tab Explanation](https://www.lgsvlsimulator.com/docs/vehicles-tab/#example-json "Web UI Vehicles Tab Explanation")
・[Autoware.AI 1.14.0 with LGSVL Simulator ](https://www.lgsvlsimulator.com/docs/autoware-instructions/ "Autoware.AI 1.14.0 with LGSVL Simulator ")

 



・[【Ubuntu】Ubuntuでペイント的なお絵かきをするPinta](https://mhaya18.hatenablog.com/entry/2019/01/12/165647 "【Ubuntu】Ubuntuでペイント的なお絵かきをするPinta")