主题
Scripted 数据采集
L2 数据生成层最容易上手的一支:用确定性的状态机在 IsaacLab 仿真环境里 GPU 并行 rollout,把成功轨迹写到 HDF5。
数据金字塔角色:量级最大(10⁵+ 条/天),覆盖底座技能。
核心原理
状态机(5 个状态)
↓
REST → APPROACH_ABOVE → APPROACH → GRASP → LIFT
↓
输出 8d IK-abs action [x, y, z, qx, qy, qz, qw, gripper]
↓
IsaacLab env.step() + RecorderManager
↓
data/lift_cube/scripted/{run_id}/episodes.hdf5关键特点:
- 确定性:同样输入 → 同样输出
- GPU 并行:Warp kernel,1024 envs 同时跑
- 自动过滤:只保留 success=True 的 episode(
EXPORT_SUCCEEDED_ONLY)
使用方法
bash
# 基础采集
uv run sim2lerobot scripted collect --num_demos 10 --num_envs 4
# 录制视频(每 5 个 episode 录一个)
uv run sim2lerobot scripted collect --num_demos 50 --num_envs 4 --video --video_interval 5
# 检查 schema
uv run h5_inspect data/lift_cube/scripted/{run_id}/episodes.hdf5状态机逻辑
| 状态 | 目标 | 转移条件 |
|---|---|---|
| REST | 等待 0.2s | 时间到 |
| APPROACH_ABOVE | cube 上方 10cm | 距离 < 1cm + 停留 0.5s |
| APPROACH | cube 位置 | 距离 < 1cm + 停留 0.6s |
| GRASP | 闭合夹爪(gripper=-1) | 等待 0.3s |
| LIFT | 目标位姿 | 到达后停留(等 TerminationManager 判定 success) |
Warp kernel 并行:所有 env 的状态机在 GPU 上同时推进,比 CPU for 循环快 10-100 倍。
关键设计
1. IK-abs action 空间
状态机输出 8d action:
- 位置:3d (x, y, z)
- 朝向:4d quat (qx, qy, qz, qw),固定为 panda down-grasp
(0, 1, 0, 0) - 夹爪:1d gripper ∈
2. Success 自动判定
env_cfg.py 加了 terminations.success = DoneTerm(object_reached_goal):
RecorderManager在 reset 时读termination_manager["success"]- success=True → 写 HDF5
- success=False → 丢弃 buffer(
EXPORT_SUCCEEDED_ONLY)
3. HDF5 Schema
使用 IsaacLab 官方 RecorderManager + HDF5DatasetFileHandler:
/data/demo_{i}/
├── attrs: num_samples=T, success=1.0, seed=-
├── actions (T, 8) # IK-abs action
├── obs/joint_pos (T, 9) # 7 panda joints + 2 fingers
├── obs/joint_vel (T, 9)
├── obs/object_position (T, 3)
├── obs/target_object_position (T, 7)
├── obs/actions (T, 8) # last_action
├── initial_state (nested dict)
├── states (nested dict)
└── processed_actions (T, 8)详见 HDF5 Schema。
代码结构
| 文件 | 作用 |
|---|---|
src/sim2lerobot/sources/scripted/collect.py | 主入口:构造 env、循环驱动 SM、统计成功数 |
src/sim2lerobot/sources/scripted/state_machine.py | PickAndLiftSm,Warp kernel 实现的 5-状态 FSM |
src/sim2lerobot/sources/scripted/env_cfg.py | 在 Isaac-Lift-Cube-Franka-IK-Abs-v0 上加 success term + RecorderManager |
关键函数:
collect.py:gather_sm_inputs()— 从 env 读 ee_pose / obj_pose / goal_posestate_machine.py:infer_state_machine()— Warp kernel,GPU 并行推进 SMenv_cfg.py:make_env_cfg()— 构造 env 配置
常见问题
Q: 为什么用 Warp kernel?
A: GPU 并行推进所有 env 的状态机,比 CPU for 循环快 10-100 倍。4 个 env 时差异不大,但 1024 个 env 时差异显著。
Q: 为什么 obj_pose 的 quat 要硬塞 (0,1,0,0)?
A: 这是 panda down-grasp 朝向(绕 Y 轴 180°)。SM 假设永远自上而下抓,不关心 cube 真实朝向。换非对称物体时需要改成真实 quat。
Q: RecorderManager 在哪个时机写 HDF5?
A:
record_pre_step: 每步写 (obs, action) 到内存 bufferrecord_pre_reset: episode 结束时,把 buffer 落盘到 HDF5(如果 success=True)
扩展方向
- 把 SM 换成 cuRobo motion planner
- 通过 mimic(
isaaclab_mimic)把单条 SM demo 扩增上百倍 - 加域随机化(光照 / 摩擦 / 物体位置)
- 加 camera 观测(
env_cfg.py里有 TODO)