コンテンツにスキップ

CommonRoad シナリオ作成・エクスポートと planner 結果の再生

シナリオを描く、あるいは手元のファイルを開く。CommonRoad XML として書き出す。 自作の motion planner で解く。その結果を drawtonomy で再生し、公式 checker の 判定をバッジで見る。

CommonRoad はミュンヘン工科大学が公開している モーションプランニング研究のベンチマーク形式です。lanelet で表した道路網、 周囲の交通を記録した軌跡、そして ego に解かせる planning problem を持ちます。 drawtonomy はその流れの両端、つまり作る側と見る側です。

GitHub 上の cut-in .xosc をそのまま開き、ego とゴールレーンを指定して CommonRoad XML を書き出し、commonroad-reactive-planner に解かせて、その結果を drawtonomy で再生するまで。

どの行も行き着く先は同じです。planner が読む CommonRoad XML、再生できる solution、そしてバッジに載る判定です。

出発点やること得られるもの
自分で描いたシナリオレーン・車両・初速を置き、ego に印を付けてゴールレーンを選ぶlanelet と dynamicObstacle の軌跡と planningProblem を持つ CommonRoad 2020a シナリオ
手元の OpenSCENARIO ファイル.xosc と .xodr をドロップする、または ?open= で GitHub から直接開く同じ書き出しが、既に持っているシナリオから得られる。手順は シナリオを書き出す
CommonRoad ベンチマークシナリオ.xml をキャンバスにドロップする編集できるキャンバス上のシナリオ。drawtonomy が描かない要素はそのまま持ち越されるので、編集せずに再エクスポートすれば元のファイルに戻る

solution ができたあとの再生はどれも同じです。solution.xml をドロップすると ego が planner の軌跡をたどります。Ghost を入れると、そのスタンプは選んだ間隔で この走った軌跡に沿って置かれます。 隣に .verdict.json を置けば run バッジが RUN PASS か RUN FAIL で終わり、 tooltip とトーストに Checker PASS 7/7 や Checker FAIL 2/7、通らなかった 検査・関係した障害物・時刻範囲が tooltip とタイムラインに出ます。

  • motion planner を開発していて、ベンチマークコーパス以外のシナリオが欲しい → 自作 planner をつなぐ。 pip install から始まり、同じシーンで naive planner が FAIL、IDM planner が PASS になるところまで通します。
  • OpenSCENARIO 資産があり、それを planner のテストに使いたい → まず シナリオを書き出す、 続けて 自作 planner をつなぐ。
  • 公式の判定と、その根拠を証拠として残したい → Verdict リファレンス に 7 つの検査・サイドカーの形式・バッジの読み方があります。

再生前の drawtonomy のキャンバス。右のレーンに 50 m のゴール区間が薄い黄土色でハイライトされ、Ego の Attributes パネルでは「Ego (external control)」がチェックされ Goal 行が「Lane 10」とその横の 62.1 から 112.1 m と読める

再生前: Ego の印を付けた車両と、クリック 1 回で置いた 50 m のゴール区間。 これが planning problem のすべて。

t = 12.9 s の drawtonomy 画面。反応しない ego が割り込んできた車両と重なっており、transport バーに RUN FAIL のバッジが点いている

描いたままのシナリオ: 108 km/h で走る反応しない ego が t = 12.9 s で割り込みに 出会い、バッジは RUN FAIL。これが planner に解かせる問題。

Export メニュー。SCENARIO 見出しの下に CommonRoad (.xml) と CommonRoad solution (.xml) が OpenSCENARIO と並んでいる

Export で CommonRoad シナリオ XML を書き出す。自分が描いた ego を参照解として 書き出す項目も並んでいる。

同じファイルを commonroad-io の公式レンダラで描画したもの。灰色の lanelet の上でオレンジの ego が青い障害物と重なり、その先に点線の未来軌跡が伸びている

書き出したファイルを planner なしで commonroad-io が再生したところ。描いた ままの ego は同じ 12.9 s で割り込みに当たる。

commonroad-reactive-planner の ego が割り込み車両の左を抜けていく様子を公式レンダラで描画したもの

reactive planner が解いてゴールまで走るところ。障害物衝突・道路境界・ ゴール到達・運動学的実現可能性のすべてが PASS。

planner の solution を drawtonomy で再生したところ。ego が緑の計画軌跡に沿って割り込み車両の左を抜けている

drawtonomy に戻ったところ: planner の ego (白) が緑の計画軌跡に沿って割り込みの 左を抜け、最後にバッジは RUN PASS になる。この緑の濃淡はここでは加速度 (既定。 Trajectory パネルで速度にも切り替えられる) で、計画の先へ行くほど薄くなる。

シナリオ・solution・判定を GitHub リポジトリに置けば、URL 1 本でこの 3 つが 開きます。インストールも拡張機能も要りません。シナリオの GitHub ファイル URL を ?open= に続け、&solution= と &verdict= を足します (シナリオファイルからの相対パスでも、完全な GitHub URL でも構いません)。 必須なのは ?open= だけです。同じ 3 つのパラメータは drawtonomy-cr open が配信しているローカルフォルダに対しても使えます。

