01 全体像と前提──なぜコライダーが要るのか
3DGSは見た目の再現に関しては圧倒的です。
ただしそれは「写真と一致するように最適化した」結果であって、「形が正しい」わけではありません。
そのままシミュレーションに使うと、二つの事故が起きます。
一つ目はフローター。
実体のない場所に残ったガウシアンがロボットのカメラに映り込み、視界ノイズになります。
本記事の方針ではこれは消さずに受け入れます——削除処理は実在物を巻き添えにしやすいためです(オプション節参照)。
二つ目が本命の当たり判定の穴。
3DGSは面を持たないため衝突にはスキャナ純正メッシュを使いますが、その穴(どの面にも閉じないエッジ)は屋内外どちらのスキャンにも一定量あり、穴の上にロボットを置くとこうなります。
解決の設計は2層構造です。
見た目はフローターを除去した3DGSが担当し、物理は不可視のコライダーが担当します。
NVIDIA×Nianticの同種のパイプラインは深度をAIで推定して形状を拘束しますが、それは360度カメラしか無いための選択です。
LiDARの実測深度を持っているなら、推定モデルも再学習も不要で、以降のステップだけで同じものが作れます。
02 STEP 1:3DGSをIsaac Simに読み込む
3DGSのPLYをUSD(ParticleField形式)へ変換して読み込みます。
基本の変換・読み込み手順は別記事の通りです。
セットアップとしてはここで二つの罠を先に潰しておきます。
- 座標系を揃える。Y-upで出力された3DGS(LCC2由来など)は、参照した上でX軸まわり-90°回転させて立てるだけです。データの変換書き出しは不要です。
- レンダラをRaytracedLightingに固定してからステージを開く。Path Tracing系のモードでは自己発光の3DGSが白飛びします。大きなシーンを読み込んだ後のモード切替はクラッシュの原因になるため、必ず読み込み前に設定します。
03 STEP 2:メッシュの「地面の穴」だけを塞ぐ
コライダーはスキャナ純正メッシュを無加工のまま使います。
ボクセル穴埋めの水密シェルは「溶けたロウ」状に形が崩れ、シェルから切り出したパッチはトゲ状の断片を生みます——どちらも試して負けました。
細いポールや車止めまで含めて、形の情報は純正メッシュが一番正確です。
足すのは地面のパッチだけです。
LiDAR実測面から滑らかな地面の高さ場を作り、純正メッシュに地面が存在しないセルだけをその高さで面化して敷きます。
壁や建物の穴は走行に影響しないため放置します。
渋谷では走行域のどこから落としても抜けないことを確認しています。
ロボットが落ちる穴だけが塞がり、それ以外は1三角形も変わりません。
04 STEP 3:2層を重ねて、走らせる
1つのUSDにまとめます。
Z-upのステージにphysicsSceneを定義し、3DGSは元ファイルをそのまま参照してX軸-90°回転で立てる(座標変換の焼き込み書き出しは不要です)、コライダーはMeshとして埋め込んでCollisionAPI(approximation=none)を適用し、MakeInvisible()で不可視にします。
これで見た目は無加工の3DGS・物理は純正メッシュ+地面パッチの2層環境が完成します。
車両はPhysX Vehicle(omni.physx.vehicle)で作ります。
ウィザードAPI(VehicleData+create_vehicle)で、スプリング/ダンパー付きサスペンションとアッカーマン操舵を備えた4輪車が数行で生成でき、accelerator(0〜1)とsteer(-1〜1)の2値で運転できます。
サスペンションが路面の細かな凹凸を吸収するため、無加工のスキャン路面でも滑らかに走れます。
罠は二つ:VehicleDataにはrootVehiclePathとrootSharedPathを明示すること、コライダーを生成されたGroundSurfaceCollisionGroupに登録することです。
05 オプション:クリーンアップは慎重に
フローターや写り込んだ通行人を後処理で消すことも可能ですが、削除処理はポール・看板・車止めなどの実在物を巻き添えにしやすいため、本手順では行いません。
どうしても消す場合は、参照面に生LiDAR点群を含める・矩形でなくシルエット単位で消す・処理のたびにbefore/afterを同一視点で見比べて消えた物を目視確認する、の3点を守ってください。
衝突・経路検証が目的なら、消さないのが一番安全です。
06 まとめ
LiDAR搭載スキャナの3DGSをIsaac Simのシミュレーション環境にする手順は、この3行に収まります。
- STEP 1:3DGSは無加工のまま参照し、X軸-90°回転でZ-upに立てます。レンダラはRaytracedLightingに固定してから読み込みます。
- STEP 2:コライダーは純正メッシュ無加工+「地面の穴」パッチのみ。壁の穴は放置します。
- STEP 3:2層を1つのUSDに重ね、コライダーを不可視化し、PhysX Vehicle(サスペンション付き)で走らせます。削除処理も再学習も使いません。
限界は二つだけ覚えておけば十分です:LiDARが観測していない領域には面が無いため走行経路は観測済み範囲に限ること、無加工方針のため写り込んだ通行人や停車車両は実在障害物として残ることです。
3DGSをIsaac Simに読み込む基本手順は別の記事にまとめています。
ロケハン3Dでは、実在の空間を
シミュレーションに使える形でスキャンします
LiDARと写真を同時に取得するため、見た目と実測形状の両方が揃ったデータになります。
ロボット検証・デジタルツイン・映像制作まで、用途に合わせた形式でお渡しします。