主题
l2/scripted/ — L2 来源 #1:手写 SM / motion planner
在 pipeline 里的位置
L2 数据生成层最容易上手的一支:用确定性的状态机或 motion planner 当"专家策略",在 IsaacLab 仿真环境里 GPU 并行 rollout,把成功轨迹写到 data/demos/scripted_*.hdf5。
数据金字塔角色:量级最大(10⁵+ 条/天),覆盖底座技能。
核心做什么
- 选定 task(默认
Isaac-Lift-Cube-Franka-IK-Abs-v0)。 state_machine.py用 Warp kernel 跑一个确定性 SM:REST → APPROACH_ABOVE → APPROACH → GRASP → LIFT。RecorderManager自动把每步 (obs, action) 写到 EpisodeData buffer。- 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.py设concatenate_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.py | PickAndLiftSm,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。