Trigger: policy videos showed laggy wrists and slow locomotion. We chased it through data (GMR), hardware limits, and configs — the trail ended at hand-transcribed constants and two AgiBot vendor-file inconsistencies, NOT at retargeting or embodiment ceilings as first assumed.
| constant | was | real (URDF & MJCF agree) | impact |
|---|---|---|---|
EFF_WRIST_PR | 2.2 | 4.8 | wrist torque halved — the main wrist-lag culprit |
EFF_HIP | 118 | 120 | 1.7% |
EFF_KNEE | 118 | 120 | 1.7% |
EFF_WAIST_YAW | 118 | 120 | 1.7% |
x2.py's own comment says these were copied from the MJCF ctrlrange — they were mistyped. Both vendor files agree on the correct values, so the fixes are unambiguous. They take effect on the next training run (running arms loaded the old values at start).
Recursive diff of gear_sonic/ and the full config tree:
| layer | result |
|---|---|
| config/** (rewards, PPO, obs, terminations, events) | byte-identical; only addition = sonic_x2.yaml |
| sonic_x2.yaml vs sonic_release.yaml | robot=x2, data paths, warm-start block, critic dims (= official default, no-op), removed upper_body_augment_prefixes (official-internal clip names) |
| 14 changed shared .py files | X2 registration (4), dof_sign infra (no-op for G1), /dev/shm fix; the rest = upstream is newer than fork base (teleop tooling refactors, not on the training path) |
| rigid/articulation props vs g1.py | 12/12 identical (solver 8/4, self-collision, damping…) |
| action_scale formula | same as G1 (0.25·effort/stiffness) |
| # | question | evidence | owner |
|---|---|---|---|
| 1 | Pelvis mass — RESOLVED ✓ | The MJCF's 5.03 kg is NOT an authored value: pelvis is the only body in the vendor MJCF lacking an explicit inertial, so MuJoCo auto-computes it from collision-geom volume × default density. URDF's 3.52 kg is the only authored value (byte-identical in third-party ioai-tech/robot_description redistribution). Training uses URDF — correct all along; MJCF serves kinematics only. | closed |
| 2 | KP/KD provenance — RESOLVED ✓ | x2.py gains = AgiBot official SOP 'AgiBot X2 motion-control deployment SOP (vendor PDF)' §3.1 mimic profile verbatim (the profile AgiBot pre-tuned FOR motion-mimic deployment — exactly our use case). Cross-checked vs the AimDK SDK joint-control example: wrist 20/2 identical in both profiles (official choice, likely wrist-motor protection); legs stiffer in mimic (120/150) vs safe-demo (40/80) as expected. SDK example joint ranges match our Ultra URDF digit-for-digit → same robot variant confirmed. | closed |
| 3 | URDF velocity field (wrist 4.19 rad/s) inconsistent with torque; unused by training | Parked — zero impact on current runs. | (later) |