Replace ImplicitActuator (which doesn't work for prismatic joints) with
IdealPDActuator. This bypasses PhysX drive and explicitly computes PD forces
using set_dof_actuation_forces().
Changes:
- stiffness=100k, damping=5k to resist arm reaction forces (~150N) with <2mm deflection
- Read trunk_cmd from ArticulationCfg initial position (single source of truth)
- Integrate trunk diagnostics into robot state output
- Remove hardcoded trunk_target parameter
Switch arm IK from world-frame to body-frame control so that
pushing the XR controller forward always moves the arm in the
robot's forward direction, regardless of chassis rotation.
Key changes:
- dual_arm_agent: convert EEF observations to body frame before
passing to XR controller; send body-frame IK targets directly
(removed convert_action_world_to_root)
- xr_controller: XR deltas treated as body-frame deltas (no yaw
rotation needed — VR view tracks robot heading naturally)
- streaming: add debug frame save for stereo alignment diagnostics
- mindrobot_2i_cfg: IdealPDActuator for trunk, disabled gravity
- Author headers updated to Yutang Li, SIAT
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add MindRobotDualArmIKAbsEnvCfg: standalone dual-arm env inheriting
ManagerBasedRLEnvCfg directly (no single-arm dependency), 20D action
space (left_arm7 | wheel4 | left_gripper1 | right_arm7 | right_gripper1)
- Add local mdp/ with parameterized gripper_pos(joint_names) to support
independent left/right gripper observations without modifying IsaacLab
- Update teleop_xr_agent.py for dual-arm mode: shared XrClient to avoid
SDK double-init crash, root-frame IK command caching so arm joints are
locked when grip not pressed (EEF world pos still tracks chassis)
- Tune mindrobot_cfg.py initial poses with singularity-avoiding offsets
- Add CLAUDE.md project instructions and debug_action_assembly.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>