Skip to content

l2/scripted/ — L2 来源 #1:手写 SM / motion planner

在 pipeline 里的位置

L2 数据生成层最容易上手的一支:用确定性的状态机或 motion planner 当"专家策略",在 IsaacLab 仿真环境里 GPU 并行 rollout,把成功轨迹写到 data/demos/scripted_*.hdf5

数据金字塔角色:量级最大(10⁵+ 条/天),覆盖底座技能。

核心做什么

  1. 选定 task(默认 Isaac-Lift-Cube-Franka-IK-Abs-v0)。
  2. state_machine.py 用 Warp kernel 跑一个确定性 SM:REST → APPROACH_ABOVE → APPROACH → GRASP → LIFT。
  3. RecorderManager 自动把每步 (obs, action) 写到 EpisodeData buffer。
  4. episode 结束(success / time_out / object_dropping)时,EXPORT_SUCCEEDED_ONLY 模式只把 success=True 的 episode 落盘到 HDF5。

怎么跑

bash
# 默认 4 envs,10 个 success 大约 30 秒
uv run python l2/scripted/collect.py --num_demos 10 --num_envs 4

# 看一眼 schema
uv run python tools/h5_inspect.py data/demos/scripted_lift_cube.hdf5

产物:data/demos/scripted_lift_cube.hdf5

关键设计决策

  • HDF5 schema 用 IsaacLab 官方 data/demo_{i}/... 布局,不用试验期的 episodes/{i}/...。详见 HDF5 Schema。落盘由 RecorderManager + HDF5DatasetFileHandler 自动完成,本子目录不直接调 h5py。
  • action 空间:IK abs 7d pose + 1d gripper。三种来源都对齐到这个表示,详见 obs/action 对齐
  • obs 拆开存env_cfg.pyconcatenate_terms=False,5 个 obs term(joint_pos / joint_vel / object_position / target_object_position / actions)分别落到 obs/<key>
  • success 由 termination 终止项 + EXPORT_SUCCEEDED_ONLY 自动过滤env_cfg.py 加了 terminations.success = DoneTerm(object_reached_goal)RecorderManager 在 reset 时读它写到 episode attr,失败的 episode 不落盘。无需自己写 success buffer 或 pre-step 判定(那是没用 RecorderManager 时代的 workaround)。
  • panda down-grasp 朝向:SM 给 IK 的 quat 用 (qx=0, qy=1, qz=0, qw=0),对应绕 Y 轴 180°、panda_hand 自上向下。给单位 quat (0,0,0,1) IK 会把 EE 翻成立起来。

文件清单

文件用途
collect.py主入口:构造 env、循环驱动 SM、写入 HDF5
state_machine.pyPickAndLiftSm,Warp kernel 实现的 5-状态 FSM
env_cfg.py在官方 Isaac-Lift-Cube-Franka-IK-Abs-v0 上加 success term + 录制配置

扩展点

  • 把 SM 换成 cuRobo motion planner
  • 通过 mimic(isaaclab_mimic)把单条 SM demo 扩增上百倍
  • 加域随机化(光照 / 摩擦 / 物体位置)
  • 加 camera 观测:env_cfg.py 里有 TODO,要同时加 scene.front_cam = CameraCfg(...) + observations.policy.front_cam = ObsTerm(...)

参考:L2 三种轨迹来源 §1。