URL は次の形の 1 行です (<...> を自分のものに置き換えます)。

https://drawtonomy.com/?open=https://github.com/<owner>/<repo>/blob/<branch>/<path>/<scenario>.xml&solution=<solution>.xml&verdict=<solution>.verdict.json

上の動画で使った公開サンプルファイルで組んだ、実際に開ける例です。

https://drawtonomy.com/?open=https://github.com/kosuke55/drawtonomy/blob/main/packages/drawtonomy-commonroad/tests/fixtures/cutin_commonroad.xml&solution=planner_solution.xml&verdict=planner_solution.verdict.json

このリンクを開く →

OpenSCENARIO を CommonRoad に変換できますか

Section titled “OpenSCENARIO を CommonRoad に変換できますか”

できます。.xosc とその .xodr を開き、ego に印を付け、ゴールレーンを選び、 Export ▸ CommonRoad (.xml) を選びます。道路網は lanelet に、他の各 アクターは軌跡付きの dynamicObstacle に、ego は planningProblem に なります。手順は シナリオを書き出す。

CommonRoad のどのバージョンに対応していますか

Section titled “CommonRoad のどのバージョンに対応していますか”

シナリオファイル・solution ファイルとも CommonRoad XML 2020a です。出力は 公式 XSD で検証済みで、commonroad-io・drivability checker・ commonroad-reactive-planner がそのまま読み込めます。

drawtonomy は公式の drivability checker を実行しますか

Section titled “drawtonomy は公式の drivability checker を実行しますか”

しません。drawtonomy はシナリオを書き出して solution を再生するだけで、合否は commonroad-drivability-checker が決めます。drawtonomy-cr verdict コマンドが 公式の 7 検査を実行し、drawtonomy が RUN バッジに表示する小さな JSON サイドカーを 書き出します。詳細は Verdict リファレンス。

不要です。必須なのは solution.xml だけです。 planning trace は任意で、 走った軌跡に加えて「各再計画サイクルで planner が何をするつもりだったか」を 足します。

エディタ・エクスポート・再生はどのブラウザでも動きます。Linux x86_64 が要るのは 公式 checker だけです (commonroad-drivability-checker が wheel を出しているのが その環境だけのため)。checker が無い場合、verdict は exit code 3 と 1 行の説明を 返して終わり、それ以外はすべて動きます。

CommonRoad ファイルを開くのに何かインストールが要りますか

Section titled “CommonRoad ファイルを開くのに何かインストールが要りますか”

要りません。drawtonomy.com がブラウザで CommonRoad の .xml を読みます。pip install drawtonomy-commonroad が要るのは verdict の ステップと drawtonomy-cr open のループだけです。

自分の車両モデルを使えますか

Section titled “自分の車両モデルを使えますか”

使えます。solution には checker が判定に使う CommonRoad の vehicle model (KS, PM, …) と vehicle type (BMW_320i など) を宣言します。 planning trace にも同じ車体を 宣言すれば、drawtonomy は checker が見たものと同じ形で描画します。

無編集のエクスポートなら全バイトが一致しますか

Section titled “無編集のエクスポートなら全バイトが一致しますか”

値は1点を除いて一致しますが、書式は一致しないことがあります。無編集の要素は 原文のテキストから書き戻すので、開いて再エクスポートした実データのベンチマーク シナリオはバイト単位で一致しました。異なりうるのは次の点です。

  • XMLコメントは残りません。XML宣言が無いファイルには宣言が付きます。
  • 手で整形した要素の一部はインデントが変わります。値は変わりません。
  • stopLineの点は小数6桁で書くため、それより桁の多い停止線の座標は マイクロメートル単位に丸められます。

cooperative solutionの全軌跡を再生・保持しますか

Section titled “cooperative solutionの全軌跡を再生・保持しますか”

いいえ。シーンのegoのplanning problemに合う軌跡があればその1本を選び、 読み込まなかった軌跡を通知します。solutionの全軌跡を保持して無損失で再出力する 機能ではありません。作者のシーンから出力するsolutionは、録画されたegoの軌跡です。

3 段階に分けます。対応は、その要素を読み、キャンバスに概念があれば 編集でき、エクスポートで書くもの。往復のみは、無編集ファイルなら 再エクスポートで原文どおり戻るが、作成・編集する UI が無いもの。 非対応は、そもそも読まない、または読んでも書き戻さないものです。

