Add multiple research papers in PDF format to the repository, including recent works on AI and physics, with file sizes ranging from 1.7 MB to 32.3 MB.
Sync to site1 / sync (push) Has been cancelled
Sync to site1 / sync (push) Has been cancelled
This commit is contained in:
@@ -38,6 +38,7 @@ categories: ["HotelScene"]
|
||||
### 相关参考文档
|
||||
|
||||
- **[../hotel_model.md](../hotel_model.md)** - 原始项目方案
|
||||
- **[game_engine_simulation_plan.md](game_engine_simulation_plan.md)** - 结合 3D 游戏引擎的室内世界模型验证方案
|
||||
- **[../understanding_physics_research_plan.md](../understanding_physics_research_plan.md)** - 物理世界理解研究计划
|
||||
- **[../world_models_review.md](../world_models_review.md)** - 世界模型技术综述
|
||||
- **[../physics_world_models_review.md](../physics_world_models_review.md)** - 物理世界模型综述
|
||||
@@ -142,6 +143,7 @@ categories: ["HotelScene"]
|
||||
|
||||
### 技术产出
|
||||
- 🏗️ 10个场景的数字孪生模型
|
||||
- 🎮 3D 游戏引擎交互验证场景
|
||||
- 🤖 物理仿真环境(Isaac Sim)
|
||||
- 🧠 预训练M-JEPA模型
|
||||
- 📐 CAD模型库
|
||||
|
||||
@@ -0,0 +1,590 @@
|
||||
---
|
||||
title: "结合 3D 游戏引擎的室内世界模型验证方案"
|
||||
date: 2026-05-31
|
||||
draft: false
|
||||
tags: ["规划", "3D游戏引擎", "仿真", "数字孪生", "物理", "机器人"]
|
||||
categories: ["GameEngine"]
|
||||
---
|
||||
|
||||
# 结合 3D 游戏引擎的室内世界模型验证方案
|
||||
|
||||
## 1. 方案定位
|
||||
|
||||
本方案在现有 **RoomPlan / ZED 2i / PRISM / 世界模型** 技术链路之外,引入 3D 游戏引擎作为一个新的工程层:
|
||||
|
||||
> **3D 游戏引擎不是替代 SLAM、PRISM 或 Isaac Sim,而是作为“可交互数字孪生运行时”:负责实时渲染、交互编辑、轻量物理验证、合成数据生成、多人演示与人工标注。**
|
||||
|
||||
它解决现有方案中的三个缺口:
|
||||
|
||||
1. **可视化缺口**:研究系统输出的 mesh、3DGS、场景图、语义层需要一个直观、可交互、可调试的前台。
|
||||
2. **交互缺口**:机器人任务不仅要离线评测,还要让研究员快速拖拽物体、修改材质、设置碰撞体、回放动作。
|
||||
3. **数据缺口**:真实酒店采集成本高,游戏引擎可生成可控扰动、光照变化、遮挡、人流和任务变体。
|
||||
|
||||
---
|
||||
|
||||
## 2. 总体架构
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph CAPTURE["真实世界采集"]
|
||||
IPHONE["iPhone RoomPlan<br/>USDZ / JSON / CAD"]
|
||||
ZED["ZED 2i<br/>RGB-D / VIO / 点云"]
|
||||
end
|
||||
|
||||
subgraph MEMORY["空间记忆与世界模型"]
|
||||
PRISM["PRISM<br/>L1-L4 空间记忆"]
|
||||
WM["World Model<br/>M-JEPA / DreamerV3 / Video WM"]
|
||||
end
|
||||
|
||||
subgraph ASSET["资产转换层"]
|
||||
CLEAN["Mesh 清洗<br/>尺度/坐标/法线/拓扑"]
|
||||
SEM["语义绑定<br/>object_id / affordance / material"]
|
||||
USD["USD / glTF / FBX<br/>统一资产包"]
|
||||
end
|
||||
|
||||
subgraph ENGINE["3D 游戏引擎运行时"]
|
||||
VIEW["实时可视化<br/>PBR / 灯光 / UI"]
|
||||
PHYS["轻量物理沙盒<br/>碰撞 / 约束 / 关节"]
|
||||
SYN["合成数据<br/>RGB / Depth / Seg / Flow"]
|
||||
EDIT["交互编辑<br/>拖拽 / 标注 / Remix"]
|
||||
end
|
||||
|
||||
subgraph ROBOT["机器人与评测"]
|
||||
ROS["ROS 2 Bridge"]
|
||||
TASK["任务脚本<br/>导航 / 抓取 / 推拉"]
|
||||
EVAL["评测指标<br/>成功率 / 偏差 / 鲁棒性"]
|
||||
end
|
||||
|
||||
IPHONE --> CLEAN
|
||||
ZED --> CLEAN
|
||||
CLEAN --> SEM --> USD --> ENGINE
|
||||
PRISM --> SEM
|
||||
ENGINE --> ROS --> TASK --> EVAL
|
||||
ENGINE --> SYN --> WM
|
||||
WM --> PRISM
|
||||
PRISM --> ENGINE
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 引擎选型建议
|
||||
|
||||
| 引擎 | 适合角色 | 优点 | 局限 | 建议定位 |
|
||||
|------|----------|------|------|----------|
|
||||
| **Unreal Engine** | 高保真酒店数字孪生、演示、复杂交互 | 渲染质量强,Chaos Physics 支持刚体、约束、破坏、流体等实时物理能力 | 机器人生态需要自建桥接,工程复杂度高 | **主推荐:视觉与交互前台** |
|
||||
| **Unity** | 快速原型、Web/移动端、CrowdRoom 编辑器 | C# 开发快,生态适合工具型产品,Unity Robotics 有 ROS TCP Connector | 官方 ROS TCP Connector 最近主版本较旧,长期维护风险需评估 | **推荐:MVP 和产品化编辑器** |
|
||||
| **Godot** | 开源轻量工具、内部标注器 | 开源、轻量、部署灵活 | 高保真渲染、机器人仿真生态弱 | **可选:低成本标注/浏览工具** |
|
||||
| **NVIDIA Isaac Sim** | 机器人精确仿真、传感器、合成数据 | 基于 OpenUSD,面向机器人仿真、测试与合成数据,天然适合 URDF/CAD/USD 资产链路 | 不适合作为普通用户产品前台,学习和硬件成本较高 | **保留:严肃机器人仿真后端** |
|
||||
|
||||
推荐采用“双引擎分工”:
|
||||
|
||||
- **Unreal / Unity**:面向人类研究员和产品用户的交互前台。
|
||||
- **Isaac Sim**:面向机器人控制、传感器仿真、强化学习和 sim-to-real 的高可信仿真后端。
|
||||
|
||||
---
|
||||
|
||||
## 4. 核心管线
|
||||
|
||||
### 4.1 真实扫描到游戏场景
|
||||
|
||||
```text
|
||||
iPhone RoomPlan / ZED 2i
|
||||
→ 坐标系统一:米制、Z-up/Y-up 转换、世界原点锚定
|
||||
→ Mesh 清洗:去噪、补洞、简化、法线修复
|
||||
→ 语义绑定:room_id、object_id、category、bbox、affordance
|
||||
→ 碰撞体生成:墙体 box collider、家具 convex hull、可操作物体 articulated body
|
||||
→ 材质重建:PBR baseColor / roughness / metallic / normal
|
||||
→ 导出:USD 为主,glTF/FBX 为 Web 和通用引擎备选
|
||||
```
|
||||
|
||||
关键原则:
|
||||
|
||||
- **视觉资产和物理资产分离**:高精 mesh 用于渲染,低复杂度 collider 用于物理。
|
||||
- **PRISM ID 贯穿全链路**:游戏引擎中的每个物体都保留 `spatial_node_id`,方便回写空间记忆。
|
||||
- **可编辑但可追溯**:人工在引擎中修正的材质、碰撞体、关节参数,要以 patch 形式回写,而不是覆盖原始扫描。
|
||||
|
||||
### 4.2 游戏引擎到 PRISM
|
||||
|
||||
游戏引擎不是只读 viewer,而是 PRISM 的交互标注和实验入口:
|
||||
|
||||
| 引擎事件 | 回写到 PRISM |
|
||||
|----------|--------------|
|
||||
| 研究员拖动椅子 | `delta/object_pose_changed` |
|
||||
| 修正门的旋转轴 | L4 节点 `joint.axis` / `joint.limit` |
|
||||
| 标注“可抓取”区域 | `affordance.graspable_regions` |
|
||||
| 设置碰撞体 | L2/L4 物理代理属性 |
|
||||
| 回放机器人失败轨迹 | episode memory + anomaly |
|
||||
|
||||
### 4.3 游戏引擎到世界模型
|
||||
|
||||
游戏引擎可生成有控制变量的训练数据:
|
||||
|
||||
| 数据类型 | 用途 |
|
||||
|----------|------|
|
||||
| RGB / Depth / Normal | 训练感知 encoder |
|
||||
| Instance Segmentation | 训练 2D/3D 语义分割 |
|
||||
| Optical Flow | 训练动态预测 |
|
||||
| Action-State Pair | 训练 DreamerV3 / TD-MPC2 |
|
||||
| Counterfactual Rollout | 训练“如果推椅子会怎样”类预测 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 可交互数字孪生运行时详细方案
|
||||
|
||||
本节把“可交互数字孪生运行时”具体化为一个可开发的软件系统。它不是简单的 3D Viewer,而是一个面向研究员、机器人算法工程师和数据标注人员的 **Scene Lab**:能看、能查、能改、能模拟、能回放、能把修改写回 PRISM。
|
||||
|
||||
### 5.1 产品形态
|
||||
|
||||
建议先做桌面端,再做 Web 端:
|
||||
|
||||
| 形态 | 技术路线 | 目标用户 | 适合阶段 |
|
||||
|------|----------|----------|----------|
|
||||
| **桌面 Scene Lab** | Unity Editor Runtime / Unreal Editor Utility | 研究员、算法工程师 | P0 MVP |
|
||||
| **Web Viewer** | Three.js/R3F 或 Unity WebGL | PM、合作酒店、标注人员 | P1 展示与轻编辑 |
|
||||
| **Pixel Streaming 高保真版** | Unreal Pixel Streaming | 远程演示、客户评审 | P1/P2 |
|
||||
|
||||
P0 阶段推荐做 **Unity 桌面 Scene Lab**,原因是迭代快、UI 工具多、和 JSON/glTF/ROS 接口打通成本低。Unreal 分支用于高保真展示,不阻塞 MVP。
|
||||
|
||||
### 5.2 主界面布局
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ Top Bar: 场景选择 | 模式切换 | 保存 Patch | 运行任务 | 导出数据 │
|
||||
├───────────────┬──────────────────────────────┬───────────────┤
|
||||
│ Scene Tree │ │ Inspector │
|
||||
│ - room_305 │ 3D Viewport │ object_id │
|
||||
│ - wall_01 │ 轨道相机 / 第一人称 / 机器人视角 │ pose/bbox │
|
||||
│ - bed_01 │ 语义高亮 / 热力图 / 轨迹回放 │ material │
|
||||
│ - chair_01 │ │ physics │
|
||||
├───────────────┴──────────────────────────────┴───────────────┤
|
||||
│ Timeline / Logs: episode 回放 | 事件列表 | PRISM delta diff │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
核心交互模式:
|
||||
|
||||
| 模式 | 快捷操作 | 用途 |
|
||||
|------|----------|------|
|
||||
| `Explore` | orbit / fly / first-person | 浏览房间、走廊、大堂 |
|
||||
| `Inspect` | click object | 查看 PRISM 节点、语义、bbox、来源帧 |
|
||||
| `Edit` | translate / rotate / scale | 修正物体位姿、墙体边界、家具尺寸 |
|
||||
| `Physics` | add collider / set joint / simulate | 设置碰撞体、质量、摩擦、门/抽屉关节 |
|
||||
| `Annotate` | paint / box / polygon | 标注可抓取区域、不可通行区、危险区 |
|
||||
| `Replay` | play / pause / scrub | 回放机器人轨迹和失败 episode |
|
||||
| `Generate` | randomize / capture | 生成合成 RGB-D、分割、扰动样本 |
|
||||
|
||||
### 5.3 模块拆分
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
LOAD["Scene Loader<br/>USD/glTF/JSON"]
|
||||
REG["Registry<br/>object_id ↔ actor"]
|
||||
VIEW["Viewport<br/>render layers"]
|
||||
SEL["Selection<br/>raycast/pick"]
|
||||
EDIT["Edit Tools<br/>transform/material/collider"]
|
||||
PHYS["Physics Sandbox<br/>simulate/reset"]
|
||||
PATCH["Patch Recorder<br/>diff/event log"]
|
||||
BRIDGE["PRISM Bridge<br/>load/save/query"]
|
||||
EXPORT["Export<br/>dataset/episode"]
|
||||
|
||||
LOAD --> REG --> VIEW
|
||||
VIEW --> SEL --> EDIT --> PATCH
|
||||
EDIT --> PHYS --> PATCH
|
||||
PATCH --> BRIDGE
|
||||
VIEW --> EXPORT
|
||||
PHYS --> EXPORT
|
||||
```
|
||||
|
||||
| 模块 | 职责 | P0 要做到 |
|
||||
|------|------|-----------|
|
||||
| Scene Loader | 加载 `scene.glb/usd`、`scene_graph.json`、材质贴图 | 一个客房可稳定加载 |
|
||||
| Object Registry | 建立 `spatial_node_id` 到引擎 actor 的映射 | 点击物体能查 PRISM ID |
|
||||
| Viewport | 多视角浏览、图层开关、语义上色 | 支持 RGB / semantic / collider 三种视图 |
|
||||
| Inspector | 展示和编辑节点属性 | 可改类别、名称、位姿、物理参数 |
|
||||
| Edit Tools | 拖拽、旋转、缩放、吸附、撤销 | 支持家具位姿修正 |
|
||||
| Physics Sandbox | 局部物理仿真与 reset | 支持椅子推动、门旋转、抽屉滑动 |
|
||||
| Patch Recorder | 记录所有人工修改 | 导出 JSON Patch |
|
||||
| PRISM Bridge | 读取/写回 PRISM 数据 | 文件级 API 即可,不要求实时服务 |
|
||||
| Dataset Exporter | 截图、深度、分割、episode log | 导出一组训练样本 |
|
||||
|
||||
### 5.4 数据输入与目录结构
|
||||
|
||||
每个场景打包为一个可版本化目录:
|
||||
|
||||
```text
|
||||
hotel_305_scene/
|
||||
manifest.json
|
||||
assets/
|
||||
room_shell.glb
|
||||
furniture.glb
|
||||
textures/
|
||||
prism/
|
||||
scene_graph.json
|
||||
spatial_nodes.json
|
||||
spatial_edges.json
|
||||
physics/
|
||||
colliders.json
|
||||
joints.json
|
||||
materials.json
|
||||
episodes/
|
||||
nav_fail_001.json
|
||||
patches/
|
||||
2026-05-31_manual_fix.json
|
||||
```
|
||||
|
||||
`manifest.json` 作为运行时入口:
|
||||
|
||||
```json
|
||||
{
|
||||
"scene_id": "hotel_305",
|
||||
"unit": "meter",
|
||||
"up_axis": "Y",
|
||||
"origin": "room_center",
|
||||
"render_assets": ["assets/room_shell.glb", "assets/furniture.glb"],
|
||||
"prism_graph": "prism/scene_graph.json",
|
||||
"physics": {
|
||||
"colliders": "physics/colliders.json",
|
||||
"joints": "physics/joints.json",
|
||||
"materials": "physics/materials.json"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.5 实时可视化能力
|
||||
|
||||
运行时至少提供 6 个可切换视图:
|
||||
|
||||
| 视图 | 显示内容 | 用途 |
|
||||
|------|----------|------|
|
||||
| `Render View` | PBR 材质、灯光、阴影 | 检查视觉真实感 |
|
||||
| `Semantic View` | 不同类别用不同颜色 | 检查语义分割和类别错误 |
|
||||
| `Instance View` | 每个实例独立颜色 | 检查实例切分 |
|
||||
| `Physics View` | collider、joint、mass center | 检查物理代理 |
|
||||
| `Navigation View` | 可通行区域、障碍物、路径 | 调试机器人导航 |
|
||||
| `Memory View` | PRISM L1-L4 图层 | 看空间记忆如何覆盖场景 |
|
||||
|
||||
关键 UI 功能:
|
||||
|
||||
- 点击任意物体,高亮对应 `SpatialNode`,并显示来源:RoomPlan / ZED / 人工修正 / WM 推断。
|
||||
- 支持按类别过滤:只看门、床、桌椅、可移动物、可抓取物、动态障碍。
|
||||
- 支持显示不确定性:低置信度物体用闪烁边框或热力图提示。
|
||||
- 支持对比模式:`真实扫描` vs `人工修正后` vs `世界模型预测后`。
|
||||
|
||||
### 5.6 交互编辑能力
|
||||
|
||||
编辑不是自由建模,而是围绕 PRISM/机器人验证需要设计的受控编辑。
|
||||
|
||||
| 编辑对象 | 可编辑字段 | 保存位置 |
|
||||
|----------|------------|----------|
|
||||
| 房间结构 | 墙体位置、高度、门洞、窗洞 | `patches/*.json` + PRISM L2 |
|
||||
| 家具 | 位姿、尺寸、类别、是否可移动 | PRISM L4 `SpatialNode` |
|
||||
| 材质 | roughness、metallic、friction 映射 | `physics/materials.json` |
|
||||
| 碰撞体 | box/capsule/convex mesh | `physics/colliders.json` |
|
||||
| 关节 | revolute/prismatic、轴向、范围 | `physics/joints.json` |
|
||||
| 导航区域 | walkable、blocked、slow zone | PRISM L2/L3 |
|
||||
| 可供性 | graspable、pushable、openable | PRISM L4 |
|
||||
|
||||
编辑操作必须满足三条规则:
|
||||
|
||||
1. **所有修改都是 patch**:保留原始扫描结果,不直接覆盖。
|
||||
2. **每个 patch 有来源**:记录 `author`、`timestamp`、`tool`、`reason`。
|
||||
3. **可回放和可撤销**:patch 可以按顺序 apply,也可以 rollback。
|
||||
|
||||
示例 patch:
|
||||
|
||||
```json
|
||||
{
|
||||
"patch_id": "manual_fix_20260531_001",
|
||||
"scene_id": "hotel_305",
|
||||
"author": "researcher",
|
||||
"ops": [
|
||||
{
|
||||
"op": "replace",
|
||||
"path": "/nodes/chair_305_01/pose_world",
|
||||
"value": [1.42, 0.0, -0.33, 0.0, 0.707, 0.0, 0.707],
|
||||
"reason": "RoomPlan 椅子朝向错误"
|
||||
},
|
||||
{
|
||||
"op": "add",
|
||||
"path": "/nodes/drawer_305_02/joint",
|
||||
"value": {
|
||||
"type": "prismatic",
|
||||
"axis": [1, 0, 0],
|
||||
"limit_m": [0.0, 0.42]
|
||||
},
|
||||
"reason": "为床头柜抽屉补充可操作关节"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 5.7 轻量物理沙盒
|
||||
|
||||
游戏引擎中的物理层只负责快速验证和交互调试,不作为最终物理真值。
|
||||
|
||||
P0 支持:
|
||||
|
||||
- 刚体:椅子、行李箱、垃圾桶、床头柜小物体。
|
||||
- 静态碰撞体:墙、地面、床、柜体、卫生间台面。
|
||||
- 关节:门的旋转关节、抽屉的滑动关节。
|
||||
- 材质参数:摩擦、弹性、质量、重心。
|
||||
- 局部 reset:只重置当前物体或当前房间,不重载全场景。
|
||||
|
||||
P1 再支持:
|
||||
|
||||
- 布料近似:床单、窗帘只做视觉和碰撞近似。
|
||||
- 液体/破碎效果:只做异常事件可视化,不进入机器人控制闭环。
|
||||
- 多人/多机器人:用于拥堵和动态障碍测试。
|
||||
|
||||
### 5.8 与 PRISM 的读写接口
|
||||
|
||||
P0 不需要数据库服务,直接文件接口即可:
|
||||
|
||||
```text
|
||||
load_scene(manifest.json)
|
||||
→ load_assets()
|
||||
→ load_prism_graph()
|
||||
→ bind_actor_to_spatial_node()
|
||||
|
||||
edit_object()
|
||||
→ update_runtime_actor()
|
||||
→ append_patch_op()
|
||||
|
||||
save_patch()
|
||||
→ validate_patch()
|
||||
→ write patches/*.json
|
||||
→ optional: export prism_delta.json
|
||||
```
|
||||
|
||||
P1 可以升级为本地 HTTP 服务:
|
||||
|
||||
| API | 方法 | 用途 |
|
||||
|-----|------|------|
|
||||
| `/scene/:id` | GET | 获取场景 manifest |
|
||||
| `/scene/:id/nodes` | GET | 获取 PRISM 节点 |
|
||||
| `/scene/:id/patches` | POST | 保存人工修正 |
|
||||
| `/scene/:id/query` | POST | 自然语言或类别查询 |
|
||||
| `/scene/:id/episodes` | POST | 上传任务回放 |
|
||||
|
||||
### 5.9 MVP 功能清单
|
||||
|
||||
P0 版本只追求一个客房跑通:
|
||||
|
||||
| 优先级 | 功能 | 验收标准 |
|
||||
|--------|------|----------|
|
||||
| P0 | 加载一个 RoomPlan/ZED 转换后的客房 | 10 秒内打开,尺度正确 |
|
||||
| P0 | Scene Tree + 物体点击选择 | 点击椅子能显示 `chair_305_01` |
|
||||
| P0 | 语义/实例/物理三种视图 | 一键切换,颜色稳定 |
|
||||
| P0 | 家具位姿修正 | 拖动椅子后能保存 patch |
|
||||
| P0 | Collider 可视化与编辑 | 可给椅子生成 box/convex collider |
|
||||
| P0 | 门/抽屉关节编辑 | 可设置轴向和运动范围 |
|
||||
| P0 | 简单物理运行/暂停/reset | 推椅子不穿墙,reset 后回初始状态 |
|
||||
| P0 | episode 回放 | 加载一条机器人轨迹并显示路径 |
|
||||
| P0 | patch 导出 | 输出可被 PRISM 消化的 JSON |
|
||||
|
||||
P1 再做增强:
|
||||
|
||||
- 多房间/走廊拼接;
|
||||
- Web 只读展示;
|
||||
- 合成 RGB-D/Segmentation 数据批量导出;
|
||||
- 自然语言查询:“显示所有可移动椅子”;
|
||||
- 和 ROS 2/Nav2 做在线联调。
|
||||
|
||||
---
|
||||
|
||||
## 6. 典型应用场景
|
||||
|
||||
### 场景 A:酒店机器人导航调试
|
||||
|
||||
1. PRISM 导出酒店走廊拓扑和局部几何。
|
||||
2. 游戏引擎加载场景,放置机器人 avatar 和动态行人。
|
||||
3. 通过 ROS 2 bridge 接入 Nav2 或自研控制器。
|
||||
4. 在引擎里批量生成拥堵、清洁车占道、门半开等扰动。
|
||||
5. 输出成功率、碰撞次数、路径偏差和重规划次数。
|
||||
|
||||
### 场景 B:客房物体操作验证
|
||||
|
||||
1. RoomPlan/ZED 重建客房,PRISM 生成语义场景图。
|
||||
2. 游戏引擎把床头柜、椅子、抽屉、门转成可交互 actor。
|
||||
3. 研究员人工修正关节轴、摩擦、质量和可抓取区域。
|
||||
4. 世界模型在引擎中做 rollout,预测推、拉、拿、放的结果。
|
||||
5. 高风险动作再交给 Isaac Sim 或真实机器人验证。
|
||||
|
||||
### 场景 C:CrowdRoom Web 编辑器
|
||||
|
||||
1. 用户上传 RoomPlan 房间。
|
||||
2. 后端转成 glTF/meshopt/Draco 轻量包。
|
||||
3. Web 端以 Unity WebGL、Unreal Pixel Streaming 或 Three.js/R3F 展示。
|
||||
4. 用户替换家具、材质、灯光,生成 Remix。
|
||||
5. Remix 的变更以 overlay 形式保存,不复制底层几何。
|
||||
|
||||
---
|
||||
|
||||
## 7. 技术实现建议
|
||||
|
||||
### 7.1 Unreal 路线
|
||||
|
||||
适合做“酒店数字孪生高保真演示 + 复杂交互调试器”。
|
||||
|
||||
```yaml
|
||||
引擎:
|
||||
- Unreal Engine 5.x
|
||||
核心模块:
|
||||
- USD Stage / Datasmith / glTF Importer
|
||||
- Chaos Physics
|
||||
- Control Rig / Sequencer
|
||||
- Pixel Streaming
|
||||
- Python Editor Script
|
||||
输入:
|
||||
- USD: 主资产格式
|
||||
- glTF/FBX: 轻量备选
|
||||
- JSON: PRISM 场景图和语义属性
|
||||
输出:
|
||||
- episode log
|
||||
- RGB-D/Segmentation 合成数据
|
||||
- PRISM patch
|
||||
```
|
||||
|
||||
适合优先验证:
|
||||
|
||||
- 高保真酒店大堂/走廊渲染;
|
||||
- 门、抽屉、椅子、行李车等刚体交互;
|
||||
- 研究演示和远程评审;
|
||||
- 复杂光照、反射、材质对感知模型的影响。
|
||||
|
||||
### 7.2 Unity 路线
|
||||
|
||||
适合做“MVP 工具 + CrowdRoom 产品化编辑器 + 快速 ROS 原型”。
|
||||
|
||||
```yaml
|
||||
引擎:
|
||||
- Unity LTS
|
||||
核心模块:
|
||||
- URP/HDRP
|
||||
- Addressables
|
||||
- ArticulationBody
|
||||
- ROS TCP Connector
|
||||
- WebGL / iOS / Desktop Build
|
||||
输入:
|
||||
- glTF/FBX/USD 转换资产
|
||||
- PRISM JSON scene graph
|
||||
输出:
|
||||
- 用户编辑 overlay
|
||||
- 标注 patch
|
||||
- 简化 episode log
|
||||
```
|
||||
|
||||
适合优先验证:
|
||||
|
||||
- RoomPlan 房间浏览器;
|
||||
- 家具/材质替换;
|
||||
- 简单移动机器人导航;
|
||||
- 低门槛标注工具。
|
||||
|
||||
### 7.3 Isaac Sim 路线
|
||||
|
||||
适合做“机器人高可信仿真后端”,与游戏引擎形成互补。
|
||||
|
||||
```yaml
|
||||
核心定位:
|
||||
- 机器人传感器仿真
|
||||
- URDF/USD 机器人资产
|
||||
- 合成数据生成
|
||||
- Isaac Lab / RL 训练
|
||||
- ROS 2 联调
|
||||
输入:
|
||||
- USD 场景
|
||||
- URDF / CAD 机器人
|
||||
- PRISM 语义图
|
||||
输出:
|
||||
- 机器人任务评测
|
||||
- 合成传感器数据
|
||||
- sim-to-real 实验记录
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 数据格式扩展
|
||||
|
||||
建议在 PRISM `SpatialNode` 上增加一个可选的 `engine_proxy` 字段:
|
||||
|
||||
```json
|
||||
{
|
||||
"spatial_node_id": "chair_305_01",
|
||||
"category": "chair",
|
||||
"pose_world": [0, 0, 0, 1, 0, 0, 0],
|
||||
"bbox": [0.55, 0.58, 0.92],
|
||||
"material": {
|
||||
"base": "fabric",
|
||||
"roughness": 0.75
|
||||
},
|
||||
"affordance": {
|
||||
"movable": true,
|
||||
"sittable": true,
|
||||
"pushable": true
|
||||
},
|
||||
"engine_proxy": {
|
||||
"asset_uri": "assets/hotel_305/chair_305_01.usd",
|
||||
"render_mesh": "chair_305_01_high",
|
||||
"collision_mesh": "chair_305_01_convex",
|
||||
"rigid_body": {
|
||||
"mass_kg": 6.2,
|
||||
"friction": 0.6,
|
||||
"restitution": 0.05
|
||||
},
|
||||
"lod": ["high", "mid", "low"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. MVP 计划:4 周验证闭环
|
||||
|
||||
| 周期 | 目标 | 交付物 | 验收标准 |
|
||||
|------|------|--------|----------|
|
||||
| W1 | 资产链路打通 | RoomPlan/ZED 场景 → glTF/USD → Unity 或 Unreal | 尺度误差 < 2%,坐标轴正确 |
|
||||
| W2 | PRISM 语义绑定 | 场景图 JSON 驱动物体高亮、查询、筛选 | 输入“床头柜”可定位对应 actor |
|
||||
| W3 | 物理代理 | 为门、椅子、抽屉生成 collider/rigid body/joint | 推拉动作无明显穿模 |
|
||||
| W4 | 任务回放 | 机器人轨迹回放 + episode log + PRISM patch | 可复现一次失败案例并回写 delta |
|
||||
|
||||
MVP 只做一个客房或一段走廊,不追求完整酒店。优先证明“真实扫描资产能进入游戏引擎,并与 PRISM 双向通信”。
|
||||
|
||||
---
|
||||
|
||||
## 10. 风险与对策
|
||||
|
||||
| 风险 | 表现 | 对策 |
|
||||
|------|------|------|
|
||||
| 扫描 mesh 不适合物理 | 面数过高、破洞、碰撞异常 | 渲染 mesh 与 collider 分离;自动 convex decomposition;人工修正工具 |
|
||||
| 坐标系统混乱 | RoomPlan、ROS、Unreal、Unity 轴向不一致 | 定义 `world_frame.md`,所有转换写单元测试 |
|
||||
| 游戏物理不够真实 | 摩擦、接触、关节误差导致 sim-to-real 差 | 游戏引擎只做快速筛选;关键实验进入 Isaac Sim 或真实机器人 |
|
||||
| 资产管线过重 | USD/glTF/FBX 来回转换丢属性 | USD 作为主格式,glTF 只做 Web 分发 |
|
||||
| 双引擎维护成本高 | Unreal、Unity、Isaac Sim 三套工程发散 | MVP 先选一个主前台;共享资产转换脚本和 PRISM schema |
|
||||
|
||||
---
|
||||
|
||||
## 11. 推荐决策
|
||||
|
||||
短期采用:
|
||||
|
||||
1. **Unity 优先做 MVP**:快速做出 RoomPlan 房间浏览、语义高亮、家具替换、简单物理交互。
|
||||
2. **Unreal 做高保真展示分支**:用于酒店场景演示、复杂光照材质、远程评审。
|
||||
3. **Isaac Sim 保持机器人仿真后端**:用于 ROS 2、传感器、RL 和严肃物理评测。
|
||||
|
||||
中期目标是形成一条统一管线:
|
||||
|
||||
```text
|
||||
真实扫描 → PRISM 空间记忆 → USD/glTF 资产包 → 游戏引擎交互验证 → episode/patch 回写 → 世界模型训练
|
||||
```
|
||||
|
||||
这样 WorldModel 项目会多出一个非常实用的“中间地带”:既不像纯研究代码那样难演示,也不像纯游戏场景那样脱离真实数据,而是把真实室内世界变成可运行、可编辑、可评测的 3D 交互实验场。
|
||||
|
||||
---
|
||||
|
||||
## 参考资料
|
||||
|
||||
- NVIDIA Isaac Sim 官方介绍:说明 Isaac Sim 基于 Omniverse/OpenUSD,面向机器人仿真、测试、合成数据,并可导入 CAD、URDF 和真实捕获数据。<https://developer.nvidia.com/isaac/sim>
|
||||
- Unreal Engine Physics 官方文档:Chaos Physics 覆盖刚体、约束、破坏、车辆、流体、网络物理等实时物理能力。<https://dev.epicgames.com/documentation/en-us/unreal-engine/physics-in-unreal-engine>
|
||||
- Unreal Engine USD Stage 官方文档:Unreal 支持通过 USD Stage Actor 打开和编辑 USD 场景。<https://dev.epicgames.com/documentation/en-us/unreal-engine/usd-stage-editor-quick-start-in-unreal-engine>
|
||||
- Unity ROS TCP Connector 官方仓库:提供 Unity 与 ROS 收发消息、消息生成、ROSGeometry 等能力。<https://github.com/Unity-Technologies/ROS-TCP-Connector>
|
||||
@@ -0,0 +1,289 @@
|
||||
---
|
||||
title: "WorldModel 物理引擎集成方案"
|
||||
date: 2026-05-28
|
||||
draft: false
|
||||
tags: [worldmodel, physics-engine, PRISM, 技术方案]
|
||||
categories: [plans]
|
||||
description: "为WorldModel室内场景添加物理引擎的完整技术方案,包括引擎选型、3D重建网格碰撞准备、PRISM空间记忆融合与实施路线图。"
|
||||
---
|
||||
|
||||
# WorldModel 物理引擎集成方案 (v1.0)
|
||||
|
||||
## 1. 背景与动机
|
||||
|
||||
WorldModel的核心数据流(RoomPlan/ZED2i -> PRISM空间记忆)已覆盖"看见并记住"室内环境。要完成闭环,还需要让机器人在数字环境中能够与物体进行**物理交互验证**。这要求:
|
||||
|
||||
1. **碰撞检测**: 机器人在虚拟酒店房间中运动时,不会穿墙、撞翻物体
|
||||
2. **对象操作模拟**: 开门、推拉椅子等动作可以在仿真环境中验证可行性
|
||||
3. **物理属性学习**: 机器人通过交互获取"这个物体推得动还是推不动"的经验,反哺L4语义记忆
|
||||
4. **合成数据生成**: 为视觉模型/行为克隆策略提供带物理标签的训练样本
|
||||
|
||||
## 2. 引擎选型对比
|
||||
|
||||
| | Bullet / PyBullet | NVIDIA PhysX (Isaac Sim) | Unity Physics (Jolt) | Unreal Engine 5 Chaos | MuJoCo |
|
||||
|---|---|---|---|---|---|
|
||||
| **许可证** | MIT 开源 | Apache-2.0 (PhysX) / NVIDIA专有(EZG) | MIT/Jolt-2.0 | Apache-2.0 (Chaos SDK部分可用) | 开源研究用 |
|
||||
| **GPU加速** | CUDA/OpenCL插件可选 (cuBullet) | 原生硬件级(PhysX GPU) | CPU为主,GPU开发中 | GPU RayTracing/Physics | 纯CPU物理步 |
|
||||
| **ROS集成** | pybullet-ros, ros_control封装成熟 | Isaac ROS生态(需NVIDIA硬件) | 间接(ROS2 Bridge) | ROS2 Bridge存在但较新 | 需自定义wrapper |
|
||||
| **机器人动力学** | KUKA/PR2模型现成,RBD引擎支持全身控制 | Robot Assets库丰富(nvidia-isaac-sim/robots) | 需手动配置 | Skeletal + Rigid body | MPC/整体制动强但仅运动学、无对象操作 |
|
||||
| **网格碰撞精度** | ConcaveMesh(BVH)+Convex Decomposition工具链完整 | USDZ原生支持,ConvNv扩展做convex decomposition | OBJ->FBX需转换、材质丢失风险高 | 支持OBJ/FBX/GLTF但PBR物理参数需手动调 | 仅支持convex primitives(Box/Sphere/Capsule) |
|
||||
| **室内重建网格兼容性** | OBJ/STL直接加载,pymeshlab+pybullet-convex-decomp处理 | 最佳(USDZ是NVIDIA生态标准) | OBJ->FBX需转换,材质丢失风险高 | 支持OBJ/FBX/GLTF但PBR物理参数需手动调 | OBJ->convex approximation(自动)|
|
||||
| **团队熟悉度** | Python为主(Robotics生态已有) | 需学习Isaac Sim专用框架+CUDA工具链 | Unity C#简单但物理系统相对新 | UE5蓝图+CPP双栈,生态庞大 | 研究友好、功能受限(纯刚体)|
|
||||
| **性能(帧率)** | 中等精度~10-30fps@中大型房间 | GPU并行,百万级物体(最快) | ~30fps @中型场景 | 高(GPU加速但需UE5渲染管线) | 最快可达10kHz+物理步,但仅刚体无网格碰撞 |
|
||||
|
||||
### **推荐方案:主从双引擎架构**
|
||||
|
||||
**主引擎: PyBullet + Bullet Physics Server(实时感知与操作层)**
|
||||
理由:
|
||||
- PRISM tools已有Python环境,PyBullet提供纯Python API无缝衔接ROS生态
|
||||
- Mesh碰撞处理工具链最完整(pybullet_convex_decomp, pymeshlab脚本可复用)
|
||||
- 轻量独立,不依赖NVIDIA GPU
|
||||
|
||||
**辅助引擎: NVIDIA Isaac Sim(高保真合成数据层)**
|
||||
理由:
|
||||
- 需要生成带精确物理标签的训练集时(如物体形变、流体交互),Isaac Sim是业界标杆
|
||||
- 与RoomPlan的USDZ格式天然兼容(NVIDIA生态)
|
||||
|
||||
**备选快速验证: MuJoCo + MJCF (原型阶段)**
|
||||
理由:确定PRISM-L4语义层需要哪些物理属性时,MuJoCo可以快速搭建"物体->可操作参数"的原型验证环境
|
||||
|
||||
## 3. PRISM x 物理引擎融合架构
|
||||
|
||||
### 数据层映射:PRISM四层如何承载"物体物理状态"
|
||||
|
||||
| PRISM层级 | 传统内容 | **新增物理字段**
|
||||
---
|
||||
| L1感知缓冲(~30Hz) | ZED2i当前帧点云/图像流 | 实时碰撞体包围盒(BVH)生成、接触力反馈(触觉传感器输入)|
|
||||
| L2度量地图 | 3D体素网格+语义标签 | Mesh碰撞几何(每类家具->Bullet ConvexHull)、静摩擦系数mu_s、动摩擦系数mu_k、质量m |
|
||||
| L3拓扑图 | Graph(Room->Corridor->Room),边权=距离/通行概率 | 边权重加入**物理约束**: "这个门需要开门空间>=0.8m"、通道净宽 |
|
||||
| L4语义场 | Object属性查询("这把椅子是木质的")+LLM可问答性 | 物理交互标签: `"movable": true, "push_force_estimate_N":[15.0, 45.0], "friction":"medium"`;LLM可推理"这个物体重吗?推得动吗?"|
|
||||
|
||||
### 核心模块:Physics-PRISM Bridge (PPB)
|
||||
|
||||
```
|
||||
+-------------+ 碰撞几何 +-----------+
|
||||
RoomPlan/ZED2i --> | Mesh Processor| --------------> |Bullet Server| <-- robot_control_loop
|
||||
(3D重建) +-------------+ ^(pybullet) |
|
||||
^ +-----------+ V|
|
||||
|| 物理属性注入 (10Hz状态更新) |Collision/Force Feedback|
|
||||
|| vPRISM L1写入 +---> PRISM L1
|
||||
PPB |<----------------------------------------------(碰撞事件写入L1缓冲) 物理状态推送|
|
||||
Manager--|---> PRISM L2-L4更新: "椅子被撞了0.3m"
|
||||
(ROS Node)|<---- "这扇门现在半开(角度120度)"
|
||||
+--------+
|
||||
|
|
||||
ROS Topic: /prism/physics_state
|
||||
```
|
||||
|
||||
**PPB 关键职责:**1. **从PRISM L4语义场拉取物体属性** ->为每个对象在Bullet中创建刚体
|
||||
2. **将碰撞检测结果写回PRISM L1/L2** ->实时物理事件进入空间记忆3. **维护"已知交互历史"** ->L4中积累物体操作经验(LLM可查询)
|
||||
|
||||
### 新增PRISM管线:Pipeline E -- "物理巩固"在现有四个管线的第四个(记忆巩固 Pipeline D)之后,追加:
|
||||
|
||||
**Pipeline E: 物理知识巩固 (Physics Consolidation)**
|
||||
- **触发**:每次有意义的物体交互(推门成功/失败、拿取物品)
|
||||
- **数据源**: Bullet仿真 ->实际传感器验证对比差异(仿真到现实 gap度量)
|
||||
- **写入目标**:L4语义场,更新物体的交互标签(摩擦力、重量估计修正)
|
||||
- **频率**:非实时事件驱动,~1Hz或交互后批量写入
|
||||
|
||||
## 4. Mesh -> Physics几何转换管线
|
||||
|
||||
### 流程:3D重建网格 --> Bullet碰撞体RoomPlan USDZ/OBJ ---> OpenUSD/Pymeshlab处理->Convex Decomposition(BVPY/ICME) -> Bullet ConcaveMesh / ConvexHulls (静态几何: 每帧更新+动态刚体:可交互对象)
|
||||
|
||||
### 4.1 RoomPlan USDZ -> OBJ/Ply转换
|
||||
- Apple RoomPlan输出USDZ格式,NVIDIA Omniverse USD Python API可直接解析(pxr.Sdf, usdGeom.Mesh)
|
||||
- 对于非NVIDIA路径:使用opensubdiv + trimesh做 USDZ ->OBJ/Ply导出
|
||||
|
||||
### 4.2 Mesh简化与碰撞体生成- **静态物体**(墙壁、地板): Bullet ConcaveMesh (BVH树) -- 不需要convex decomposition
|
||||
- **可交互物体**(椅子、门把手): Convex Decomposition ->分解为~5-20个convex hulls
|
||||
- **推荐工具**:pybullet_convex_decomp(Bullet官方Python wrapper,支持GPU加速)
|
||||
- **替代**:V-HACD (Virtual Hi-Arcade Convex Decomposition,精度最优但较慢)
|
||||
- **快速方案**:pymeshlab的convex_decomposition filter
|
||||
|
||||
### 4.3 Mesh质量要求- **精度**:静态墙壁/地板<2mm偏差(L1感知缓冲中ZED2i提供)- **性能**:每个可交互对象<10个convex hulls(Bullet BVH查询在~1ms内)
|
||||
- **更新频率**:房间结构(墙壁)只在离线建图时构建一次;家具在"差异检测管线"(PRISM Pipeline C)触发时才重建
|
||||
|
||||
## 5. PRISM L4语义场扩展字段草案 (JSON Schema)在现有L4的"物体属性查询结构"中新增物理交互标签:
|
||||
|
||||
```json
|
||||
{ "object_id": "chair_room_102_A", // L4语义场中的唯一标识
|
||||
"category": ["furniture","seat"], // RoomPlan类别(现有) "physics":{ // NEW: 物理交互标签
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"object_id": "chair_room_102_A", // L4语义场中的唯一标识
|
||||
"category": ["furniture","seat"], // RoomPlan类别(现有)
|
||||
|
||||
"// --- NEW: Physical Interaction Tags --":"",
|
||||
|
||||
"physics":{"mass_estimate_kg":6.2, // kg可由PPB的convex hull+材料估计
|
||||
"friction":{"static":0.45, // mu_s: 静摩擦系数
|
||||
"dynamic":0.32 //mu_k:动摩擦系数 },
|
||||
```
|
||||
"mass_estimate_kg":6.2, // kg可由PPB的convex hull+材料估计
|
||||
"friction":{"static":0.45, // mu_s: 静摩擦系数
|
||||
"dynamic":0.32 }},"movable":true, // 是否可移动(门、椅子为true,墙/地板为false)
|
||||
"movable_method":["push",,"pull"], // 支持的操作类型(推/拉/提)
|
||||
"push_force_range":[15.0, 45.0], // N:推启动力和可接受上限力
|
||||
"stability":{"is_stable_unassisted":true, // 不推就自己不会倒
|
||||
"toppling_force_Nm":12.5 // N·cm:翻倒阈值
|
||||
},
|
||||
|
||||
"interaction_history":[ // LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22",
|
||||
"action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标)
|
||||
"object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||
"force_applied_N":25.3, //实际施加力
|
||||
"success",true // push成功false=卡住了/推不动 }
|
||||
] "sim2real_gap_stats":{ //PPB仿真与现实对比的统计
|
||||
"position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少)
|
||||
"last_updated":"2026-05-31" //最后一次校准时间 }
|
||||
|
||||
"// --- NEW: Interaction History (Pipeline E写入) --":"",
|
||||
|
||||
"interaction_history":[ // LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22", "action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标)
|
||||
"object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||
"force_applied_N":25.3, //实际施加力 "success",true // push成功 / false=卡住了/推不动 }
|
||||
]
|
||||
|
||||
"// --- NEW: Simulation-Reality Gap (Pipeline E) --":"",
|
||||
|
||||
"sim2real_gap_stats":{ //PPB仿真与现实对比的统计 "position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少) "last_updated":"2026-05-31" //最后一次校准时间 }
|
||||
|
||||
"// --- NEW: Interaction History (Pipeline E写入) --":"",
|
||||
|
||||
"interaction_history":[ //LLM可查询的交互经验 { "timestamp":"2026-05-30T14:22", "action":"push", // 操作类型 "object_from_location_xyz":[1.2,-0.5,0.78], // 移动前位置(L2度量坐标) "object_to_location_xyz":[1.8,-0.5,0.78], // 移动后位置
|
||||
"force_applied_N":25.3, //实际施加力 "success",true // push成功 / false=卡住了/推不动 }
|
||||
] "sim2real_gap_stats":{ //PPB仿真与现实对比的统计 "position_drift_m":0.023, //平均位置偏差(仿真-->现实) "friction_bias":-0.12, //摩擦系数偏差(仿真比现实高/低多少)
|
||||
"last_updated":"2026-05-31" //最后一次校准时间
|
||||
}
|
||||
|
||||
},}
|
||||
```## 6. PRISM Pipeline E: "物理巩固"详细设计### 触发条件TRIGGERS= [
|
||||
"碰撞事件": collision.force_magnitude > threshold_N, #有意义的接触(如门撞到墙壁)
|
||||
"物体位移": abs(translation_delta_m)> threshold, #可移动对象被显著推动
|
||||
"交互完成": action.success == true/false, #如开门/关门完成
|
||||
"时间周期": every_30_minutes //定期同步仿真状态与现实(校准)
|
||||
]
|
||||
|
||||
### Pipeline E执行流程:1. **读取**:从 PRISM L4语义场 ->获取该物体的当前物理属性
|
||||
2. **对比**:simulation_position(PyBullet中) vs actual_sensor_position (ZED2i/IMU实际测量位置)
|
||||
3. **校准**:如果 drift > tolerance -->更新L4物理属性(摩擦力、质量估计)
|
||||
4. **日志**:interaction_history追加记录 ->L4语义场永久存储5. **通知**:向L3拓扑发送"通道通行性变更"(如果物体移动导致了新障碍)
|
||||
|
||||
```python
|
||||
class PhysicsConsolidationPipeline: """PRISM Pipeline E:物理知识巩固 触发条件= collision detected / interaction complete/periodic sync """ def trigger(self, event: Union[CollisionEvent] | InteractionComplete]) -> None:
|
||||
self.log(event)
|
||||
prism_l4_object = prisms_semantic_layer.query_by_name(event.object_id))
|
||||
# Step 1: Read L4物理属性(仿真状态) sim_mass = prism_l4_object.physics.mass_estimate_kg friction_estimated=self.estimate_friction_from_force_sensor(event.contact_force)
|
||||
|
||||
# Step 2: Read ZED2i/IMU真实测量(现实状态) actual_position=self.zed_2i_camera.get_object_pose(event.object_id))
|
||||
|
||||
# Step 3: Compute gap(仿真 -->现实) sim_position=self.get_simulated_object_pose(event.object_id))
|
||||
|
||||
# Step 4: Update L4语义场
|
||||
if sim2real_gap> tolerance: self.update_prism_l4_physics(event.object_id,friction_estimated)
|
||||
```
|
||||
|
||||
## 7. PPB ROS消息定义草案 (prism_msgs/PrismPhysicsState.msg)
|
||||
|
||||
```
|
||||
# 每帧发布: /prism/l1/collision_events (30Hz)std_msgs/Header header
|
||||
# 当前帧碰撞事件列表(可为空CollisionEvent[] collisions
|
||||
|
||||
message CollisionEvent {
|
||||
string object_a # PRISM L4语义名称,如 "chair_01"
|
||||
string object_b # PRISM L4语义名称,如 "wall_kitchen_east"
|
||||
geometry_msgs/Vector3 contact_point # WGS坐标系中的碰撞点(L2度量)
|
||||
geometry_msgs/Vector3 contact_normal #法线方向 float64 penetration_depth #穿透深度(mm), <0表示分离距离
|
||||
geometry_msgs/Wrench contact_force #L1力觉反馈:力和扭矩}
|
||||
|
||||
#每50ms发布: /prism/l2/physics_mesh_state (20Hz)
|
||||
std_msgs/Header header#所有动态刚体的当前位姿(用于L2度量地图中的物体定位)DynamicBodyState[] dynamic_bodies
|
||||
|
||||
message DynamicBodyState {
|
||||
string body_name # PRISM L4语义名称,如 "door_hallway_02" geometry_msgs/Pose pose #6DoF位姿(位置+四元数)
|
||||
float32 mass #kg, L4语义场中的物理属性查询结果}
|
||||
|
||||
#按需请求: /prism/l2/get_physics_properties (ROS Service)
|
||||
---string object_name # 请求: L4语义名称(如 "chair_01")
|
||||
---#响应:该物体的物理属性 (L4语义场中的值)string description #"可推动,木质框架"float32 friction_mu_static #静摩擦系数 mu_s \in [0.1, 1.5]float32 friction_mu_dynamic #动摩擦系数mu_k \in [0.1, 1.2]
|
||||
float32 mass #kg:"中等重量,约5kg" \to 6.0bool is_movable #true/false: "椅子可以被搬走" \to truefloat32 push_force_min #启动推力估计(N)
|
||||
```
|
||||
|
||||
## 8. Phase实现路线图(四阶段)### Phase 0:原型验证 (2周) **目标: "PyBullet能跑起一间酒店客房吗?**步骤1产** 产出物0.2读取一个RoomPlan样例(USDZ或OBJ),用trimesh导出为PLYphysics/demo/load_room.py) + screenshot
|
||||
|
||||
```
|
||||
"0.3在PyBullet中加载房间几何为静态刚体,机器人URDF模型进入
|
||||
"0.4加入一个动态物体(椅子),实现简单的推拽交互|Bullet仿真截图 + 操作日志
|
||||
"0.5写一份README记录踩坑和经验教训|/plans/physics_engine_implementation.md#phase0的完成checklist和known issues
|
||||
```
|
||||
|
||||
**交付**: 一个可以在终端跑的Python脚本,加载房间网格+URDF机器人,可视化窗口中可操作
|
||||
|
||||
### Phase 1: Mesh处理管线 (3周) **目标:** "从任意RoomPlan/ZED2i场景自动构建碰撞几何"
|
||||
|
||||
| 步骤 | 内容
|
||||
---### Phase1.2 Mesh简化工具(减少三角面到collision-ready级别)| 使用pyfqmr或gptoolbox做mesh simplification
|
||||
### Phase1.3 Convex Decomposition pipeline: V-HACD + pybullet_convex_decomp| 配置JSON支持自定义convex hull上限参数(每个对象max_hulls=10)
|
||||
### Phase 1.4自动标注"静态 vs 动态"对象(基于RoomPlan语义层)| RoomPlan输出包含category: wall/furniture/door/cabinet标签,自动分类
|
||||
### Phase 1.5集成测试: PRISM Pipeline A的输出(离线3D重建) -> PPB自动创建Bullet世界|端到端Pipeline测试脚本`physics/test_e2e_pipeline.py`+报告
|
||||
|
||||
### Phase 2: PRISM Bridge (4周) **目标:** "物理引擎数据进入PRISM四层记忆,形成闭环"
|
||||
|
||||
| 步骤 | PRISM对接点
|
||||
---### Phase2.1 PPB ROS Node: /prism/physics_state | 定义ROS消息类型`PrismPhysicsState.msg`(包含所有碰撞体位姿)
|
||||
### Phase 2.2 L1写入:将Bullet接触/碰撞事件推送至L1感知缓冲| topic `/prism/l1/collision_events`,格式: `{frame_id, object_a,object_b, contact_force}`
|
||||
### Phase2.3 L4读写:将PPB从PRISM拉取的物体属性+写回的交互经验| ROS service `GetPhysicsProperties` / `UpdateInteractionHistory`,使用prism_ros_bridge的现有topic
|
||||
### Phase2.4差异检测集成: PRISM Pipeline C触发时,对比当前物理状态与L2度量地图中存储的"理想几何"| 输出差异报告: `physics_consolidation_report.json`(哪些物体位置变了、被移动了)
|
||||
### Phase2.5 L3拓扑图更新:物理约束影响通行性评估(半开门导致通道变窄)|L3 edge weight更新: `passability_score=base_passability x(1 - collision_risk_penalty)`### Phase3.2合成数据标注管线:从PyBullet世界随机采样物体位置/光照 -->渲染图像+ground truth标签| `physics/synthesis/generate_episode.py`,输出: RGB图像, depth图, semantic segmentation mask, object bounding boxes
|
||||
### Phase3.3数据格式: ONNX-compatible dataset(与HuggingFace Hub集成)| HFDataset定义 + upload脚本 `physics/synthesis/upload_to_hf.py`
|
||||
### Phase3.4机器人策略验证: PyBullet + ROS Control中的RL agent在仿真中学习"开门/推椅"|集成stable-baselines3(RLlib) + pybullet-ros,训练简单的push/grasp policy
|
||||
### Phase 3.5合成数据质量验证:与真实场景对比分布差异(MMD / Fréchet Inception Distance) | `physics/synthesis/evaluate_fidelity.py`
|
||||
|
||||
## 9. 技术栈清单(新增依赖)### Python核心
|
||||
```textpybullet>=3.2.x #Bullet Physics引擎Python绑定(主物理后端)pymeshlab==2023.12 #网格简化、convex hull计算
|
||||
opensubdiv>=3.6 #OpenUSD/USDZ解析(非NVIDIA路径)pyfqmr #快速网格简化到collision-ready级别
|
||||
trimesh>=4.0 #Mesh格式转换(USDZ/OBJ/PLY/FBX)
|
||||
pybullet_convex_decomp #GPU加速凸分解(需要CUDA 12+)```### ROS生态
|
||||
`textros-noetic-robot-base #URDF/RViz支持(ROS1 Noetic)
|
||||
ros-humble-robot-base # ROS2 Humble对应包(备选/未来路径)
|
||||
pybullet_ros # PyBullet与ROS通信bridge(如可用则集成,否则自建)
|
||||
```### 辅助工具`textopensimplex #合成数据中的随机扰动生成(放置物体位置)huggingface_hub #合成数据集发布到HFDataset Hub```### GPU依赖(可选,Phase 1-2之后评估是否需要)
|
||||
`text# NVIDIA CUDA 12.4+ + cuBLAS/cuSPARSE(用于cuBullet或pybullet_convex_decomp的GPU加速)
|
||||
# Jetson Orin / RTX 4090(桌面测试环境)```
|
||||
|
||||
## 10. PRISM L4语义场LLM查询示例(集成后能力)
|
||||
|
||||
```
|
||||
# 用户/策略模块可以向PRISM L4语义场发起LLM查询:> "房间102中,哪些椅子可以被搬动?"
|
||||
>→从L4语义场返回: "chair_A(可推,mus=0.45), chair_B (固定在地) -->只有一把可以移动"
|
||||
|
||||
> " hallway走廊的通行性怎么样?">PRISM从L3拓扑+ L1最近碰撞事件回答: "当前通行概率72% -- 一把椅子被推到了走廊中央(见L1事件#34),移除后可以恢复95%"
|
||||
|
||||
> "如果我把桌子向右推2米,会撞到门吗?">PRISM调用PyBullet执行虚拟操作: "模拟结果显示不会碰撞。桌子最右边缘与门框距离0.4m(安全)"
|
||||
|
||||
> "这个房间里有哪些物体是半开着的,可能阻碍通行?">L1/L2碰撞检测返回: "门_厨房东(角度=45度), 窗柜抽屉拉出10cm"
|
||||
```
|
||||
|
||||
## Appendix A. PyBullet + PRISM 集成架构代码框架### `physics/engine/bullet_server.py` -- Bullet Server(ROS Node)
|
||||
|
||||
```python
|
||||
import pybullet as pclass PhysicsServer: """PyBullet服务端,作为独立的ROS Node运行"""
|
||||
|
||||
def __init__(self): p.connect(p.GUI) # GUI可选;headless用p.connect(p.DIRECT)
|
||||
p.setGravity(0, 0, -9.81)
|
||||
|
||||
def load_room_mesh(self, room_usdz_path: str): """从RoomPlan/ZED2i的3D重建文件加载房间"""
|
||||
```python
|
||||
|
||||
def load_room_mesh(self, room_usdz_path: str): """从RoomPlan/ZED2i的3D重建文件加载房间"""
|
||||
def load_robot_urdf(self, robot_usdz_path: str): #修正:URDF文件 """加载移动机器人基座(带轮子/机械臂)"""
|
||||
|
||||
def set_object_interactivity(self, object_name: str,movable_bool) -> None): """控制PPB将PyBullet刚体标记为dynamic/static""" def get_collision_events(self) -> List[CollisionEvent]: """读取当前帧所有碰撞检测结果""" def sync_state_to_prism(self, prism_topic: str) -> None """将当前物理状态写入PRISM L1/L2 topic""" ```
|
||||
|
||||
### PRIMS --> PyBullet状态注入当PRISM Pipeline C(在线感知)检测到场景变化时,更新PyBullet中的碰撞体位姿:
|
||||
|
||||
```python
|
||||
def on_prism_perception_update(self, updated_objects: List[PrismL4Object]):
|
||||
"""PRISM感知更新 -->驱动PyBullet刚体状态修改"""
|
||||
```
|
||||
Reference in New Issue
Block a user