初心者がAIチャレンジやってみた (6)：mini_autowareを使ってみる

# 概要
「初心者がAI Challengeやってみた」シリーズの第6弾です。
今回はautowareに~~にmini_autowareという新しいブランチが作られていたので~~Autoware-Miniという最小構成のautowareのlaunchファイルが追加されていたので、そちらを使ってみました。
感想としては「パラメータ変更による動作への影響が分かりにくい」、「そもそもどのパラメータをいじれば良いのか分からない」と言った悩みを解決するのに良いブランチだと思いますのでもし同様の悩みがある方がいたら参考にしてみてください。

===
本シリーズでは[Japan Automotive AI Challenge 2023](https://www.jsae.or.jp/jaaic/)にautoware初心者の筆者が試行錯誤しながら挑戦する記録を公開しています。自動運転に興味があるけどプログラミングに自信が無い方などの参考になれば幸いです。

前の記事はこちら：
* 第1弾：[初心者がAIチャレンジやってみた(1)](https://qiita.com/h_bog/items/86fba5b94b2148c4d9da)：Autowareを動かしてみる
* 第2弾：[初心者がAIチャレンジやってみた(2)](https://qiita.com/h_bog/items/a36df3042a342bd2a0c5)：1つ目の障害物の回避成功
* 第3弾：[初心者がAIチャレンジやってみた(3)](https://qiita.com/h_bog/items/849a4241cdef257f3b3a)：2つ目の障害物の回避成功
* 第4弾：[初心者がAIチャレンジやってみた(4)](https://qiita.com/h_bog/items/8bce776fef0a39676c46)：全障害物回避達成！（全パラメータ公開）
* 第5弾：[初心者がAIチャレンジやってみた(5)](https://qiita.com/h_bog/items/4ed94ef6256ac5ae9c03)：開発環境の再構築（番外編）

:::note warn
筆者はautoware初心者です。
説明等が正確でない可能性があるので本記事だけではなく他の記事や[autowareのドキュメント](https://autowarefoundation.github.io/autoware-documentation/main/)も確認するようにしてください。
:::

# mini_autowareブランチを使ってみる
## ブランチの切り替え
まずはブランチを切り替えて動かしてみましょう。
ターミナルを開いて以下の手順を実行します。
```
cd aichallenge2023-sim             # AIチャレンジのディレクトリに移動
git fetch                          # 最新の変更内容をgitからダウンロード　（このコマンドはスキップ可）
git stash                          # 消えてほしくない変更内容がある場合はこれで一時保存する
git pull                           # 最新の変更内容を実際に反映する
git stash pop                      # 一時保存していた変更内容を反映する
git checkout main                  # ブランチを切り替える
```
以上の手順で最新の変更内容の反映とブランチの切り替えができます。
ここはautowareの説明というよりgitの使い方の説明になってしまうので詳細は省きますが、簡単に説明すると `git pull`で最新バージョンのautowareプログラムをインストールして、~~git checkout feat/mini_autowareでmini_autowareのブランチ（autowareのバージョンみたいなイメージ）に切り替えています~~。ファイルを変更したりしている場合、`git pull`の段階でエラーが起こってしまうことがあります。そのため`git stash`コマンドを用いて変更内容を別の場所に保管しつつ破棄してこのエラーが出ないようにします。

## 実行
ブランチの切り替えができたのでとりあえずautowareを実行してみます。合計で３つのターミナルが必要になりますのでそれぞれでrockerを起動しておきます。
**Rockerを起動**
```
cd aichallenge2023-sim/docker
bash build.sh
bash run_container.sh
```

Rockerコンテナ内でコマンドを入力してAWSIMとAutowareを起動します。
**AWSIMを実行**
```
# Rockerコンテナ内で
sudo ip link set multicast on lo
source /autoware/install/setup.bash
/aichallenge/AWSIM/AWSIM.x86_64
```
**Autowareを実行**
```
# Rockerコンテナ内で
cd /aichallenge
bash build.sh           # コードのビルド
bash run.sh             # コードの実行
```

以上のコマンドで従来どおりAWSIMとautowareが起動します。
次にRViz上で目的地を設定し、以下のコマンドを入力して自動運転を開始します（何故かRViz上のパネルから自動運転開始の指示が送れないので、ターミナルから直接指示を出す必要があります）。
**コマンドを送信**
```
# Rockerコンテナ内で
sudo ip link set multicast on lo
source /autoware/install/setup.bash
ros2 topic pub /autoware/engage autoware_auto_vehicle_msgs/msg/Engage 'engage: true' -1
```

動作は以下の動画のような感じになると思います。障害物をガン無視して衝突しながらゴールに向かって走行していきますが、途中で計画経路がレーンからはみ出してしまうため停車してしまいました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/7WlcJIPq-v4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 中身の確認
実行してみて分かるように障害物回避などが動いていません。
何がどう違うのかを確認してみましょう。
1. ターミナルで呼び出している[`run.sh`](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/blob/feat/mini_autoware/docker/aichallenge/run.sh)を確認 → `aichallenge.launch.xml`が呼び出されている
1. [`aichallenge.launch.xml`](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/blob/feat/mini_autoware/docker/aichallenge/aichallenge_ws/src/aichallenge_launch/launch/aichallenge.launch.xml)を確認　→　`aichallenge_submit.launch.xml`が呼び出されている
1. [`aichallenge_submit.launch.xml`](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/blob/feat/mini_autoware/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/aichallenge_submit_launch/launch/aichallenge_submit.launch.xml)を確認 → ここが変わっている！

ということで[aichallenge_submit.launch.xml](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/blob/feat/mini_autoware/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/aichallenge_submit_launch/launch/aichallenge_submit.launch.xml)が変更されていることが分かりましたので中身を見てみましょう。（GitHubのpush内容とかを確認すれば上記の手順をふまなくても変更されたファイルとかがすぐに分かります。）

```xml
<?xml version="1.0" encoding="UTF-8"?>
<launch>
    <!-- Autoware -->
    <!-- <include file="$(find-pkg-share autoware_launch)/launch/e2e_simulator.launch.xml">
        <arg name="vehicle_model" value="golfcart"/>
        <arg name="sensor_model" value="awsim_sensor_kit"/>
        <arg name="map_path" value="/aichallenge/mapfile"/>
        <arg name="rviz" value="false"/>
    </include> -->

    <include file="$(find-pkg-share aichallenge_submit_launch)/launch/autoware_mini_awsim.launch.xml" >
      <arg name="vehicle_model" value="golfcart"/>
      <arg name="sensor_model" value="awsim_sensor_kit"/>
      <arg name="map_path" value="/aichallenge/mapfile"/>
      <arg name="rviz" value="false"/>
    </include>

    <include file="$(find-pkg-share initialpose_publisher)/launch/initialpose_publisher.launch.xml" />

    <include file="$(find-pkg-share self_driving_controller)/launch/self_driving_controller.launch.xml" />
</launch>
```

元々は`include file ...`という部分の`e2e_simulator.launch.xml`という部分が動いていたのですが、こちらのファイルではそこがコメントアウトされていて新たに`autoware_mini_awsim.launch.xml`というものが追加されています。
試しに`e2e_simulator.launch.xml`のコメントを外して`autoware_mini_awsim.launch.xml`をコメントアウトして実行したら今まで通りの障害物回避をしました。

## autoware_mini_awsim.launch.xml
前置きがだいぶ長くなりましたが、mini_autowareの特徴はこの[`autoware_mini_awsim.launch.xml`](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/blob/feat/mini_autoware/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/aichallenge_submit_launch/launch/autoware_mini_awsim.launch.xml)で呼び出すノードなどを全て指定しているという点でしょうか。

例えばL475-L479は以下のようになっており、目的地を可視化するためのノード `goal_pose_visualizer` が呼び出されています。
```xml
<!-- goal_pose_visualizer -->
<node pkg="mission_planner" exec="goal_pose_visualizer" name="goal_pose_visualizer" output="screen">
    <remap from="input/route" to="/planning/mission_planning/route"/>
    <remap from="output/goal_pose" to="/planning/mission_planning/echo_back_goal_pose"/>
</node>
```
この部分を消したり、コメントアウトするとこのノードが呼び出されなくなり目的地が可視化されなくなります。
| 1 | 2 |
|:-:|:-:|
| `goal_pose_visualizer`あり  |  `goal_pose_visualizer`なし |
| ![Screenshot from 2023-07-19 15-42-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483805/4808b0fe-d916-10b3-f4d6-1d8e5850a385.png) | ![Screenshot from 2023-07-19 15-43-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3483805/50b35f11-1daf-6e3d-e526-8df06ae85ca3.png) |

これを`e2e_simulator.launch.xml`の方で同じことをしようとすると、以下のような順番でファイルを参照しまくる必要がありました：
`e2e_simulator.launch.xml` →　`autoware.launch.xml` →　`tier4_planning_component.launch.xml` →　`planning.launch.xml` →　`mission_planning.launch.xml` →　[`goal_pose_visualizer.launch.xml`](https://github.com/autowarefoundation/autoware.universe/blob/e5f9584d790047174810ff3da50f307c750466a7/planning/mission_planner/launch/goal_pose_visualizer.launch.xml)

私のようなautoware初心者がこれだけの数のファイルを辿っていってgoal_pose_visualizerにたどり着くのはほぼ不可能だと思います。その分 mini_autoware ではノードが直接`autoware_mini_awsim.launch.xml`に記述されているので、今後の調整がかなり楽になりそうです。

ノードを追加したい時は[ROSの公式ドキュメント](https://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Creating-Launch-Files.html)を参考にすると良いかもしれません。
ポイントとしてはしっかりとトピックを`remap`して他のノードがアクセスできるように調整することと、パラメータは`param`を使って指定するのを忘れないことです。

一応autowareのノードとかは[autoware.universe](https://github.com/autowarefoundation/autoware.universe)で見つけられると思いますが、まだ自分で試せていないです。
今後は自作でパッケージを作ってみて動かせるかを試してみたいと思います。