本記事では、AIチャレンジ2024の環境でOSS(オープンソースソフトウェア)をサブモジュールとして使用する方法を紹介します。OSSを取り込む方法やサブモジュール化の手順を知りたい方に向けて、実際の作業内容を一から解説します。
今回、以下のリポジトリで公開されている障害物回避用のローカルプランナーを組み込んだROS2パッケージを作成しました。
最終的にOSSを組み込んだソースコードは、こちらのリポジトリで確認できます:
apply_local_planner
ちなみに、上記リポジトリは、GraphBasedLocalTrajectoryPlannerをサブモジュールとして組み込んでいるので、以下の手順でサブモジュールを更新する必要があります。
git clone https://github.com/akodama428/aichallenge2024_public.git
git checkout apply_local_planner
git submodule init
git submodule update
まずは、AIチャレンジ2024のリポジトリをクローンします。
git clone https://github.com/AutomotiveAIChallenge/aichallenge-2024.git
次に、OSSとAutowareを連結するROS2パッケージとしてlocal_planner_customを作成しました。 ROS2パッケージの作成方法は、こちらの記事等が参考になりそうです。 ポイントとしては、setup.pyにて submodulesの設定をする必要があります。
使用したいOSSを以下のように、パッケージ内にサブモジュールとして追加します。今回の例では、以下のコマンドで指定フォルダに追加します。
git submodule add https://github.com/akodama428/AIchallenge_Local_Planner.git aichallenge/workspace/src/aichallenge_submit/local_planner_custom/local_planner_custom/GraphBasedLocalTrajectoryPlanner
次に、OSSに必要なライブラリをインストールします。 AIチャレンジのコンテナ内でのライブラリインストールには、若干試行錯誤が必要だったのでsetup.bashを作りました。 上記のシェルスクリプトを/aichallengeフォルダ直下において、コンテナ内で以下のコマンドを実行すれば、必要なライブラリがインストールされます。
cd /aichallenge
bash setup.bash
今回のローカルプランナは、与えられたグローバルパスに対して、障害物等を回避しながら自車前方のパスを生成するプランナなので、元となるグローバルパスを与えてあげる必要があります。 Roborovsky Noteの記事を参考にさせてもらって、グローバル最適化パスを生成します。 ただし、ローカルプランナにはコース端情報も必要のため、記事の中で出てくるmain_globaltraj.pyの150行目あたりの以下の行のコメントアウトを外した上でmain_globaltraj.pyを実行します。
file_paths["traj_ltpl_export"] = os.path.join(file_paths["module"], "outputs", "traj_ltpl_cl.csv")
上記で生成されたtraj_ltpl_cl.csvをtraj_ltpl_cl_aichallenge.csvにリネームし、 GlobalBasedLocalTrajectoryPlanner内のinputs/traj_ltpl_clフォルダに保存します。
車両諸元等、パラメータファイルを今回のシミュレーション環境に合わせて少し修正する必要があります。 あまりチューニングできてないですが、以下は、そこそこ走行可能なパラメータ設定になっています。 パラメータファイル
local_planner_custom
ノードの作成GlobalBasedLocalTrajectoryPlannerのサンプルコードmain_std_example.pyを参考にROS2ノードを作成します。 まずは、サンプルコードで動作を確認してみます。前章の通りに、グローバルパスやパラメータを正しく設定されていれば、以下のような簡易シミュレーションが実行されます。
グラフベースの回避パスが生成され、障害物回避パスも作られていそうです。 使い方が分かったので、先ほど作ったROS2ノード(local_planner_custom)に組み込みます。 実装の詳細は、local_planner_custom.pyを見ていただきたいですが、基本的には、サンプルコードの入出力をAutowareのIFに置き換えているだけです。
最後に、ローンチファイルreference.launch.xmlを修正して適用します。path_to_trajectory
パッケージを自作のlocal_planner_custom
パッケージに置き換え、実行環境を整えます。
シミュレーション実行結果です。パラメータ調整が十分でないためか、完全には障害物をよけきれていないですが、ローカルパスプランナとしては正しく動作してそうです。
この記事では、AIチャレンジ2024環境でOSSをサブモジュールとして利用する手順を紹介しました。今回の大会のように事前に障害物の位置が与えられている場合は、今回紹介したローカルパスプランナを用いずにMPCの境界制約だけでも十分回避可能かと思いますが、複数車両との競走などでは有効なのかもしれません。 OSSをサブモジュールとして組み込むことで、自分で一から機能開発するより効率的にやりたいことを実現できるので、ぜひ挑戦してみてください。