accel_brake_map_calibratorを使ってみよう

# はじめに

自動運転AIチャレンジ2024決勝 @ 11月初旬 に向けて開発を進めています。

https://www.jsae.or.jp/jaaic/2024ver/summary/

実車競技となる決勝では、**車両固有パラメータ** の調整が１つ大きな課題になってきそうです。ここで **車両固有パラメータ** とは、以下の `accel_map.csv` / `brake_map.csv` / `steer_map.csv`などと理解しています。

https://github.com/AutomotiveAIChallenge/aichallenge-2024/tree/main/aichallenge/workspace/src/aichallenge_submit/aichallenge_submit_launch/data

Autowareには、前述の `accel_map.csv` / `brake_map.csv`を自動キャリブレーションしてくれるノード`accel_brake_map_calibrator`が用意されているようです。さすが！

https://github.com/AutomotiveAIChallenge/autoware.universe/blob/awsim-stable/vehicle/accel_brake_map_calibrator/accel_brake_map_calibrator

**早速、使ってみましょう！**

<details><summary> [ 補足や他参考資料 ] </summary>


※ これらのパラメータは、以下の`raw_vehicle_cmd_converter`ノードで使用されているようです。

https://github.com/AutomotiveAIChallenge/autoware.universe/blob/awsim-stable/vehicle/raw_vehicle_cmd_converter

※ もう少し抽象的にとらえると、車両インターフェースのパラメータで、
一般的な制御指令値 → 車両固有の制御指令値の変換、といったところでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/314840db-3592-597d-f86b-07127f71ee37.png)

https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/components/vehicle-interface/


※ 運営の方が書いてくださった、以下記事も非常に参考になりそうです。

https://zenn.dev/ttanaka3/articles/4c1b6dea256ea5

</details>

# `accel_brake_map_calibrator`の使い方

## ノード概要

`accel_brake_map_calibrator`は、
既にAIチャレンジ2024リポジトリに取り込まれているようなので、
まずは以下のように Sub / Pub 等を確認してみました。

`/vehicle/status/actuation_status`, `/vehicle/status/steering_status`, `/vehicle/status/velocity_status`が必要なようです。

```
$ ros2 node info /accel_brake_map_calibrator 
/accel_brake_map_calibrator
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /vehicle/status/actuation_status: tier4_vehicle_msgs/msg/ActuationStatusStamped
    /vehicle/status/steering_status: autoware_auto_vehicle_msgs/msg/SteeringReport
    /vehicle/status/velocity_status: autoware_auto_vehicle_msgs/msg/VelocityReport
  Publishers:
    /accel_brake_map_calibrator/debug/data_average_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/debug/data_count_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/debug/data_count_self_pose_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/debug/data_std_dev_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/debug/occ_index: visualization_msgs/msg/MarkerArray
    /accel_brake_map_calibrator/debug/offset_covariance: std_msgs/msg/Float32MultiArray
    /accel_brake_map_calibrator/debug/original_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/debug/original_raw_map: std_msgs/msg/Float32MultiArray
    /accel_brake_map_calibrator/debug/update_occ_map: nav_msgs/msg/OccupancyGrid
    /accel_brake_map_calibrator/output/calibration_status: tier4_external_api_msgs/msg/CalibrationStatus
    /accel_brake_map_calibrator/output/current_map_error: tier4_debug_msgs/msg/Float32Stamped
    /accel_brake_map_calibrator/output/debug_values: tier4_debug_msgs/msg/Float32MultiArrayStamped
    /accel_brake_map_calibrator/output/map_error_ratio: tier4_debug_msgs/msg/Float32Stamped
    /accel_brake_map_calibrator/output/update_raw_map: std_msgs/msg/Float32MultiArray
    /accel_brake_map_calibrator/output/update_suggest: std_msgs/msg/Bool
    /accel_brake_map_calibrator/output/updated_map_error: tier4_debug_msgs/msg/Float32Stamped
    /diagnostics: diagnostic_msgs/msg/DiagnosticArray
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
  Service Servers:
    /accel_brake_map_calibrator/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /accel_brake_map_calibrator/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /accel_brake_map_calibrator/get_parameters: rcl_interfaces/srv/GetParameters
    /accel_brake_map_calibrator/list_parameters: rcl_interfaces/srv/ListParameters
    /accel_brake_map_calibrator/set_parameters: rcl_interfaces/srv/SetParameters
    /accel_brake_map_calibrator/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
    /accel_brake_map_calibrator/update_map_dir: tier4_vehicle_msgs/srv/UpdateAccelBrakeMap
  Service Clients:

  Action Servers:

  Action Clients:
```

## オフラインキャリブレーション

今回は、事前に運営から共有されたbagファイル`0920_demo_interface_only_0.db3`を使ってオフラインキャリブレーションをしてみます。
ターミナルを3つ立ち上げて、docker環境内で以下のコマンドを打ちます。

```bash:Terminal 1
ros2 bag play /output/0920_demo_interface_only/0920_demo_interface_only_0.db3 --clock --start-offset 415.0
```

```bash:Terminal 2
ros2 launch accel_brake_map_calibrator accel_brake_map_calibrator.launch.xml rviz:=true use_sim_time:=true
```

```bash:Terminal 3
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map base_link
```

以下のRViz2画面が出ればOKです、車速に応じてセルが移動すると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/23c33c99-570c-9ac0-b70a-5b92237650d1.png)

ただ初期設定だとセルが赤いままでほぼキャリブレーションが進みませんでしたので、
以下のパラメータ調整が必要そうです。

https://github.com/AutomotiveAIChallenge/autoware.universe/blob/awsim-stable/vehicle/accel_brake_map_calibrator/accel_brake_map_calibrator/config/accel_brake_map_calibrator.param.yaml

他、以下のissueも参考になりそうでした。

https://github.com/autowarefoundation/autoware.universe/issues/1910

https://github.com/autowarefoundation/autoware.universe/issues/1904


マップの途中保存は以下コマンドで可能です。

```
ros2 service call /accel_brake_map_calibrator/update_map_dir tier4_vehicle_msgs/srv/UpdateAccelBrakeMap "path: '<accel/brake map directory>'"
```

# おわりに

車両固有パラメータ `accel_map.csv` / `brake_map.csv` の自動キャリブレーションノード`accel_brake_map_calibrator`を使ってみました。

実車でのキャリブレーションツールまで揃っているのはさすがAutoware！という感じです。

`steer_map.csv`はどうしようかなあ…
`steer_offset_estimator`なるものがありそうですが… offset だしなあ…と悩んでいます。

https://github.com/AutomotiveAIChallenge/autoware.universe/tree/awsim-stable/vehicle/steer_offset_estimator

実機適合はなかなか大変ですが、楽しんでいきましょう！

この記事は、AI文章校正ツール「ちゅらいと」で校正されています。