你的目前SDGS scene流程是(參考:3DGS)
video / images
↓
ns-process-data
↓
COLMAP + transforms.json
↓
ns-train splatfacto
↓
3DGS scene
確卜口尸心戈你的流程也明確使用 ns-process-data 處理 video/images,產生 images、transforms.json、colmap,再用 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-export 有 pointcloud、tsdf、poisson、marching-cubes、cameras、gaussian-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,常見問題會是:
- robot 卡住。
- 地面不平,輪子一直跳。
- collision 太複雜,simulation 很慢。
- 光看起來漂亮,但物理互動很差。
- navigation map 很難產生。
所以你需要做 mesh cleanup 和 collision 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 中,你應該:
- visual mesh 用高品質
.obj/.usd - collision mesh 用簡化 geometry
- floor 用乾淨 plane
- wall / desk / cabinet 用 box collision
- 不要讓高面數 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。