コンテンツにスキップ

AI シナリオ生成 — 操作を書くだけで検証済みシナリオに

手作業でシナリオを書くと、道路・レーン・トリガー・各アクターの挙動をひとつずつ指定する必要があります。AI 生成を使えば、代わりに操作内容を自然文で説明するだけで済みます。しかも生成された下書きは シミュレータで実際に実行され、検証されてから キャンバスに反映されます。処理はすべてブラウザ内で完結し、自分の API キー を使って動作します。

まずはここから: 白紙のキャンバスで試す

Section titled “まずはここから: 白紙のキャンバスで試す”

もっとも手早く動くシナリオにたどり着く方法です。レーンを 1 本描き、車を 2 台置いて、やってほしいことを書くだけです。

Vehicle2 cuts in front of Vehicle1.

白紙のキャンバスから動くカットインまで: レーンを手描きし、車両を 2 台配置し、一文だけ入力すると、生成されたシナリオが検証・適用・再生されます。その後、ゴースト軌跡でタイムラインをスクラブし、2 回目の実行前にイベントを手で調整しています。

必要な手順はこの 5 つだけです。

  1. Lane ツールで レーンを描き、ハンバーガーメニューから Scenario モードに切り替えます。
  2. Add actor で車両をレーン上に 2 台配置 します。
  3. LOGIC カードの AI ボタンで AI パネルを開き、起こしたい出来事を入力します。キャンバス上のアクターをクリックすると、その名前が挿入されます。
  4. Generate を押します。 検証を通過した内容が通常のフェーズとイベントとしてキャンバスに反映されるので、▶ を押して再生を確認します。
  5. 手で調整します。 生成されたイベントは自由に編集できます。動画では ゴースト軌跡 をオンにして実行結果を再生し、カットインの瞬間までタイムラインを戻し、エディタでイベントを微調整してからもう一度再生しています。

生成結果に特別な扱いはありません。タイムラインをシークする、速度やトリガーを変更する、失敗条件 を追加する、.xosc としてエクスポートする — 自分で書いたシナリオとまったく同じように扱えます。生成後も言葉でやり取りを続けられます。詳しくは 言葉で調整する を参照してください。

同じ流れを、インポートした OpenDRIVE ネットワーク(ここでは CARLA の Town05 マップ)の上でもっと長いリクエストで試します。追い越して車線に戻り、ブレーキをかけるシナリオです。

Vehicle2 comes up behind the Ego in the same lane, moves to the left lane, overtakes the Ego, and cuts back into the Ego’s lane soon after passing, leaving only a small gap. Immediately after cutting in, Vehicle2 brakes to 20 km/h. The Ego follows and keeps a safe distance.

CARLA Town05 マップでのワンテイク: 道路ネットワークをインポートし、車両を 2 台配置し、追い越しの内容を説明すると、生成されたシナリオは 4 つのゲートすべてを通過し、PASS 判定で再生されます。
  1. アクターを配置してリクエストを書く のは利用者の側です。車両を置いた位置は確定した決定として扱われ、モデルには動かさないよう指示されます。
  2. モデルが応答する のは、フェーズ・イベント・アクション・トリガーからなるストーリーボードです。生の XML ではなく、drawtonomy 内部の形式で返されます。
  3. 4 つのゲートが応答を検証します(詳細は後述)。ゲートで問題が見つかると、「どのフィールドが」「何が間違っていて」「どう直すべきか」という具体的なエラーリストに変換され、モデルに送り返されて再試行されます。最大 3 回まで。
  4. 通過した下書きだけがキャンバスに反映されます。 通常のフェーズとイベントとして適用され、実行して確認していない内容が勝手に反映されることはありません(明示的に指定しない限り)。

生成後の結果パネル: 緑色の 4 つのゲートドット、タイムライン上の生成されたフェーズ、調整用の入力欄

ゲート表示名何を検証するか
1Syntax応答がパース可能で、ストーリーボードのスキーマに一致しているか。必須フィールド、既知のアクション・トリガー種別かどうかを確認します。
2Logicレーン ID がマップ上に実在するか、進行方向に矛盾はないか、トリガーが発火し得るか、操作が実際の道路形状に合っているかを確認します。
3Runシナリオを esmini(WebAssembly にコンパイルされ、ブラウザ内で実行)で実際に走らせます。一度も発火しないイベント、動けなくなるアクター、衝突、コースアウトはすべてここで検出されます。
4Meaning記録された軌跡をリクエストの内容と照らし合わせます。実行自体は問題なくても、レーン境界線を一度も越えないカットインは、ここで不合格になります。

ゲート 4 は記録済み軌跡に対する幾何学的なチェックであり、言語モデルによる「二次意見」ではありません。カットインを頼んだのであれば、実際にレーンをまたぐ動きが起きている必要があります。

ゲートとは別に、セマンティックレビュー が生成されたストーリーボードを元の文章と突き合わせ、懸念点があれば提示します。これは自動適用を止めて、採用するかどうかの判断を利用者に返すステップです(Apply with concerns)。懸念点はあくまで参考情報であり、合否を決めるのはゲートです。

ゲートが問題を見つけたら、その場で直る

Section titled “ゲートが問題を見つけたら、その場で直る”
  • 「どのフィールドが」「何が間違っていて」「どう直すべきか」という具体的な内容がそのままモデルに戻され、再試行されます。多くのリクエストは 1 回目か 2 回目で通過します。
  • 過程はパネル上で確認できます。試行回数と現在のステップが 「AI に問い合わせています…」 から 「リクエストと一致しているか確認しています…」 まで表示され、Details を開けばゲートごとの経緯を細かく確認できます。
  • リクエストに手直しが必要だと判明した場合は Try again ボタンが表示され、下書きはタイムライン上に残ったままになります。クリーンな実行を経ずに適用されたシナリオには明確なラベルが付くため、検証済みのシナリオと未検証のシナリオが混同されることはありません。

