By ihsumlee , 7 June 2026
content

你的目前SDGS scene流程是(參考:3DGS

video / images
   ↓
ns-process-data
   ↓
COLMAP + transforms.json
   ↓
ns-train splatfacto
   ↓
3DGS scene

確卜口尸心戈你的流程也明確使用 ns-process-data 處理 video/images,產生 imagestransforms.jsoncolmap,再用 ns-train splatfacto 訓練 3DGS。


1. 先理解:3DGS 本身不是 simulator mesh

3DGS 的結果主要是很多 3D Gaussian primitives。它很適合做:

photorealistic rendering
novel view synthesis
robot camera visual observation

但是 PyBullet、Isaac Sim、iGibson、Habitat-Sim 這類 simulator 通常需要:

triangle mesh
collision mesh
floor plane
wall collision
object collision
navigable area

所以你要做的不是「直接把 3DGS 當成物理環境」,而是從 3DGS 或其 camera/depth/point-cloud 結果中產生 mesh。

正確觀念是:

3DGS = visual layer
Mesh = geometry / collision layer

這也和 Vid2Sim 的概念一致:Vid2Sim 使用 hybrid scene representation,讓 Gaussian Splatting 負責真實視覺,mesh primitives 負責 physical interaction 和 collision detection。


2. 你的完整 mesh pipeline 應該長這樣

建議你把流程改成:

Step 1. Capture video/images
Step 2. ns-process-data video/images
Step 3. ns-train splatfacto
Step 4. Export point cloud or mesh from Nerfstudio
Step 5. Clean mesh in Blender / MeshLab / Open3D
Step 6. Build simplified collision mesh
Step 7. Import visual mesh + collision mesh into simulator
Step 8. Define robot, sensor, navigation goals, and VLN instructions

Nerfstudio 官方文件說,匯出 geometry 的主要指令是 ns-export,point cloud 會匯出成 .ply,textured mesh 會匯出成 .obj


3. Step-by-step:從你的 Splatfacto output 產生 mesh

Step 1:找到訓練完成後的 config.yml

你用的訓練指令是:

CUDA_VISIBLE_DEVICES=0 ns-train splatfacto \
  --data ~/vln_3dgs_project/processed_data/video_test_300 \
  --output-dir ~/vln_3dgs_project/outputs

訓練完成後,Nerfstudio 通常會在 outputs 裡建立類似:

~/vln_3dgs_project/outputs/video_test_300/splatfacto/YYYY-MM-DD_HHMMSS/config.yml

你可以用:

find ~/vln_3dgs_project/outputs -name config.yml

找到它。


Step 2:先輸出 point cloud

我建議第一步先輸出 point cloud,不要直接輸出 mesh。因為 point cloud 可以先檢查幾何品質。

conda activate ns3dgs

ns-export pointcloud \
  --load-config /path/to/config.yml \
  --output-dir ~/vln_3dgs_project/exports/pointcloud_video_test

輸出後你應該會看到:

point_cloud.ply

Nerfstudio 官方也提到,可以用 viewer 的 EXPORT tab 產生 point cloud,或直接用 CLI 匯出。


Step 3:用 Meshlab 或 Blender 檢查 point cloud

安裝工具:

sudo apt install -y meshlab blender

打開:

meshlab ~/vln_3dgs_project/exports/pointcloud_video_test/point_cloud.ply

檢查以下項目:

| 檢查項目 | 好結果 | 壞結果 | | ----------- | ------- | ------------------- | | Floor | 平整、連續 | 破碎、彎曲 | | Wall | 大致垂直 | 扭曲、破洞 | | Furniture | 大致可辨認 | 很多 ghost / floaters | | Scale | 接近真實尺寸 | 太大或太小 | | Camera path | 平滑 | 散亂、跳動 |

你的網頁中也提醒,如果結果破碎,最常見原因通常是 camera pose estimation 不好,而不是 3DGS model 本身不好。


Step 4:輸出 mesh

Nerfstudio 支援多種 geometry export。官方 ns-exportpointcloudtsdfpoissonmarching-cubescamerasgaussian-splat等子命令。

對你的需求,我建議優先試:

ns-export poisson \
  --load-config /path/to/config.yml \
  --output-dir ~/vln_3dgs_project/exports/mesh_poisson_video_test

或:

ns-export tsdf \
  --load-config /path/to/config.yml \
  --output-dir ~/vln_3dgs_project/exports/mesh_tsdf_video_test

通常會輸出:

mesh.obj
texture files
material file

若你要先建立 simulator collision layer,mesh 的 visual texture 不是最重要,乾淨的幾何更重要


4. Mesh 產生後不要直接丟進 simulator

這點非常重要。

從 3DGS / Nerfstudio 匯出的 mesh 通常會有:

floaters
holes
broken surfaces
too many triangles
wrong scale
wrong orientation
thin noisy geometry

如果你直接匯入 PyBullet 或 Isaac Sim,常見問題會是:

  1. robot 卡住。
  2. 地面不平,輪子一直跳。
  3. collision 太複雜,simulation 很慢。
  4. 光看起來漂亮,但物理互動很差。
  5. navigation map 很難產生。

所以你需要做 mesh cleanupcollision simplification


5. 在 Blender 中做 mesh cleanup

Step 1:匯入 mesh

打開 Blender:

blender

匯入:

File → Import → Wavefront (.obj)

或如果是 .ply

File → Import → Stanford (.ply)

Step 2:修正座標方向與比例

你需要確認:

Z axis = up
floor = z = 0
robot scale = meter

如果你的 scene 很大或很小,要用 Blender 調整 scale。

例如真實桌子高度約 0.75 m。 如果 mesh 裡桌子高度變成 7.5 m,就代表 scale 錯 10 倍。


Step 3:刪掉不必要的 floaters

在 Blender 中刪除:

空中漂浮雜訊
破碎小片
場景外部碎片
重建失敗的薄片

這些東西在 3DGS viewer 可能還好,但在 simulator 會變成奇怪障礙。


Step 4:建立 floor collision

我建議不要用重建出來的地板當 collision。 你應該人工建立一個乾淨的 floor plane:

Add → Mesh → Plane
Scale to cover walking area
Set z = 0

這個 floor plane 才是 AMR 或 robot 真正走的平面。


Step 5:建立簡化 collision mesh

對於牆、桌子、櫃子,不要直接使用高面數 mesh。

建議建立簡化 collision:

wall → box
desk → box
cabinet → box
shelf → box
large obstacle → box / convex mesh

這樣 simulator 會穩很多。


6. Visual mesh 與 collision mesh 要分開

你的 simulator 場景最好分成兩個版本。

A. visual mesh

用途:

給人看
給 robot camera render RGB image
做 VLN/VLA visual observation

特性:

高品質
有 texture
可以比較複雜
不一定用於 collision

B. collision mesh

用途:

物理碰撞
導航避障
robot 不穿牆
robot 不穿桌子

特性:

簡化
低面數
乾淨
封閉或接近封閉
尺度正確

這就是你未來 virtual environment 的核心設計:

visual realism 由 3DGS / textured mesh 提供
physical reliability 由 simplified collision mesh 提供

7. 匯入 PyBullet 的做法

PyBullet 最簡單的方式是用 URDF 載入 mesh。

你的資料夾可以整理成:

~/vln_3dgs_project/sim_assets/lab_scene/
    visual/
        lab_visual.obj
        lab_visual.mtl
        texture.png
    collision/
        floor_collision.obj
        wall_collision.obj
        desk_collision.obj
    urdf/
        lab_scene.urdf

URDF 範例:

<?xml version="1.0" ?>
<robot name="lab_scene">

  

    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="../visual/lab_visual.obj" scale="1 1 1" />
      </geometry>
    </visual>

    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="../collision/floor_collision.obj" scale="1 1 1" />
      </geometry>
    </collision>

    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="../collision/wall_collision.obj" scale="1 1 1" />
      </geometry>
    </collision>

  
</robot>

載入 PyBullet:

import pybullet as p
import pybullet_data
import time

p.connect(p.GUI)
p.setAdditionalSearchPath(pybullet_data.getDataPath())
p.setGravity(0, 0, -9.81)

p.loadURDF("plane.urdf")

scene_id = p.loadURDF(
    "/home/user/vln_3dgs_project/sim_assets/lab_scene/urdf/lab_scene.urdf",
    basePosition=[0, 0, 0],
    useFixedBase=True
)

while True:
    p.stepSimulation()
    time.sleep(1/240)

PyBullet 適合你的第一版快速測試:

可以檢查 scale
可以檢查 collision
可以測 AMR 是否會卡住
可以測簡單導航

但 PyBullet 的 photorealistic rendering 不強,所以它比較適合物理和控制 prototype。


8. 匯入 Isaac Sim 的做法

Isaac Sim 比較適合你後續建立 digital twin。

建議流程:

Blender cleanup
   ↓
Export as USD / OBJ / FBX
   ↓
Import into Isaac Sim
   ↓
Set visual mesh
   ↓
Set collision approximation
   ↓
Add robot
   ↓
Add RGB-D camera / LiDAR
   ↓
Run navigation or VLN test

在 Isaac Sim 中,你應該:

  1. visual mesh 用高品質 .obj / .usd
  2. collision mesh 用簡化 geometry
  3. floor 用乾淨 plane
  4. wall / desk / cabinet 用 box collision
  5. 不要讓高面數 scan mesh 直接當 collision

這樣會比直接匯入整個 mesh 穩定很多。


9. 匯入 Habitat-Sim / iGibson 的思路

如果你想貼近 EmbodiedSplat,Habitat-Sim 是最合理的第一選擇。EmbodiedSplat 的流程就是用手機擷取場景,經 Nerfstudio 和 DN-Splatter 產生 mesh,修正 mesh orientation 後載入 Habitat-Sim,再產生 ImageNav episodes。

對 VLN / ImageNav 來說,Habitat-Sim 需要的重點通常是:

scene mesh
navigable area
agent start poses
goal poses
RGB-D sensor
task episodes

而 iGibson 則更重視:

interactive object
object state
physics
household tasks

所以我建議:

第一階段:3DGS mesh → Habitat-Sim
第二階段:3DGS mesh + simplified collision → Isaac Sim / iGibson
第三階段:GS visual layer + mesh collision layer → hybrid simulator

10. 你現在最應該做的實作順序

依照你的網頁目前進度,下一步應該是:

# 1. 找 config
find ~/vln_3dgs_project/outputs -name config.yml

# 2. 建立 export folder
mkdir -p ~/vln_3dgs_project/exports

# 3. 匯出 point cloud
ns-export pointcloud \
  --load-config /path/to/config.yml \
  --output-dir ~/vln_3dgs_project/exports/pointcloud_test

# 4. 檢查 point cloud
meshlab ~/vln_3dgs_project/exports/pointcloud_test/point_cloud.ply

# 5. 匯出 mesh
ns-export poisson \
  --load-config /path/to/config.yml \
  --output-dir ~/vln_3dgs_project/exports/mesh_poisson_test

# 6. 用 Blender 清理 mesh
blender

研究子題:3DGS-based visual-physical scene conversion

英文描述:

We will convert 3DGS-based reconstructed scenes into simulator-compatible visual and physical representations. The visual representation will preserve photorealistic appearance for VLN observations, while the physical representation will be simplified into collision-aware meshes for robot navigation and interaction. This dual-layer representation aims to support both realistic perception and stable physical simulation.

中文意思:

本計畫將 3DGS 重建場景轉換為可供模擬器使用的視覺與物理雙層表示。視覺層保留高真實感外觀,用於 VLN agent 的觀測;物理層則簡化為可碰撞 mesh,用於導航與互動模擬。此雙層表示可同時支援真實感知與穩定物理模擬。


12. 最重要結論

你可以這樣記:

3DGS 不是 mesh simulator。
3DGS 是高真實感視覺表示。
Mesh 是 simulator 的物理與碰撞表示。

所以你的下一步不是只「export mesh」而已,而是建立:

3DGS visual scene
        +
clean simplified collision mesh
        +
navigable map
        +
VLN task wrapper

這樣才是真正可用於 VLN / sim-to-real gap reduction 的 virtual environment。