箱庭のカメラ|カメラを「関数」にした


DEVELOPMENT NOTE / 2026.10.25

カメラは、時刻を渡すと絵が返る「関数」になった。

箱庭ラボでは、シミュレーションの中を写すカメラ「箱庭カメラ」を作っています。その記録を 4 回に分けて紹介します。第 1 回は、なぜ箱庭にカメラが要ったのか、そして作ってみて何に気づいたのか、です。

車のカメラの映像。晴れのレインボーブリッジ、魚眼、曲がり角の逆光、雨の都庁。信号や傘の箱庭人間は、カメラが撮影の瞬間に読んだシミュレーションの状態を、そのまま写したものです。

足りなかったもの:カメラ

前のシリーズ「箱庭シナリオPRO」では、道路(OpenDRIVE)とシナリオ(OpenSCENARIO)を流せるようにしました。実在の街の道路で、割り込みや右折のシナリオを、何度でも同じ結果で回せます。

でも、カメラがありませんでした。いまの自動運転の AI、特に E2E(エンド・ツー・エンド)と呼ばれる作りは、カメラの映像を見て、そのまま操作を決めます。シナリオがあっても、AI に見せる映像がなければ、その AI を走らせて確かめる(閉ループで評価する)ことができません。箱庭にとって、カメラは欠けたピースでした。

作るべきか、迷った

正直に言うと、最初は作るつもりがありませんでした。カメラのシミュレーションには、もうプレイヤーがいます。オープンソースなら CARLA、商用なら dSPACE の AURELION や rFpro のような専門の製品です。写実的な絵を作る競争は、ニューラルレンダリングのような新しい技術の方向にも進んでいます。箱庭がそこに入るのは、筋が悪い。

それでも、箱庭の中で気軽に使えるカメラがないことは、これから箱庭ラボで何かを試すたびに、足かせになります。そこで、狙いを絞りました。写実性で勝負するのではなく、同じシナリオを何度回しても、同じ時刻の世界を写せるカメラ。簡単でいい。でも、決定論的であること。

決め手は、箱庭の時刻同期

決定論的なカメラに要るのは、「いつの世界を写したのか」が正確に決まることです。ここで、箱庭のコア技術である時刻同期が効きます。箱庭は、別々に動くシミュレータ(車の物理、シナリオ、人など)を、1 つの時計で進めます。

描画には Godot を選びました。箱庭には既にブラウザの 3D ビューアがありますが、ブラウザ越しでは通信のオーバーヘッドが足かせになります。Godot はオープンソースで、ライセンス(MIT)も扱いやすい。そして箱庭は既に Godot と共有メモリでつながっていたので(箱庭Godot)、1 ms の刻みで時刻を合わせるのも難しくありませんでした。

雨の都庁の交差点。信号は赤で、傘をさした箱庭人間が横断歩道の手前にいる
雨の都庁。信号の灯りはシナリオ(OpenSCENARIO)が、傘の箱庭人間は人のシミュレーションが動かしています。カメラは、それを撮影の瞬間に読んで写すだけです。

気づき:フレームレートで合わせなくていい

作り始めたときは、ゲームエンジンのフレームレートを、シミュレーションの時刻にどう合わせるかを考えていました。毎フレーム、シミュレーションと足並みをそろえる。そうしないと、絵と世界がずれる、と。

でも、動かしてみて気づきました。そもそも、合わせる必要がない。「箱庭の時刻 t の、この位置と向きの絵をください」と頼み、その時刻の世界を描いて返してもらえれば、それで決定論的になるのです。カメラは、時刻と姿勢を渡すと絵が返る、関数になりました。

  • カメラは世界を持たない:車の位置、信号の色、人の関節の角度。世界の状態は、それぞれのシミュレータが箱庭のデータ(PDU)に書き続けています。カメラは頼まれた瞬間にそれを読み、再現して描くだけです。
  • 止まるのは、撮る瞬間だけ:絵を頼むと、描き終わるまで、シミュレーション全体が時刻 t で待ちます。箱庭の時刻同期で全員が t で止まるので、カメラが読む世界は t のまま動きません。絵を頼まないあいだは、物理は描画を待たずに進みます。
  • 世界が分かれていても、同じ時刻の絵になる:車は MuJoCo、信号と対向車は OpenSCENARIO、人は人のシミュレーション。動かしている仕組みが別々でも、1 つの時計の同じ時刻を写します。

