Skip to content
←返回博客
把 LiDAR 扫描的 3DGS 变成 Isaac Sim 仿真场:数据零加工 + 地面补丁的三步法
3D高斯泼溅Isaac Sim激光雷达

把 LiDAR 扫描的 3DGS 变成 Isaac Sim 仿真场:数据零加工 + 地面补丁的三步法

以渋谷十字路口为例:扫描器原生 3DGS 与网格零加工,只用 LiDAR 实测数据修补网格"地面洞",外观与物理两层叠加搭建 Isaac Sim 仿真环境,PhysX Vehicle 悬吊车辆实测 53 米直行零穿透。

LocaHun 3D(ロケハン3D)2026年8月16日2 分钟阅读525次阅读
EN

流程总览:无加工 3DGS 扫描 → 导入 Isaac Sim → 只补地面孔洞 → 双层叠加跑起来。

本文能给你什么。输入是 LiDAR 融合扫描仪的三个标准产物:3DGS、扫描仪原生网格、稠密 LiDAR 点云(纯相机重建的 3DGS 不适用本流程)。以「地面孔洞修补」作为唯一的后处理步骤,你就能得到一个双层环境——可见的 3DGS 叠在不可见的碰撞体之上——可以在 Isaac Sim 里做机器人行驶、碰撞与传感器验证。全部依赖只有 Python、一个点云处理库和 Isaac Sim 本身。

全局视角:到底为什么需要碰撞体

3DGS 在「看起来对」这件事上无可匹敌。但那是朝着与照片一致的方向优化出来的结果,并不等于几何本身是正确的。直接拿进仿真,会出现两种事故。

第一种是漂浮物(floaters):残留在空无一物之处的 Gaussian 会闯进机器人相机,变成视野噪声。本文的策略是接受它们、不去删除——因为删除类处理一次次地把真实物体也连带毁掉(见文末的可选清理一节)。

第二种才是真正的墙:碰撞判定上的洞。3DGS 没有表面,碰撞必须依靠扫描仪原生网格;但网格上的边界洞(不被任何面闭合的边)在室内会议室扫描中占 4.86%,在渋谷占 9.01%。把机器人放在洞上,会发生这样的事:

失败案例:肉眼明明看得到地板,碰撞网格却有洞——机器人一路加速坠到地板下方 38 米都没停。

同时解决两个问题的架构是双层结构:3DGS 负责外观,不可见的碰撞体负责物理。NVIDIA × Niantic 发布过同形态的管线,用 AI 估计的深度去约束几何——但那是在手里只有 360° 相机时的选择。如果你已经握有实测 LiDAR 深度,就既不需要深度估计模型,也不需要任何再训练:按下面的步骤就能造出同样的东西,作者的验证数据中还包含与学习型方法的定量对比。

STEP 1:把 3DGS 读入 Isaac Sim

把 3DGS 的 PLY 转成 USD(ParticleField 形式)再读入;基础转换与导入流程见作者的配套文章。要让整套配置真正能跑,先排掉两个坑:

  • 对齐坐标系。Y-up 导出的 3DGS(例如从 LCC2 导出的)只需要在引用后绕 X 轴旋转 −90° 立起来即可,不需要重新转换导出。
  • 打开 stage 之前把渲染器固定为 RaytracedLighting。Path Tracing 类模式会把自发光的 3DGS 曝成一片白;而在读入千万级 Gaussian 的场景之后切换渲染模式,是稳定的崩溃方式。务必在导入前设置好。

放置机器人时的单位陷阱。以厘米为单位制作的引用资产——Isaac 自带的叉车就在其中——会被 Kit 自动加上 0.01 的修正缩放。但如果你用 ClearXformOpOrder() 重组 xform,这个修正也会一并消失——于是出现一辆全长 370 米的叉车。重组 xform 之后,请显式写上 scale 0.01。

STEP 2:只补网格上的「地面孔洞」

碰撞体直接使用未经任何加工的扫描仪原生网格。两个看似合理的替代方案都在实践中输了:体素补洞得到的水密外壳会把几何融化成「融化的蜡」的形状;从这种外壳上切下来的补丁则带着尖刺状碎片。无论是细杆还是车挡,原生网格都是你手上最精确的形状信息。

