コンテンツにスキップ

CommonRoad シナリオを書き出す

drawtonomy の CommonRoad 対応でできることは 3 つあり、いずれも同じキャンバス上で 完結します。

何ができるか入口
描いて書き出す手描き・AI 生成・開いた OpenSCENARIO ファイルのどのシーンも、lanelet 網・dynamicObstacle の軌跡・planningProblem を持つ CommonRoad 2020a シナリオになりますExport ▸ .xml (CommonRoad)
読み込んで往復させるCommonRoad .xml を開くと lanelet の id と接続関係を保ったままキャンバスに載ります。drawtonomy が描かない要素はそのまま持ち越されるので、無編集で書き出せば原文どおりに戻りますキャンバスにドロップ、または Import…
再生して判定するplanner の solution.xml が ego として再生され、公式 checker の判定が再生バッジに載りますsolution.xml (+ .verdict.json) をドロップ、または drawtonomy-cr open

このページで扱うのは 1 行目、CommonRoad の書き出しがファイルを書く前に何を必要と するかです。

planningProblem を持たない CommonRoad シナリオには、planner が解くべきものが どこにもありません。そのためエクスポートが求めるのはちょうど 2 つで、揃うまでは 1 行の理由を出して止まります。

  1. ego: 外部制御される車両を 1 台指定します。これが planning problem の初期状態 になります
  2. ゴールレーン: ego が到達すべき lanelet。<goalState><position> になります

これ以外 (道路網、他車、その軌跡) はすべて描いたものから導出されます。

車両に印が付くまで、その事実は再生状態と同じ場所 (transport 行) に出ています。

シナリオの transport 行。再生ボタンと巻き戻しボタン、1x の速度セレクタ、Follow: Ego、Ghost の隣に「No ego marked」と枠付きで表示されている

No ego marked。ホバーすると直し方が出ます。車両を選んで Attributes パネルの 「Ego (external control)」を入れる。

車両を選択し、Attributes パネル上部のチェックボックスを入れます。

Ego という名前の車両の Attributes パネル。「Ego (external control)」がチェックされ、その下に COMMONROAD グループが開いていて Goal 行に「Pick lane」ボタンが見えている

チェックボックス 1 つ。この車両を「被試験対象 (SUT)」= drawtonomy ではなく planner (または外部シミュレータ) が動かす actor として指定します。

この印が、あらゆる場面での「ego」を決めます。エクスポート時の planning problem に なるのもこの車両で、読み戻した解が適用されるのもこの車両です。印を持てるのは 1 台だけです。

チェックボックスの下の COMMONROAD グループがゴールを持ちます。Pick lane を押すと、 キャンバスは「ゴールを始めたいレーン上の位置」のクリックを待ちます。

drawtonomy のキャンバス。上部に「Click the lane where the goal starts (Esc to cancel)」のヒントが出てレーンが青く色付き、右の Attributes パネルでは Goal 行の Pick lane ボタンが押された状態になっている

Pick lane でキャンバスが待機状態になります。Esc ならゴールを変えずに中断します。

レーンをクリックすると、その地点から前方 50 m の区間がゴール領域になり、キャンバス上で ハイライトされ、パネルに名前が出ます。

1 本のレーンの 50 m 区間がゴール領域として薄い黄土色でハイライトされたキャンバスと、Goal 行に「Lane 10」、その横に 62.1 と 112.1 m の 2 つの数値欄とクリアボタンを表示している Attributes パネル

ゴール区間。道路上でハイライトされ、パネルにはレーン名が出ます。レーン名の横の 2 つの数値がレーン沿いの始点と終点 (メートル) です。レーン名はそのまま別のレーンを 選び直すボタンで、× はゴールを消します。

ゴールについて知っておくとよいことが 2 つあります。

  • レーンに沿った区間は伸縮できます。 Pick lane はクリックした地点から 50 m を置きます。 ハイライトされた帯の両端のハンドルをドラッグするか、2 つの欄に始点と終点のメートルを 打ち込みます (Enter か欄を離れると反映され、undo 1 回で戻ります)。どちらで直しても もう一方が追従します。ゴールは lanelet 全長ではなくその区間 (s0s1) です。 値はレーンの中に収まり、始点と終点は 2 m 以上離れます。区間をレーン全体 (0 から レーン長まで) にすると区間指定は消え、50 m より短いレーンは最初からレーン全体が ゴールになります。
  • ゴール速度区間は任意です。 ゴールレーンの下の Goal speed limit を入れると、 エクスポートは <velocity><intervalStart>0</intervalStart><intervalEnd>v</intervalEnd> を 書きます。これが「ゴールに v 以下の速度で 到達する」の表し方です (停止まで 求めるなら v を 0 にします)。

再生中、ego はゴールに向かって走りません。ゴールは planner に渡す制約であって 経路ではありません。

