自動運転 AIチャレンジ　~導入編~


## 概要

本記事では、[自動運転 AIチャレンジ](https://automotiveaichallenge.github.io/aichallenge2023-sim/index.html)のシミュレーション環境を導入して触ってみた！という内容です。なお、筆者はAutowareもros2も初心者なので、記述や認識に誤りがあるかもしれません。優しく見守っていただけると幸いです。

## 導入

基本的には、[公式ドキュメントのSetup](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html)に書かれている内容に従います。筆者はUbuntuとDockerを使った環境を用いました。以下、少しだけ引っ掛かったポイントなどを記述します。

### 初期位置の設定について

ドキュメントにもある通り、
```bash
ros2 launch autoware_launch e2e_simulator.launch.xml vehicle_model:=golfcart sensor_model:=awsim_sensor_kit map_path:=/aichallenge/mapfile
```
で起動した後、初期位置とゴールの位置を設定する必要があります。
![awsim_and_autoware.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320782/d9c45940-d89e-8d5c-9eda-16cefe2d2231.png)
上の画像は左がAwsimで右がAutowareの画面なのですが、対応関係がパッと見わかりにくいです。
ここで、左のAwsimの緑色に光っている線(恐らく走行ルート)と右のAutowareの手書きの部分が対応しています。また初期位置は赤い矢印に書かれた部分に設定する必要があります。

### 手動操縦に関して

Awsimでは、手動操縦が可能です。
![awsim_manual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320782/f9cac026-53d0-9c87-e215-bcce216ed2c9.png)
手動操縦は、上の画像のManualと書かれた部分をクリックし`D`キーを押したあと矢印キーで行います。

### Local EnvironmentとAutoware-Mini

自作のパッケージを作成するためには、[公式ドキュメントのLocal Environment](https://automotiveaichallenge.github.io/aichallenge2023-sim/local/index.html)を参考にdockerやコードをビルド・実行する必要があります。デフォルトでは、Autowareを用いて自動運転をシミュレーションしているのですが、Autowareは少し複雑なので、よりシンプルなAutoware-Miniを導入したほうが良さそうです。導入方法は[公式ドキュメントのAutoware-Mini](https://automotiveaichallenge.github.io/aichallenge2023-sim/customize/index.html#autoware-mini)にあります。
ここで、これをlaunchするときはSetupにあった`autoware_launch e2e_simulator.launch.xml`ではなくLocal Environmentにあった
```bash
cd /aichallenge
bash run.sh
```
で実行する必要があります。

## 自作パッケージを作って挙動を変えてみる

とりあえず、このシミュレーションをどの様にカスタムすればよいのかを学ぶため、試しに自作のパッケージを作ってみます。
自作パッケージでは、**車両の制御部を変更し、経路計画を無視して前進し続ける**パッケージを作成することを目標とします。

これを行うためにやるべきことは以下の2点です

1. `trajectory_follower`に流れている`planning/scenario_planning/trajectory`というトピックを流れないようにする。そうすることにより、`trajectory_follower`から出ている車両への指令値である`control/trajectory_follower/control_cmd`を止めることができる。
2. 自作で`planning/scenario_planning/trajectory`をsubscribeして`control/trajectory_follower/control_cmd`をpublishするプログラムを書く。

(以下のマーカーが引いてあるトピックです)
![memo-134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320782/9cd7498e-a0b9-0a41-be20-13a9f074172f.jpeg)

1に関して、`docker/aichallenge/aichallenge_ws/src/aichallenge_submit/autoware_universe_launch/tier4_control_launch/launch/control.launch.py`の69行目にある`("~/input/reference_trajectory", "/planning/scenario_planning/trajectory"),`という部分を
```python
            # ("~/input/reference_trajectory", "/planning/scenario_planning/trajectory"),
            ("~/input/reference_trajectory", "/planning/scenario_planning/trajectory2"),
```
というような適当な名前に書き換えます。

また、2に関しては、`docker/aichallenge/aichallenge_ws/src/`下に適当なパッケージを作成し、以下のようなノードを作成します。

```python
from typing import List
import rclpy
from rclpy.node import Node
from autoware_auto_control_msgs.msg import AckermannControlCommand
from autoware_auto_planning_msgs.msg import Trajectory


class GoStraightAhead(Node):
    def __init__(self) -> None:
        super().__init__("control_cmd_subscriber")

        self.pub = self.create_publisher(
            AckermannControlCommand,
            "/control/trajectory_follower/control_cmd",
            10,
        )

        self.sub = self.create_subscription(
            Trajectory,
            "/planning/scenario_planning/trajectory",
            self.listener_callback,
            10,
        )
        self.sub

    def listener_callback(self, msg: Trajectory):
        print(msg)
        cmd = AckermannControlCommand()
        # ひたすら前進するように
        cmd.longitudinal.speed = 10000.0
        cmd.longitudinal.acceleration = 10000.0
        self.pub.publish(cmd)


def main(args=None):
    rclpy.init(args=args)

    minimal_subscriber = GoStraightAhead()

    rclpy.spin(minimal_subscriber)

    minimal_subscriber.destroy_node()
    rclpy.shutdown()


if __name__ == "__main__":
    main()
```

### 結果

ひたすら前に進み続けるシミュレーションができました！

<iframe width="640" height="500" src="https://www.youtube.com/embed/Ubs3xib8Rz8" title="Awsim自作パッケージ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>