SceneSmith 各类场景说明
本文档回答:SceneSmith 适合生成哪类场景,机器人能操作什么物体,以及哪些操作不支持。
1. 桌面场景(Tabletop Manipulation)
最适合 SceneSmith 的场景类型。
能生成什么
通过 manipuland_agent 可以在桌面上放置:
| 类别 | 具体物体 |
|---|---|
| 食物/水果 | 苹果、橙子、香蕉、面包 |
| 餐具 | 盘子、碗、杯子、刀叉 |
| 文具 | 书本、笔记本、钢笔、尺子 |
| 电子产品 | 手机、遥控器、鼠标 |
| 装饰品 | 花瓶、小雕像、相框 |
| 组合体 | 装了水果的碗、叠放的书 |
怎么生成桌面场景
scene_prompt: "A kitchen counter with a wooden cutting board,
a ceramic bowl filled with apples and oranges, a glass of water,
a butter knife, and a small herb plant pot."
关键配置:manipuland_agent 会自动分析每件家具的支撑面,在支撑面上生成小物件。
抓取可行性
每个 manipuland 的 SDF 包含:
- 精确的碰撞几何体(VHACD 近似凸分解)
- 质量 + 摩擦系数
- 完整的 bounding box
可以用 policy_interface.py 获取抓取目标位姿:
python scripts/robot_eval/policy_interface.py \
--task "Pick the apple from the bowl and place it on the plate" \
--scene-state outputs/.../house_state.json \
--dmd outputs/.../house.dmd.yaml
2. 柔性物体(Deformable Objects)
SceneSmith 不支持。
原因
SceneSmith 的整个 pipeline 基于刚体假设:
- Drake 仿真:刚体多体动力学
- SDF 格式:刚体碰撞几何
- VHACD 分解:只适用于刚体
柔性物体(布料、毛绒玩具、橡皮泥)需要:
- FEM (Finite Element Method) 求解器
- 粒子系统
- 布料仿真(Position-Based Dynamics 等)
变通方案
- 用 SceneSmith 生成刚体背景场景(桌子、椅子、柜子)
- 用
scripts/export_scene_to_mujoco.py转换为 MuJoCo XML - 在 MuJoCo 中用
composite元素添加布料 - 或在 Isaac Sim 中用 FEM solver 添加柔性物体
3. 流体(Fluid / Liquid)
SceneSmith 不支持。
原因
同上,Drake 不包含流体仿真。house.dmd.yaml 只有刚体 Directives。
"倒水"这类任务需要:
- SPH (Smoothed Particle Hydrodynamics)
- FLIP Fluid
- FluidLab、Taichi Physics 等
变通方案
- 用 SceneSmith 生成杯子、瓶子的几何体(SDF包含容器形状)
- 将容器几何体导入 FluidLab / Taichi
- 在流体仿真器中加入液体粒子
注意:SceneSmith 生成的杯子是视觉上的外壳,不一定有精确的内部空腔几何体用于流体边界。
4. 常见场景类型
SceneSmith 论文中验证过的场景类型:
| 场景 | 典型任务 | 特点 |
|---|---|---|
| 卧室 | 整理床头柜、拿取衣物 | 床、衣柜等大件家具 + 小件 |
| 厨房 | pick-and-place 食物 | 橱柜、水果、厨具,最适合操作 |
| 客厅 | 整理茶几 | 沙发、书架、遥控器、书本 |
| 办公室 | 文具整理、拿取文件 | 桌面小物件最丰富 |
| 社区中心 | 多人活动场景 | 乒乓球桌、椅子等 |
最适合操作的场景
厨房 和 办公桌 是操作任务密度最高的:
- 物体种类多(水果、餐具、文具)
- 桌面支撑面大
- 物体尺寸适合抓取(0.05m ~ 0.3m)
提示词技巧
- 明确指定物体:"with a red apple, a ceramic plate, and a glass of water" 比 "with food" 更好
- 指定初始状态:"apple is on the counter, not on the plate" 避免场景自动把任务solve了
- 避免过于复杂:单个房间建议 5-10 个 manipuland,太多会让 agent 超时
5. Demo采集(Demonstration Collection)
当前能力(本次实现)
本次实现了基于 SceneSmith 输出的 脚本化 demo 采集:
SceneSmith 场景 → policy_interface → 目标位姿
↓
几何轨迹规划(home→approach→grasp→lift→transport→place)
↓
demo JSON + 轨迹可视化 PNG
产出:
demo_*.json:完整轨迹(每步 50ms,包含 EE 位姿 + 夹爪宽度)demo_*_trajectory.png:4子图可视化
真实 Demo 采集的正确方案
SceneSmith 官方没有提供 demo 采集代码。正确路径是:
1. python scripts/robot_eval/policy_interface.py → 获取目标位姿
2. 加载场景到仿真器:
drake_sim = load_scene(house.dmd.yaml) # 或 MuJoCo/Isaac
3. 加入 robot URDF(如 Franka Panda):
drake_sim.add_robot("franka_panda.urdf", base_pose)
4. 运行 controller:
- scripted: 几何规划(本次实现的方式)
- teleop: 人工示教
- policy rollout: 用已有 policy 采样
5. 记录每步 (obs, action) → dataset
6. python scripts/robot_eval/validate.py → 验证 success
Demo 数据格式(与主流兼容)
本次采集的 JSON 格式可以直接转换为:
- **RLDS (tensorflow_datasets)**:
(observation, action, reward, discount)格式 - LeRobot:
lerobot库的 episode 格式 - HDF5:标准 robot learning 数据格式
转换示例:
import json
import numpy as np
with open("demo_bedroom_nightstand_to_desk.json") as f:
demo = json.load(f)
# 转换为 numpy arrays
ee_traj = np.array([s["end_effector_pos"] for s in demo["trajectory"]])
gripper = np.array([s["gripper_width"] for s in demo["trajectory"]])
# shape: (150, 3) and (150,)