生成に成功した後の結果パネル: 適用済みシナリオとセマンティックレビューの行

生成は当て推量ではなく、インポートしたマップの情報に基づいて行われます。

  • 道路とレーン — 道路 ID、レーン ID とその種別、進行方向、隣接するレーンの関係、運転者視点で見た左右のレーンがどれか。
  • 自分で置いた配置 — 各車両の道路・レーン・レーン上の位置は、確定した情報として扱われます。
  • この道路上で実現可能な範囲 — 各アクターの前方にどれだけ道路が残っているか、それによってどの速度・どのシナリオ長が現実的に成立するかを判断します。指定した速度がその道路に収まらない場合、黙って書き換えるのではなく、Fitted to the road としてパネルに表示されます。

車両は走行レーンに加えて、入口・出口・オンランプ・オフランプ・接続ランプといったランプ系のレーンにも配置できます。歩行者は歩道・横断歩道・路肩に配置できます。この判定ルールは、手動でアクターを配置するときと AI が配置を提案するときで共通のものが使われているため、自分で描ける範囲と AI が提案できる範囲は常に一致しています。

AI パネルに入力されたプロンプトと、その上にチップとして並ぶ配置済みアクターの一覧

Ego 車両はあくまで「試験対象」

Section titled “Ego 車両はあくまで「試験対象」”

drawtonomy は Ego をスクリプトで動かす一アクターではなく、検証対象のシステムとして扱います。上のデモでは、生成されたストーリーボードのどこにも Ego を減速させる指示は含まれていません。リクエストに書かれているのは 「The Ego follows and keeps a safe distance.」 だけです。実際に見えるブレーキ動作は、赤い車のカットインと減速に反応した、参照実装のクルーズコントローラによるものです。

速度
赤い車(スクリプト制御)60 km/h → 20 km/h。レーンに収まってから 0.7 秒後に減速開始
Ego(スクリプト制御なし)40 km/h → 21 km/h。10 m の車間を保って追従

これが有用なテストの形です。刺激(スクリプト側の挙動)は書き下され、応答(Ego 側の挙動)こそが測定対象になります。この応答を合否判定に変える方法については、終了条件と失敗条件 を参照してください。

カットインの瞬間: 赤い車が Ego のレーンに収まり、ブレーキを開始する

シナリオが適用された後は、同じ入力欄が調整用のボックスに変わります。最初から生成し直すのではなく、変更したい内容を説明するだけで済みます。調整は的を絞った編集として適用されます — 速度、トリガーのしきい値、イベントの追加・削除、シナリオの終了時刻など。手で編集した部分はそのまま残ります。

単純な数値指定はモデルを呼び出さずに処理されます。「Set Vehicle2 to 40 km/h」 のように、対象アクター・数値・単位が 1 つずつ明確な指示は、drawtonomy が直接解決し、パネルには AI 呼び出しが不要だった旨が表示されます。曖昧な指示だけがモデルに送られます。

現在の生成器が表現できる範囲と、その範囲を超えるリクエストに対する挙動です。

  • 幅広い操作の語彙 — 速度変化、車線変更、横方向オフセット、テレポート、車間維持、軌跡追従。トリガー条件はシミュレーション時刻、相対距離、車間時間、速度、他イベントの状態のいずれかです。生成結果は通常のフェーズとイベントとして反映されるため、この語彙の範囲外の内容は、通常の手動編集で追加できます。
  • 見えない裏側の試行 — リクエストは 1 回で解決することもあれば、ゲートによる訂正を挟んで最大 3 回かかることもあります。キャンバスに届くのは、検証を通過した試行だけです。
  • 道路の長さに合わせた実行時間 — シナリオの長さは、操作内容・速度・前方の道路長から逆算されるため、実行は手元の道路の範囲内で必ず完結します。もっと長くしたい場合は、調整用の入力欄でリクエストすれば、的を絞った編集として反映されます。
  • 操作に必要な余白 — 追い越しには道路のスペースが要ります。アクターに約 30 m 以上の区間を与えると、ソルバーが機能する余地が生まれます。

生成には 自分の API キーを使います。リクエストは自分のアカウントとクォータで実行されます。キーはブラウザ内に保存され、選択したプロバイダに直接送信されるだけで、drawtonomy のサーバー・ファイル・ログには一切届きません。

シナリオエディタで AI パネルを開き、下部の API key をクリックします。

AI パネルの API キー行: Anthropic を選択したプロバイダのドロップダウン、キー入力欄、Clear ボタン

  1. プロバイダを選びます — Anthropic(デフォルト)、OpenAI (ChatGPT)Gemini のいずれかです。
  2. キーを貼り付けて Save を押します。入力欄の表示は Replace key に変わり、削除用の Clear ボタンが表示されます。
  3. キーはプロバイダごとに記憶されるため、プロバイダを切り替えても他方のキーが失われることはありません。

Anthropic ConsoleSettings → API keys → Create Key)で作成します。API クレジットが付与された Anthropic アカウントが必要です。Claude のサブスクリプションプランと API 利用は別物である点に注意してください。

パネルは原因を明示します。失敗が黙って処理されることはありません。

表示される内容対処方法
The key was rejectedキーが有効で API アクセス権を持っているか、また(上記の)単一ワークスペースに絞られているかを確認してください。
The API is rate limiting this key少し待ってから Try again を押してください。
The API is temporarily unavailableプロバイダ側の障害です。しばらくしてから再試行してください。