🚗

自動運転AIチャレンジ2023インテグレーション大会予選振り返り

2023/09/05に公開

自動運転AIチャレンジの予選が9/1で終了しました。
Autowareに興味があったのですが、詳しい構造などは知らなかったので良い機会だと思い参加してみました。
今回は自分の行ったチューニングなどについて忘れないうちにまとめておきたいと思います。

自動運転AIチャレンジの概要

今回私が参加したのは自動運転AIチャレンジ2023のインテグレーション大会です。
https://automotiveaichallenge.github.io/aichallenge2023-sim/index.html

課題は、以下の画像の右上の端に移っているコースの端から、緑色に光っている設定されたコースからはみ出ず、かつ障害物にぶつからずに青く光っているゴールを目指すというものです。
順位はどれくらいゴールに近付けたかによって決まり、時間は関係ないです。
(正確には距離が同じだとかかった時間によって決まりますが、距離が同じになるということはほとんどないです)

参加者がやることは、AWSIM(今回使用するシミュレータ)に車両制御コマンド(ステアリングタイヤ角度や速度など)を入力することです。
AWSIMからはlidarなどのセンサーデータが出ているので、それと地図データを用いて自己位置推定をし、運動計画を立て、必要な車両制御コマンドを計算することになります。
そのプログラムを参加者が作成してオンラインシミュレータで実行し、スコアを競うのが今回の予選でした。
基本的にAutowareを使うことが想定されていると思われますが、車両制御コマンドを出力するプログラムであれば特に問題がないようです。

詳しいルールは公式サイトにあります。

ほとんどの参加者がAutowareのパラメータを今回のコースに合うように調整して課題に取り組んだと思われますが、一部参加者は、自分で運動計画をするアルゴリズムを組んでこの大会の取り組んだ方もいるようです。

私は自律移動ロボットにあまり詳しくないので、自分でモジュールを作る時間はないと考え、Autowareの仕組みを理解しながらチューニングで頑張ってみるという方針で参加しました。

今回のコースのポイントと対策

今回のコースで自分が直面した課題と解決するためにいじったパラメータを説明したいと思います。しかし、パラメータをテキトーに変更しすぎてどう影響しあっているかを全ては把握できていないので、説明したパラメータだけを変更しても上手く動かない可能性があります。

なんとなくでパラメータを変えてみて、挙動が変わるのか試した後に、意味もなく放置されているものもありますが、とりあえず第4コーナーの手前まで進むことができました。
全体のコードはgithub(mainブランチではないので注意です)で公開しているので、色々試してもらえればと思います。
クローンして数回実行すれば1回は140点ぐらいいくと思います。

今回はデフォルトのAutowareではなく、ノード数を減らした最小構成のAutowareであるAutoware miniを使いました。

1. 段ボール直前での一時停止

序盤にコースの中央に段ボールが置かれていて、接近すれば自動で横に移動してくれるのですが、障害物の手前で一時停止する必要があり、一時停止しなければペナルティで減点されてしまいます。

いろいろパラメータをいじっていると、障害物手前で徐行するだけで一時停止しなくなってしまいました。そこで、obstacle stop plannerのパラメータをいじることで解決することができます。
その後の段ボールの障害物では止まらずに避ける必要があるので、いい感じ設定したパラメータが以下です。

obstacle_stop_planner.param.yaml
    stop_planner:
      # params for stop position
      stop_position:
        max_longitudinal_margin: 4.5             # stop margin distance from obstacle on the path [m]
        max_longitudinal_margin_behind_goal: 3.0 # stop margin distance from obstacle behind goal on the path [m]
        min_longitudinal_margin: 4.5             # stop margin distance when any other stop point is inserted in stop margin [m]
        hold_stop_margin_distance: 0.5           # 0.0 the ego keeps stopping if the ego is in this margin [m]

2. 段ボールのスラローム回避

段ボールの障害物が4つあります。それらを回避する必要があります。デフォルトのAutowareでは全ての障害物を回避することができません。

かなり多くのパラメータがあるので個別に説明するのは難しいですが、主にavoidance.param.yamlとobstacle_avoidance_plannerを修正するといいと思います。
特にドキュメント内の以下の図が参考になります。ここにでているパラメータをできるだけ削るといい感じになると思います。

例えば、ドキュメントに以下のように書かれていて、ゴルフカートの車幅が0.975mなのでlateral_collision_safety_bufferを0.6mぐらいが良さそうです。

avoidance.param.yaml
avoidance:
        # avoidance lateral parameters 
        lateral:
          lateral_collision_margin: 0.0                 # [m]
          lateral_collision_safety_buffer: 0.6          # [m] 

3. 狭いL字クランク

第2コーナーからかなり道幅が狭くなるので対策が必要です。

具体的には画像のようにゴルフカートの右前端がはみ出ます。

これは右側のdrivable areaを削ることで解決しました。具体的にはdrivable_area_right_bound_offsetを-0.4mに設定しました。

drivable_area_expansion.param.yaml
    lane_following:
      drivable_area_right_bound_offset: -0.4
      drivable_area_left_bound_offset: -0.0
      drivable_area_types_to_skip: [road_border]

最後に

10月頃に決勝がありますが、決勝では最後の狭いコーナーをどう抜けるか、またどれくらい安定して障害物を回避できるかが重要そうです。
今回は運営の方と参加者が参加できるslack上で課題やAutowareに関する質問ができました。質問をすると他の参加者や運営の方が回答してくださりとても助かりました。
また、予選期間中に他の参加者が投稿してくれた記事もとても参考になりありがたかったです。
ありがとうございました。

Discussion