絵はゲームエンジン、深さと意味は物理エンジン

カメラが関数になったことで、もう一つできるようになったことがあります。1 台のカメラを、2 つのエンジンで撮ることです。

  • 色の絵(RGB)はゲームエンジンの Godot:光、天気、レンズ。見た目を作るのは、ゲームエンジンの得意分野です。
  • 深さ(デプス)と、物体の意味(セマンティック)は物理エンジンの MuJoCo:どこまで何 m あるか、写っているのが道路か車か。答えは、シミュレーションが計算に使っている形そのものから取ります。

どちらにも「時刻 t、この位置と向き」を渡すので、2 つの絵は同じ瞬間の同じ世界を写します。同じ形から描くので、物体の境目もそろいます。別々のエンジンなので、そろうかどうかは測って確かめました。今回の受入テストの場面で、色の絵で見える境目と塗り分けの境目のずれを測ると、中央値 0 画素、9 割が 1 画素以内でした(測り方は第 4 回で)。カメラは、ゲームエンジンと物理エンジンの両方でできている。これも、カメラを関数にしたから組めた形です。

同じ瞬間の車のカメラの絵。上は Godot が描いた色の絵、下は MuJoCo が描いた物体の意味の塗り分け
同じ時刻・同じ姿勢で頼んだ 2 枚。上の色の絵は Godot、下の物体の意味の塗り分け(物体の種類ごとに色を分けたもの。車は白)は MuJoCo が描いています。
雨の交差点を、赤い傘をさした箱庭人間が横切る。信号は赤と黄色
傘の箱庭人間が、車の前を横切る。人の位置も脚の関節も、撮影の瞬間の値です。

ほかにもあるのか、調べてみた

「こんなの、ほかにないのでは」と思いました。でも、調べてみると、近い考え方はちゃんとありました。

  • CARLA の同期モード:固定の時間刻みで、サーバーがクライアントの合図を待って進めば、センサーの結果を再現できます。ただし、世界と物理を持っているのは描画するエンジン(Unreal Engine)自身です。
  • AirSim:シミュレーションを止めて、撮って、再開する。状態と絵をそろえる使い方が、公式に勧められています。
  • RoboVerse:物理は MuJoCo、描画は Isaac Sim。物理を 1 歩進めるたびに、その状態を描画に流し込みます。「真実は物理、描画は再現するだけ」という考え方は、箱庭とよく似ています。
  • ArmarX(カールスルーエ工科大学のロボット基盤):動いている Godot に、カメラの位置からの描画を頼んで、絵を受け取ります。
  • 商用の製品:dSPACE AURELION、rFpro、VTD などは、物理と同期したセンサーのシミュレーションを製品として持っています。

なので、「世界で初めて」とは言いません。箱庭の違いは、組み合わせです。描画が世界を持たず、頼まれたときに、箱庭のデータから引いてくる(毎回押し込まれるのではない)。世界がいくつのシミュレータに分かれていても、箱庭の 1 つの時計でそろう。それを、Godot と共有メモリという軽くて開いた部品でやっている。そして、どこまでできているかを、数字で示す(第 4 回)。

このシリーズ

  1. カメラを「関数」にした ― なぜ箱庭にカメラが要ったのか(この記事)
  2. 作ってみた ― スキーマの拡張、コアのバグで半日、新しいサービス
  3. 真実はシミュレーションの中に ― カメラは、撮影の瞬間を読んで写すだけ
  4. CARLA と比べてみた ― 同じ場所、同じ条件で測った

次回は、作ってみた話です。最初の半日は、カメラではなく、箱庭のコアのバグと戦っていました。

※ 箱庭カメラは開発中です。製品としての提供範囲・時期は未定です。シミュレーションの画像は、実際のカメラの映像や、それを使うソフトウェアの性能・安全性を保証しません。
※ Godot は MIT ライセンスのオープンソースです。OpenDRIVE・OpenSCENARIO は ASAM e.V. の標準規格です。CARLA、AirSim、RoboVerse、ArmarX、dSPACE AURELION、rFpro、VTD は、それぞれの開発元・権利者のものです。3D 都市モデルは PLATEAU を使っています。

関連:Urban Mobility

← Now Buildingに戻る


トップへ戻る