AWSIMを改造してみる


# 概要
今回は前回の続きでAWSIMを改造してみるの記事を書いて見ようと思います。
AWSIMを改造してbuildしてAutowareと合わせて動かしてみるところまでをやっていきます。

https://qiita.com/ttanaka3/items/6ae5f8331d60b0454308


AutowareのVersionとAWSIMのversionは違いますが、Unityのセットアップ方法はAWSIMのドキュメントに詳しく書いてあるので割愛します。

https://tier4.github.io/AWSIM/GettingStarted/SetupUnityProject/

こちらの記事もおすすめです

https://qiita.com/ysenkun/items/25243755b23a2baf46f6

:notebook_with_decorative_cover: UnityHubのversionやAWSIMのbranch hashはなんでも構わないですが、Unityのversionだけは Unity2021.1.7に合わせるようにしてください。
Unityのversionを合わせないと勝手にパッケージがupgradeされたりして依存関係が壊れてしまう可能性があります注意しましょう。
※この記事は2023/2/26日時点の記事なので半年後くらいにはunityのversionが変わっているかもしれません、公式のAWSIMのドキュメンテーションも適宜チェックしておいてください。）


この記事は以下の２つの項目を説明します。
1. UnityProjectのセットアップとbuild、autowareとの連携。
2. UnityProjectの編集とbuild、改造AWSIMでAutowareとの連携。

# UnityProjectのセットアップとbuild、autowareとの連携
ドキュメント通りに進めるとこの画面にたどり着くと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/d46d12e2-e162-9d91-320b-6b0f7d5589d4.png)


ドキュメントの通りAssets/AWSIM/Scenes/Mainと進みSceneを開きましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/4b7711de-1bb6-043a-728b-3521bab96776.png)

このマーク（呼び方を知らないので知っている方がいたら教えてください。）のものが基本的にunityのsceneと言われるprefab,object,light,cameraなどを合わせたシーンと言われるものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f3ed5b24-85c8-4545-5d7b-fb0251572a26.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/ac513d7f-04fb-7135-2fd0-62bbabf1b461.png)


AutowareSimulation.unityを開くと編集画面が見えるのですが、viewが引きすぎなので車両付近のviewに移しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/8f0f7b87-5c83-227b-f42b-5c9106a89bc9.png)

AWSIM実行時はこちらのFollowCameraがカメラ操作をするのでこの値に近い値にカメラを設定しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/4fb2d5a4-7669-d4b7-b05b-69fbf28d2eab.png)


AutowareSimulationー＞AutowareSimulationー＞MainCameraと開くと良いでしょう。
Mainカメラをダブルクリックするとこんな感じで車両付近にviewが移動します。


![Screenshot from 2023-02-26 12-53-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f6b57964-9e83-d024-afa0-0d9441d862ac.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f8b4e7a1-0f76-4696-2764-03c4cffa4fd1.png)


# buildしてapplicationを作る

さて、このシーンを一度buildしてみましょう。最初はとりあえず一切の変更を加えずに正しくbuildできることを確認するのが正攻法なので、そのまま何もせずbuildしましょう。
File->BuildSettingと進みデスクトップPCの場合はとりあえずArchitectureをx86_64にしておきbuildボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/18784690-11ea-2491-59a2-a270edee2415.png)

フォルダを選ぶ画面が出てくるので適当な名前をつけて保存してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/2690cbda-9d2b-2e0b-f11f-49ba9c4b2e46.png)

私がbuildしたときははじめから実行権限ついていました。実行まえに一応確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/52e24289-33a3-9b98-fc6f-d1184b555f9f.png)

https://qiita.com/ttanaka3/items/6ae5f8331d60b0454308#quick-start-demo

あとの内容はQuickStartDemoの内容と同じになります。

```
source ~/<path to autoware folder>/install/setup.bash
./<path to AWSIM folder>/AWSIM_demo.x86_64
```

そうすると自作のAWSIMが出来上がるのでAutowareと連携させてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/0eb45bf3-8974-ce0a-1e41-70d6be0e015a.png)


:notebook_with_decorative_cover: Autowareとの連携で詰まったら以下のtopicが出ているか確認しましょう。

terminalからros2 topic listで確認できます。
```
/client_count
/clock
/connected_clients
/control/command/control_cmd
/control/command/emergency_cmd
/control/command/gear_cmd
/control/command/hazard_lights_cmd
/control/command/turn_indicators_cmd
/parameter_events
/rosout
/sensing/camera/traffic_light/camera_info
/sensing/camera/traffic_light/image_raw
/sensing/gnss/pose
/sensing/gnss/pose_with_covariance
/sensing/imu/tamagawa/imu_raw
/sensing/lidar/top/pointcloud_raw
/sensing/lidar/top/pointcloud_raw_ex
/vehicle/status/control_mode
/vehicle/status/gear_status
/vehicle/status/hazard_lights_status
/vehicle/status/steering_status
/vehicle/status/turn_indicators_status
/vehicle/status/velocity_status
```
これらのtopicはVehicleStatusSensorなるものが出しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/c540513c-3f88-a7ea-1f87-bc6b8c40bbd4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/c3b83d23-7ce9-162d-74a1-32867f367441.png)


