AI Challenge入門ガイド(1)

2023/12/17に公開

この記事の対象者

AI Challengeで環境構築は終わったけど次にどこから取り組んだらいいのかわからないという方に向けた記事です。AIChallenge自体の概要からよくわからない方は以下の記事をご参考ください。
https://qiita.com/ttanaka3/items/bc8b090f8e427c32e25b

何から取り組めばいいのかわからない方へ

まずは影響が一番大きい地図の修正と制御アルゴリズムの改変をしてみましょう。

lanelet2の地図を編集する(影響大)

lanelet2とは?

今回の大会では車両の走行経路をlanelet2で定義しています。
lanelet2の説明は以下に記載しておきますので、初めての方は軽く読んでおいてください。

https://github.com/fzi-forschungszentrum-informatik/Lanelet2

自動運転車や高度な運転支援システム(ADAS)の発展には、精密で信頼性の高い地図データが不可欠です。この分野における最前線を行くのが、オープンソースのC++ライブラリであるLanelet2です。Lanelet2は道路網の詳細なモデリングと処理に特化しており、自動運転車のナビゲーションシステムの基盤として欠かせない存在になっています。

基本構成要素と機能
Lanelet2の核となるのは「レーンレット」と呼ばれる個々の車線を表す要素です。これらは道路の左右の境界を示す線分で構成され、実際の道路の白線に相当します。また、laneletで表現できない駐車場や交差点などの領域は「エリア」として定義されます。これにより、複雑な道路網も詳細にモデリングすることが可能になります。

Lanelet2のもう一つの重要な機能は、ルーティングと経路計算です。これにより、車両や歩行者のための最適な経路を効率的に導き出すことができます。さらに、交通ルールや速度制限などの規制をデータに組み込むことで、これらを考慮した経路計画が実現されます。

さて、初めての方は今回のレーシングでは地図を使って走行したい経路を作成するのがよいと思います。ショートカットのコースやインコースめに走るような設定をするといいかもしれません。
また、走行したい経路に沿ったcenter lineを引いてみるなども効果的です。

実際にやってみる

実際にやってみましょう。
はじめにVerctorMapの編集ツールを使用するためにT4アカウントを作成します。

https://account.tier4.jp/login?flow=de2e56a3-06d2-4d19-b73d-8bca1ddeeed4

メールアドレスとパスワードを登録してログインします。
(30秒程度で完了するし、登録も使用料も無料みたいです。太っ腹ですねTIERIV)

https://tools.tier4.jp/vector_map_builder_ll2/

今回の大会でaichallenge2023-racingをhome 直下にcloneした人は以下のディレクトリに地図のファイルがあります。

$USER/aichallenge2023-racing/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/aichallenge_submit_launch/map

Fileのタブからimport lanelet2 mapを選択し、laneletを選択して編集します。import PCDから同様にPCDをimportしましょう。以下のように表示されるはずです。

※ PCDはlaneletの高さをエディタ上で指定するときに使用するので今回は一緒にimportするようにしてください。
※ 初めて使用する方はHelpのタブからUserGuidを読んでから取り組むようにしましょう。

途中までやってみましたが、やっぱり説明のために背景があったほうがわかりやすいので、課金版で作業することにしようと思います。
(課金版では衛生写真が見れるようになるらしいです!!!)

create center lineすると中心線が作成されました。

line stringのみを選択してcenter lineをインコース気味にずらしてみました。

FileからExport Lanelet2 mapを選択して元あったフォルダにDownloadします。
よほど自信があれば元のファイルを入れ替えちゃってもいいですが、不安であれば一応別名で保存しておきましょう。

起動してRvizのMapからNamespaceをcenter lineを選択して可視化するととこんな感じで右よりのcenter lineになります。(以下の画像は説明のために経路の出力を切っています。)

さて、走行してみましょう。右よりに走行していますね。

最初しかcenter line引いていないのでつなぎ目はひどいです。

さて上記のような形で走行したい経路の幅寄せを行うとよりタイムを短くできるので試してみてください。とくに曲率の高いカーブは工夫して経路を引きたいですね。最終的には
何何曲線+円弧+何何曲線といった経路点の配置ができるのがベストになると思うので色々と思考錯誤している中で考察してみてください。

制御アルゴリズム Pure Pursuitのチューニングをしてみる(影響中)

Pure Pursuitとは?

Pure Pursuitは、自動運転車やロボットにおいて、目標軌道に沿って移動するための一般的な経路追従アルゴリズムです。このアルゴリズムの主な特徴は、車両の現在位置からある距離先の軌道上の点(先読み点)を目標とし、その点に向かって車両を制御することです。

Pure Pursuitアルゴリズムの概要
先読み点: アルゴリズムは、車両の前方にある特定の距離に位置する軌道上の点をターゲットとします。この点は先読み点と呼ばれ、車両はこの点に向かって進むように制御されます。
ステアリング角の計算: 先読み点に向けてステアリングをどの程度切るかは、車両の現在位置と先読み点との間の幾何学的関係に基づいて計算されます。
パット見た感じMatlabの解説がすごくわかりやすく書かれていたので、こちらを参考にするといいかもしれません。

https://jp.mathworks.com/help/nav/ug/pure-pursuit-controller.html

実際にやってみる

このあたりのlaunchファイルを参考にパラメータをチューニングしてみましょう。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/f6d9b07e8c3c71577a007c88e7fcc560914e8a93/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/aichallenge_submit_launch/launch/autoware_micro_awsim.launch.xml#L232

use_external_target_vel: これはlanelet2 mapからの目標速度を設定するかどうかを示すbool値です。trueの場合、以下の固定値の速度が提供されます。
external_target_vel: 指定された目標速度(単位は通常メートル/秒)。ここでは10.0と設定されています。
lookahead_gain: 先読み距離を決定するゲイン。車速にこのゲインを乗算して先読み距離を決定します。ここでは0.4と設定されています。
lookahead_min_distance: 先読み点までの最小距離。車速が低い場合でも、この値以上の距離を先読み点として設定します。ここでは5.0メートルとされています。
speed_proportional_gain: 速度制御の比例ゲイン。目標速度と現在速度の差にこのゲインを乗算して、加速度を計算します。ここでは1.0と設定されています。

地図の上限速度は250km/hまで上げられますが上げれば当然カーブで曲がりきれなくなります。
上記のパラメータを調整し、高速でもコースをはみ出さずに走行できるように頑張りましょう。

自作パッケージを作成してみる(影響?)

さて、難易度が最も高い自作パッケージについてです。
今回はカスタマイズしやすいようにほぼ空のPathWithLaneIdからTrajectoryに変換するパッケージを用意しました。このパッケージを元に様々な試行錯誤をしてみてください。

$USER/aichallenge2023-racing/docker/aichallenge/aichallenge_ws/src/aichallenge_submit/autoware_micro/path_to_trajectory

おわりに

色々工夫しているうちにギアの変速、車速からペダル踏み込み変換、カーブ時の減速アルゴリズムなど様々な気になる点が出てきて壁にぶち当たると思います。それは上級自動運転エンジニアへの一歩なので気にせず試行錯誤を続けてみてください。

休日の暇な時間に執筆しているので更新は確約できませんが、この記事が好評であれば続編もだそうと思います。

ではでは!!

Discussion