Autoware入門講座の教材使ってみた(1)

# はじめに
現在、Autowareの基本的な開発方法について解説するための教材が作られています。
絶賛作成中です。
今回は現行の教材に沿って動作させてみました。

是非フィードバックほしいので、知りたいAutowareの基本機能とか不具合とかあったらissueに上げてくれると嬉しいです。

https://github.com/AutomotiveAIChallenge/autoware-practice/issues

# 教材について
以下のものとなります。

https://automotiveaichallenge.github.io/aichallenge-documentation/course/

[Autoware Universeのドキュメント](https://autowarefoundation.github.io/autoware-documentation/main/)はこちらのリンクとなります。

# 教材のソースコード
以下のものとなります

https://github.com/AutomotiveAIChallenge/autoware-practice.git

# 教材の目的
演習形式となっており、課題を達成するためのコードをゼロから開発しながら Autowareの仕組みを学べるようになっています。

# 環境構築
[教材](https://automotiveaichallenge.github.io/aichallenge-documentation/course/#_2)の通りに実施します。
githubのリポジトリからクローン、してビルド、パッケージを利用できるようにします。
自分の環境ではgitとかROS2とかはインストール済みなのでサラからやるとなると上記のみでは動かない可能性がかなり高いです。

自分のPCはAutowareの[Source installation](https://autowarefoundation.github.io/autoware-documentation/main/installation/autoware/source-installation/)を別件で実施していますのでたまたま動いているようです。
issueにあげといたほうがいいかもしれないですね。

# 車両インターフェースの講座実行
[車両インターフェース](https://automotiveaichallenge.github.io/aichallenge-documentation/course/vehicle/)の演習問題を動かしてみます。
## 前進のケース
ros2 launch autoware_practice_launch practice.launch.xml problem:=vehicle_forward
でシミュレータ起動します。

![Screenshot from 2024-04-01 13-53-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/484bcb7f-42af-0afe-dc55-676a4ea7b120.png)

別ターミナルを起動して、ros2コマンドを実行してみます。
ros2 run autoware_practice_course vehicle_forwardを実行します。
事前にsetup.bashを実行するのを忘れずに。
![Screenshot from 2024-04-01 14-01-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/0d884808-0a52-f066-cea7-3a34085dcc69.png)

車両(青)と通過期待エリアが表示されます。
車両は停止したままです。
ros2コマンドを実行しているターミナルをctrl+Cします。

[Autowareの車両制御コマンド](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/components/control/)を見てみます。
[AckermannControlCommand](https://gitlab.com/autowarefoundation/autoware.auto/autoware_auto_msgs/-/blob/master/autoware_auto_control_msgs/msg/AckermannControlCommand.idl)というものがあり、[縦方向](https://gitlab.com/autowarefoundation/autoware.auto/autoware_auto_msgs/-/blob/master/autoware_auto_control_msgs/msg/AckermannLateralCommand.idl)の速度、加速度、[横方向](https://gitlab.com/autowarefoundation/autoware.auto/autoware_auto_msgs/-/blob/master/autoware_auto_control_msgs/msg/AckermannLateralCommand.idl)のタイヤの角度、タイヤの回転速度を変更できるようです。

リポジトリに格納されているものは、速度が0、加速度がマイナスになっています。車両を動かすためにはパラメータを変更する必要があります。
```forward.cpp
  command.longitudinal.speed = 0.0;
  command.longitudinal.acceleration = -2.5;
```


教材の通り、速度、加速度を書き換え、ビルドします。![Screenshot from 2024-04-01 14-09-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/5b82bda8-8303-464d-36b2-3df2df75ac54.png)

車両が前進し、通過期待エリアを通過しSUCCESSが表示されることを確認しました。

## 後退のケース
ros2 launch autoware_practice_launch practice.launch.xml problem:=vehicle_backward
でシミュレータ起動します。
ros2 run autoware_practice_course vehicle_backwardを実行します。車両が停止しています。
![Screenshot from 2024-04-01 14-23-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/c2264deb-129d-8976-1e53-b6a0cafe9dec.png)
ギアを変更してREVERSEにする、speedを負、accelerationを正にすると後退してくれるそうです。
ギアの変更はよくソースコードを見ていないのでまだわかっていませんが、ros2コマンドでREVERSEをパブリッシュし、車両がサブスクライブし判定していそうです。
登録済みコードにも判定が入っています。
以下のように速度、加速度についてコードを変更してやってみます。

```backward.cpp
  if (gear_.report == GearReport::REVERSE) {
    command.longitudinal.speed = -3.0;
    command.longitudinal.acceleration = 1.0;
  } else {
    command.longitudinal.speed = 0.0;
    command.longitudinal.acceleration = -2.5;
  }
```
車両が後退し、通過期待エリアを通過しSUCCESSが表示されることを確認しました。
![Screenshot from 2024-04-01 14-28-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/432bb57d-fdf1-39c9-1850-17254c7d93bc.png)

## 車両の旋回のケース
まだ作成中のようですが、車両旋回もしてみます。
教材の通りsteering_tire_angleを変更してみます。
[Autowareのドキュメント](https://gitlab.com/autowarefoundation/autoware.auto/autoware_auto_msgs/-/blob/master/autoware_auto_control_msgs/msg/AckermannLateralCommand.idl)を見る限り、正の値で左方向、負の値で右方向に旋回するようです。
### 左回りのケース
```forward.cpp
  command.longitudinal.speed = 3.0;
  command.longitudinal.acceleration = 1.0;
  command.lateral.steering_tire_angle = 1.0;
```
![Screenshot from 2024-04-01 14-40-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/9a15f8a0-296e-2953-1d7f-21e04012605b.png)
図ではわかりにくいですが、車両が左回りに旋回します。
### 右回りのケース
```forward.cpp
  command.longitudinal.speed = 3.0;
  command.longitudinal.acceleration = 1.0;
  command.lateral.steering_tire_angle = -1.0;
```

![Screenshot from 2024-04-01 14-48-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/fe25ce52-53b8-1769-a62f-4bc763976df5.png)

図ではわかりにくいですが、車両が右回りに旋回します。

# まとめ

Autowareの基本機能を知るための教材を動かしてみました。
絶賛作成中ですので、フィードバックいただけると嬉しいです。