自作のAWSIMができていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/baf9eee4-6b10-23f5-eb12-88c1e59c0147.png)


# UnityProjectの編集とbuild、改造AWSIMでAutowareとの連携

では改造していきましょう！！！（※勉強目的以外でのAWSIMの改造はおすすめしません）

まず、もとの環境を壊すとはまったときに抜け出せなくなるのでシーンを選択し、control+Dでもとのシーンを複製しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/eb77778d-9629-43a4-cbd5-9ac99b06fe23.png)


もう少し俯瞰視点にしてみたいので、カメラを選択し、Wを押してカメラを後方に移動、Eを押してカメラを回転させてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/a0ae2aef-d780-03b3-6c0a-3336763dd702.png)



地形も変えて行きましょう。とりあえずP01_Facets_Index_Geo01,P01_Facets_Index_Geo03あたりを消してPlaneを追加してみます。
prefabは親子関係にあるので、prefab編集していいですか？と確認画面が出てきたあとにprefab編集画面に移動しますが、お構いなく消していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/69bb2eb0-2e22-8008-213a-1481d3a1b95b.png)


次にビルも消して行きましょう。
なにも考えずに全部消すと自己位置推定ができなくなるので適度に適当な四角や円筒でビルの位置を補っていきましょう。Lidarの点群はどうせ上に届かないのでビルの高さはほどほどで問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/df251eb9-05bf-867c-3d7c-302c32235610.png)

最後にprefaからビルを消すとかなり簡素になりました。これらのObjectは動かないのでStaticにチェックをいれてOKです。（少し処理がはやくなるようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/c288c4db-2b76-6707-49ca-71a079e7de8f.png)

buildしたい場合はFile->BuildSettingを選択するとbuildのオプション画面が出てきます。buildしたいsceneをadd sceneして追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/c8f07f27-1b5a-6359-2910-997dde257f88.png)


buildが完了してAWSIM起動、Autowareを起動したあとにRvizからlocalization->NDT->Aligedを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f4c919b1-c2e0-7197-c50d-c51e7adfbad8.png)

自己位置推定時のサンプリング点が見えると思います。Unityで建物と入れ替えたCubeやPlane、cylindarにはもともと衝突判定用のcollidarがついているのでAutoware上でも以前と挙動はあまりかわりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/67bb4c27-69f4-810a-f4df-fe87db550b56.png)



てきとーに地面追加したのでobstacle stopで止まってしまいました。AddボタンからDebug　Markerを追加してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/3e1d9c27-e501-5608-e090-7ef64feb3590.png)

マーカを見ると地面点群取ってきちゃっていることがわかります。
解決方法はいろいろありますが、とりあえずcrop box filterで対応しようとおもいます。

とりあえずparameterをprintしてみてみます。
```
ros2 param dump /perception/obstacle_segmentation/crop_box_filter
/perception/obstacle_segmentation/crop_box_filter:
  ros__parameters:
    approximate_sync: false
    input_frame: base_link
    latched_indices: false
    max_queue_size: 5
    max_x: 100.0
    max_y: 50.0
    max_z: 2.5
    min_x: -50.0
    min_y: -50.0
    min_z: -2.5
    negative: false
    output_frame: base_link
    qos_overrides:
      /clock:
        subscription:
          depth: 1
          durability: volatile
          history: keep_last
          reliability: best_effort
      /parameter_events:
        publisher:
          depth: 1000
          durability: volatile
          history: keep_last
          reliability: reliable
    use_indices: false
    use_sim_time: true

```

以下のファイルの値が採用されてそうです。 ~~elevation_map使わないときはmin_zは0がいいとかいてありました~~ elevation mapではなく、 `elevation_grid_mode`というパラメータのことだそうです。
`src/universe/autoware.universe/launch/tier4_perception_launch/config/obstacle_segmentation/ground_segmentation/ground_segmentation.param.yaml`

```
        max_z: 2.5  # recommended 2.5 for non elevation_grid_mode
        min_z: -2.5 # recommended 0.0 for non elevation_grid_mode
```
今回はとりあえず走れればいいので0.5くらいにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/e4489dc2-9eba-03da-d4f8-7664266ff615.png)

最初のほうは問題ないですが、てきとーに建物を入れ替えたのでカーブ付近から自己位置がはまらなくなり。レーン逸脱してしまいます。わかりやすいようにもとのPCDを青くしていますが、少しずつずれてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f7405544-c312-1170-0960-a6dd6a8a206f.png)

CubeやCylindarなどをもとの建物の形状に近づけると改善されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/eeeb0b26-5960-8e6d-5731-2ae56d513f4f.png)

----
今回の記事の内容としてはいっぱいいっぱいなのでこのあたりで解説を止めます。

AssetStoreのパッケージなどを入れてみるとゲーム感が増してきます。

https://assetstore.unity.com/?locale=ja-JP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/4e7f6ef5-c714-1c00-10f7-16d1de194fe6.png)


# 終わりに

今回はAWSIMを魔改造したものを作成し、動かしてみました。

次回はAssetStoreのパッケージを入れてみるあたりを記事にしてみようかと思います。