既存の OpenSCENARIO を開いて CommonRoad として書き出す

Section titled “既存の OpenSCENARIO を開いて CommonRoad として書き出す”

シーンを描く必要はありません。既に持っている .xosc も、同じ 2 つの前提を通せば CommonRoad シナリオになります。

  1. OpenSCENARIO ファイルを開く。 .xosc.xodr を一緒にキャンバスへ ドロップするか、Import….xosc を選び、続けて .xodr を指定します。 道路網はレーンに、各アクターは軌跡を持つ車両になります。詳しい手順は .xosc を開いて再生する

  2. GitHub から直接開くこともできます。 ダウンロード不要で、ファイルの GitHub URL を ?open= に続けるだけです。隣にある .xodr とカタログはその URL からの相対で解決されます。

    https://drawtonomy.com/?open=https://github.com/esmini/esmini/blob/master/resources/xosc/cut-in.xosc
  3. 一度再生する。 軌跡は再生の記録から作られるので、書き出しには 1 回の 再生が必要です。無い場合は他車の初期状態だけが書かれ、その旨が表示されます。

  4. ego に印を付け、ゴールレーンを選ぶ (上記のとおり)。OpenSCENARIO の ego は そのままでは CommonRoad の planning problem になりません。CommonRoad には ゴールも必要で、それがどのレーンかを知っているのは作った人だけです。

  5. Export ▸ .xml (CommonRoad)

引き継がれるもの: lanelet としての道路網、各アクターが走った軌跡を持つ dynamicObstacle、ego の初期状態、選んだゴールレーン。引き継がれないもの: OpenSCENARIO の storyboard そのもの。CommonRoad にはトリガーもアクションも 無いので、planner が受け取るのはストーリーそのものではなく、それを dt = 0.1 s でサンプリングした 結果 です。

シーン上の他の車両はすべて、記録済み軌跡を持つ dynamicObstacle になります。 ある actor がシナリオの一部の時間しか存在しない場合 (ストーリーボードの Add Entity で t = 4 s に登場し、Delete Entity で消える)、エクスポートは その区間をそのまま障害物の [initial, final] タイムステップとして書き、区間外では その障害物は存在しません。再生も同じで、追加前と削除後はキャンバスに居ません。 ファイルを読む planner からは「終端後もずっと走り続ける障害物」ではなく、 終わりのある障害物として見えます。

描いたレーン 1 本が、長さにかかわらず lanelet 1 つになります。1 本のレーンが短い lanelet の連なりに分割されることはありません。横並びのレーンには adjacentLeft / adjacentRight が書かれますが、successor / predecessor が 書かれるのは、あるレーンの終端が次のレーンの始端に実際に接している場合 (境界の左右両方の角が 5 cm 以内) だけです。したがって並走する通し車線だけの シーンは、隣接関係はあるが successorpredecessor も 1 つも無い ファイルとして書き出されます。

直線の lanelet は頂点が 2 個しかありません

Section titled “直線の lanelet は頂点が 2 個しかありません”

境界は、描いたレーンが持つ点の数だけで書き出されます。直線は 2 点で足りるので、 leftBound / rightBound / centerVertices はいずれも、lanelet がどれだけ長くても ちょうど 2 頂点になります。一定間隔に点を水増しすることはしません。120 m の直線は 120 m 離れた 2 頂点です。

CommonRoad の 2 項目は同じ Export サブメニューにあります。

ハンバーガーメニューの Export サブメニューが開いた状態。.svg / .png / .jpg / .eps / .pdf / .drawtonomy.svg / .osm (Lanelet2) / .xodr (OpenDRIVE) に続いて .xml (CommonRoad) と .xml (CommonRoad solution) が 1 つの枠で囲まれ、その下に OpenSCENARIO (.xosc)… / Export video… / Copy URL が並ぶ

項目何を書き出すか
.xml (CommonRoad)シナリオ。lanelet 網、dynamicObstacle の軌跡、ego の planningProblem。planner が読むのはこのファイルです。
.xml (CommonRoad solution)。drawtonomy 自身が記録した ego の軌跡を、公式の CommonRoadSolution 形式で書きます。参照解として、また「planner のものではない軌跡を checker が何と言うか」を見る手段として使えます。

エクスポートを止めるものは 2 つあり、いずれも直す場所を 1 行で言います。

  • ego なし / ゴールレーンなし。 上の 2 つの前提です。
  • Play the scenario first. The solution needs a recorded ego trajectory. solution のエクスポート限定。1 度も再生していなければ書くものがありません。 1 回再生してから書き出します。

録画なしでもシナリオのエクスポート自体は通りますが、そのことを言います (Play the scenario first to include NPC trajectories)。他車は軌跡なしの初期状態 だけになります。完全なファイルが欲しければ 1 回再生してから書き出してください。