要素対応往復のみ非対応
lanelet: 幾何、laneletType、userOneWay / userBidirectional、lineMarking、stopLine、adjacentLeft / adjacentRightYes。無編集の lanelet は原文のまま書き戻す。境界点を動かすと変わるのはその点の座標だけで、laneletType、users、lineMarking、adjacentLeft / adjacentRight、標識・信号の参照は原文の値を保つ。predecessor / successor は lanelet の端点のつながりから導き直すので、端点がつながったままなら原文と同じになる。2 本の lanelet が共有する境界はキャンバス上で 1 本の線、lanelet の終点と後続の始点は 1 つの点なので、その点を動かすと、その点を使うすべての lanelet で動く。編集した lanelet の stopLine は標示と参照を保つが、点は落とす (原文の座標が新しい境界に合わなくなりうるため)
trafficSign、intersectionYes (持ち越すが描画・編集はしない。参照先の lanelet の幾何を編集しても残る。その lanelet を消すと落ち、落としたものをトーストで伝える)
trafficLightYes (描画し再生時刻に追従する。信号機は時刻 t の灯色を表示し、信号が掛かる先のレーン (公式 renderer と同じく参照元 lanelet の後続) がその色で塗られる。色と時刻は公式 renderer と同じで、線は公式より細く淡い。Display → Signal lanes で消せる。原文のまま持ち越す。キャンバスで信号機を消すと、信号とその参照が export から落ちる。cycle・direction・位置は編集できず、動かしても位置は書き戻さない)
dynamicObstacle の形状rectanglecircle / polygon (外接矩形で描画。障害物を動かしても元の形状を書き戻す)
dynamicObstacle の state: 位置・向き・時刻・速度・加速度Yes
dynamicObstacle の state: yawRate、slipAngle、上記 5 項目以外の運動学量、区間表現の state (intervalStart / intervalEnd)Yes (編集していない obstacle は原文のまま保持。obstacle を編集すると、編集で変わった state は録画から作り直す。yawRate は動きから計算し直し、slipAngle は state の数が変わらない限り原文の値を引き継ぎ、操舵角などそれ以外の項目と区間表現は保たない。どの obstacle のどの項目を計算し直した・引き継いだ・落としたかを warning で伝える。編集で変わらなかった state は原文の XML のまま)
initialSignalState / signalSeries (灯火・ホーン)再生時に描画し、原文のまま書き戻す。編集した obstacle でも同じ (編集不可、LightStateAction への写像もしない)
staticObstacle、environmentObstacle、phantomObstacleYes (持ち越すが新規作成はしない)
planningProblem (ego 1 台・ゴール 1 つ)Yes (最初の 1 個)2 つ目の planningProblem、2 つ目以降の goalState
ゴール位置: lanelet 参照Yes (レーン全体を Pick lane: 50 m 以下のレーン、または区間をレーン長いっぱいにしたとき。それより長いレーンの区間 (既定 50 m) は <polygon> として書く)
ゴール位置: 矩形・円・多角形Yes (持ち越すが編集不可。1 本の lanelet に収まる矩形は、そのレーン上のゴール区間としても表示する。ゴールレーンを選ぶと領域は、選んだ区間なら <polygon>、レーン全体なら lanelet 参照に置き換わり、時刻・向き・速度の区間は保つ。置き換えたことはトーストで伝える)
ゴールの時刻・向き・速度の区間速度 (上限のみ)、時刻 (秒)、向き (度)
location (geo 参照、tags)Yes (持ち越す)
シナリオメタ情報 (author、source、tags)Yes (持ち越す)
timeStepSize (dt)Yes (開いたファイルの値を保つ)キャンバスでの編集
solution ファイル: PM / KS / ST / MB / KST の trajectory位置・向き・速度を再生する。ego を編集すると、Export はその経路を PM の solution として書く読み込んだ solution は、ego を編集せずにエクスポートすればモデル固有項目も含めてバイト単位で戻るモデル固有項目 (steeringAngle、yawRate など) は再生に使わない

位置 / 時刻 / 向き / 速度の内訳は ゴール判定基準、 連続する OpenSCENARIO の秒数と離散な CommonRoad ステップの対応は 時間の写像 を参照してください。

形式CommonRoad XML 2020a (シナリオ + solution)
パッケージpip install drawtonomy-commonroad (PyPI), Python 3.11+
検証済み公式 XSD · commonroad-io の読み書き往復 · drivability checker · commonroad-reactive-planner · 公式ベンチマークコーパスの手作りシナリオ 635 件でのインポート → 再エクスポート往復
ego / ゴールego を external control として印を付け、キャンバス上でゴールレーンを選ぶ
インポートCommonRoad シナリオ .xml (2020a): lanelet、障害物、planning problem、ゴールレーン。非対応要素は再エクスポートまで持ち越し
再生できる入力CommonRoad solution.xml · checker の判定 (.verdict.json) · planning trace · esmini の .csv ログ · drawtonomy の録画
共有?open=<GitHub ファイル URL> と &solution= / &verdict=
描画対象外交通標識・交差点はインポートと再エクスポートで持ち越されるが、キャンバス上では描画・編集しない。信号は描画され再生時刻で灯色が変わるが、cycle は読み取り専用
利用drawtonomy.com 上で動作、インストール不要

合わせたい planner のワークフローや、うまく開けないベンチマークシナリオが あれば お問い合わせ ください。

関連: .xosc を開いて再生する、 エクスポート形式、 drawtonomy for GitHub。