scenesmith / docs /scene_types_zh.md
yqi19's picture
Add bedroom scene, demos, Chinese documentation, and scene type guide (#1)
42f5508
|
Raw
History Blame Contribute Delete
5.65 kB

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 等)

变通方案

  1. 用 SceneSmith 生成刚体背景场景(桌子、椅子、柜子)
  2. scripts/export_scene_to_mujoco.py 转换为 MuJoCo XML
  3. 在 MuJoCo 中用 composite 元素添加布料
  4. 或在 Isaac Sim 中用 FEM solver 添加柔性物体

3. 流体(Fluid / Liquid)

SceneSmith 不支持

原因

同上,Drake 不包含流体仿真。house.dmd.yaml 只有刚体 Directives。

"倒水"这类任务需要:

  • SPH (Smoothed Particle Hydrodynamics)
  • FLIP Fluid
  • FluidLab、Taichi Physics 等

变通方案

  1. 用 SceneSmith 生成杯子、瓶子的几何体(SDF包含容器形状)
  2. 将容器几何体导入 FluidLab / Taichi
  3. 在流体仿真器中加入液体粒子

注意: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) 格式
  • LeRobotlerobot 库的 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,)