ITADN

feat(benchmarks/libero): apply the init-state arm qpos on Isaac - map robosuite joint names to the USD articulation

#1828Closedyinsong1986 创建于 19 天前
Y
yinsong1986commented
## Summary #1827 (fixing #1820) applies LIBERO init states on the Isaac backend as per-object poses plus robot **base** alignment, decoded through a CPU MuJoCo compile of the scene MJCF (`LiberoAdapter._apply_object_pose_state`). One slice of the init state is still unapplied on Isaac: the robot **arm qpos** (LIBERO's Panda "ready" pose, `[0, -0.161, 0, -2.444, 0, 2.227, pi/4]` + gripper). On MuJoCo the full qpos vector lands in one write, so the arm starts every episode at the canonical ready pose the policy's training data assumes. On Isaac the USD Franka articulation starts at its USD default (all-zero, upright) - live physics is stable and actions actuate (#1827's gates), but the first observation is OOD relative to the LIBERO training distribution, which costs the policy its familiar starting basin. ## Why it wasn't folded into #1827 The decoded scene names joints `robot0_joint1..7` / `gripper0_finger_joint1..2` (robosuite prefixes), while the Isaac USD articulation names them `panda_joint1..7` / `panda_finger_joint1..2`. Suffix matching is ambiguous (`joint1` is a suffix of both `panda_joint1` and `panda_finger_joint1`), so a robust mapping needs an explicit convention rather than a heuristic dropped into a bugfix PR: - strip the adapter's `_scene_robot_prefix` / `_scene_gripper_prefix` and match against articulation dof names by **longest unique suffix**, failing loud on ambiguity; or - accept an explicit `scene_joint_map: dict[str, str]` adapter kwarg (plumbed via `load_libero_suite(adapter_kwargs=...)` like the #1811 EEF calibration), with a Franka default shipped by `run_isaac.py`. Either way the write itself is one call: `sim.set_joint_positions(mapped, robot_name=...)` already exists on `IsaacSimulation`. ## Acceptance criteria - After `on_episode_start` on Isaac, the arm joint positions match the decoded init-state arm qpos within tolerance (unit test with the recording-stub pattern of `tests/benchmarks/libero/test_isaac_object_pose_state.py`, plus a GPU integ assertion). - Ambiguous / unmappable joint names fail loud (no silent partial writes). - MuJoCo path unaffected (model-present branch unchanged). ## Related - #1827 / #1820 (object + base pose halves of init-state application) - #1819 / #1812 (delta-EEF controller whose policy consumes the first observation) - #1811 (adapter kwargs plumbing pattern)
关闭于 19 天前 0 条评论