🚀

AIChallenge入門ガイド(2)

2023/12/31に公開

この記事の対象者

AIChallengeに登録が完了し、環境構築を終えて入門ガイド(1)を完了した方向けの記事です。
https://zenn.dev/ttanaka3/articles/a66b6bfacf81a1
https://zenn.dev/ttanaka3/articles/3dc507df539985

この記事の目的

少しでも早く走行しようと思うと制御アルゴリズムだけではなく、車両のinterfaceまで調整する必要がでてきます。この記事では車両インターフェースの機能の一部の紹介とその調整方法及び説明を行っていきます。

車速変換

現在車速と目標加速度を用いて所望のペダル踏み込み量に変換する際にはAutowareではフィードフォーワード制御を用いています。

フィードフォーワード制御(Feedforward control)は、システムの入力に基づいて制御動作を行う制御方式です。この方式は、予測可能な外乱やシステムの変化に対して、システムの出力が目的の値から逸脱しないように事前に制御を行います。フィードフォーワード制御は、フィードバック制御(入力と出力の差に基づく制御)とは異なり、システムが外乱に反応する前に制御動作を開始することが特徴です。

今回のAI Challengeでは制御入力がペダルの入力(0~100%)とブレーキ油圧(0~6000kPa)になっています。今回の使用車両の特性は以下のページに記載されています。

https://autonomalabs.github.io/AWSIM/RacingSim/VehicleDynamics/

一旦デフォルトのAutowareでは以下のようなcsv形式のアクセルマップ、ブレーキマップが存在しているので今回のAIChallengeではそのMapを流用していました。
ファイルの場所はこちらです。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/main/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/dallara_interface/dallara_launch/dallara_launch/config/accel_map.csv

簡単のため速度からのアクセルペダル変換器の出力は0~1にしておき、車両インターフェースのほうで整数倍して0~100にしています。

さてこのMapの見方について解説していきます。横の列は現在の車速を参照しています。
上記の表では現在速度0[m/s]~13[m/s]のときのアクセル踏み込み量を表すMapになっています。

default,0.0, 1.39, 2.78, 4.17, 5.56, 6.94, 8.33, 9.72, 11.11, 12.50, 13.89

また、表内の数値は現在速度と対応した目標加速度を示しており、その値によって縦列一番左のアクセル踏み込み量に変換しています。現在車速と目標加速度は参照する列の値を線形補間しています。

今回は雑に調整してみました。最大速度が100[m/s]の速度まで対応してるmapになっています。

default,0.0, 1.39, 2.78, 4.17, 5.56, 6.94, 8.33, 9.72, 11.11, 12.50, 100.89
0,0.3,-0.05,-0.3,-0.39,-0.4,-0.41,-0.42,-0.44,-0.46,-0.48,-0.5
0.1,0.6,0.42,0.24,0.18,0.12,0.05,-0.08,-0.16,-0.2,-0.24,-0.28
0.5,3.3,3.25,3.12,2.92,2.68,2.35,2.17,1.98,1.88,1.73,1.61
1.0,50.3,50.25,50.12,40.92,40.68,40.35,40.17,30.98,30.88,30.73,30.61

実際にやってみよう

まだ、brake map側もエラーが出ると思うので、brake mapも調整してみましょう。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/main/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/dallara_interface/dallara_launch/dallara_launch/config/brake_map.csv

[raw_vehicle_cmd_converter_node-17] Input brake: vel: 15.0751 is out of range. use closest value.
[raw_vehicle_cmd_converter_node-17] Input brake: vel: 14.9921 is out of range. use closest value.

ギアの変換

レーシングカーの変速で考慮すべき項目

最適なパワーバンド維持: レーシングカーのエンジンは特定の回転数範囲(パワーバンド)で最大のパフォーマンスを発揮します。アルゴリズムは、この範囲を維持するように変速します。

高速応答性: レース中の迅速な反応が求められるため、変速は非常に高速に行われます。
トラクションコントロール: タイヤのグリップを最大限に活用するため、トラクションを考慮して変速します。

設計時に考慮すべき要素

エンジン特性: エンジンのパワーカーブとトルクカーブを理解し、それに基づいて変速ポイントを決定します。

車両ダイナミクス: 加速、減速、コーナリング時の車両の挙動を考慮し、適切なギア選択を行います。

ドライバーの運転スタイル: ドライバーの好みや運転スタイルに合わせた変速ポイントの調整が必要です。

レース戦略: レースの状況や戦略に応じて、変速アルゴリズムを調整します(例:燃費を考慮したエコ走行、追い上げ時の攻撃的な変速など)。

トラック条件: 天候やトラックの状態(湿度、温度、路面の状態)を考慮し、変速タイミングを最適化します。

これらの要素を踏まえた変速アルゴリズムは、レーシングカーの性能を最大限に引き出し、ドライバーがレースで優位に立てるように設計されます。レースカーの変速アルゴリズムは非常に複雑で、多くのデータと詳細な調整が必要となります。

今回はシミュレータを使用しているので、最適なパワーバンド維持、エンジン特性(難易度高)車両ダイナミクス、レース戦略あたりを改善していきましょう。

実際にやってみよう

今回はチャレンジ要素として残すためにデフォルトで以下のギア変速を行っています。
https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/f6d9b07e8c3c71577a007c88e7fcc560914e8a93/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/dallara_interface/dallara_interface/src/dallara_interface.cpp#L70
こちらは現在速度に応じて変速を行う非常にシンプルなものになっています。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/main/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/dallara_interface/dallara_interface/src/dallara_interface.cpp

    const double gear_thresholds[] = { -1.0, 30.0, 60.0, 90.0, 120.0, 150.0 };
    const int num_gears = sizeof(gear_thresholds) / sizeof(gear_thresholds[0]);
    int gear_cmd_dallara_ = 1;
    for (int i = 1; i < num_gears; ++i) {
        if (speed_kmph < gear_thresholds[i]) {
            break;
        }
        gear_cmd_dallara_ = i + 1;
    }

このアルゴリズムを改良して適切な速度域の調整、加速度などの考慮、その他改善をしていきましょう。

おわりに

さてここまでやると1秒の差が大きくなってくるのではないでしょうか?
足回りも色々と調整してがんばってみましょう。
果たしてaccel brake map職人は生まれるのか!?

Discussion