唯一要加的是地面补丁:从实测 LiDAR 表面出发,在 25 厘米网格上构建平滑的地面场,然后只在原生网格完全没有地面的单元里,按地面场高度铺上面。墙体和建筑立面上的洞不影响行驶,放任不管。渋谷场景最终得到 原生 51.4 万 + 补丁 11.4 万 = 62.8 万三角形,行驶区域的垂直射线测试泄漏为 0。只有机器人可能掉下去的洞被封住,其余三角形一个都没变。

同一机位对比三层。上:无加工的 3DGS;中:无加工的扫描仪原生网格(带洞);下:碰撞体(原生网格 + 仅地面补丁)。中、下两层除地面孔洞外完全一致——每一个车挡、每一根杆子都一一对应。

STEP 3:叠起两层,跑起来

组装成一个 USD:在 Z-up 的 stage 上定义 physicsScene;3DGS 直接引用原文件,用 −90° X 旋转立起来(不需要烘焙式重新导出);碰撞体作为 Mesh 嵌入,应用 CollisionAPI 且 approximation=none,再对它调用 MakeInvisible()。双层环境到此完成:外观是无加工的 3DGS,物理是原生网格加地面补丁。

车辆用 PhysX Vehicle(omni.physx.vehicle)搭建。向导式 API(VehicleData + create_vehicle)几行代码就能生成一辆带弹簧悬挂和阿克曼转向的四轮车,驾驶只需要两个值:油门 accelerator(0–1)和转向 steer(−1 到 1)。悬挂会吸收未加工扫描路面的细小起伏,所以不平滑数据也能跑得平稳。这里有两个坑:VehicleData 上要显式指定 rootVehiclePath 和 rootSharedPath;碰撞体要注册进生成的 GroundSurfaceCollisionGroup。

PhysX Vehicle 行驶在成品环境中:沿涩谷十字路口南侧以 ±1 厘米的横向偏差直行 53 米,靠悬挂翻过人行道台阶,最后撞上路口转角的构筑物并稳稳停住——没有穿透,没有穿模。由于采用无加工策略,被扫描进来的行人也充当了真实障碍物。
同一次行驶的车载相机视角。相机作为车体的子节点挂载,你能体验到「机器人相机眼中的涩谷」,连悬挂的晃动都一并保留——穿过斑马线,一路到 MAGNET 前的转角停住。

可选步骤:清理要谨慎

用后处理删掉漂浮物和扫进来的行人是可行的,但删除类处理极容易把杆子、招牌、车挡这些真实物体一并卷走,所以本流程不使用任何删除操作。如果一定要清理,请守住三条:把原始 LiDAR 点云并入参考面;按轮廓(silhouette)而不是按矩形删除;每一轮处理之后,用同一视角对比前后渲染,目视核对每一件消失的东西。若目标是碰撞与路径验证,不删才是最安全的选择。

总结

把 LiDAR 融合扫描仪的 3DGS 变成 Isaac Sim 仿真环境,全部内容只有三行:

  • STEP 1:3DGS 无加工直接引用,−90° X 旋转立起来,读入前把渲染器固定为 RaytracedLighting。
  • STEP 2:碰撞体 = 无加工原生网格 + 仅「地面孔洞」补丁(涩谷:62.8 万三角形、行驶区域零泄漏)。墙上的洞不管。
  • STEP 3:两层叠进一个 USD,碰撞体设为不可见,用带真实悬挂的 PhysX Vehicle 跑起来。不用删除处理,不用再训练。

只需要记住两个局限:LiDAR 没观测过的区域没有表面,行驶路线要留在已观测范围内;由于采用无加工策略,扫进来的行人和停放车辆会作为真实障碍物保留下来。

把 3DGS 读入 Isaac Sim 的基础步骤,作者在另一篇配套文章中有完整整理。

来源:LocaHun 3D 技术博客 —— Isaac Sim向けに3DGSシミュレーション環境をセットアップする

作为亚马逊联盟会员,我们可能从符合条件的购买中获得佣金。