Robot Everest
2026
Work
Sherpa is an AgiBot A3 Ultra taught to walk the ground a robot meets on the South Col route — and this is the validation harness built to disbelieve it.
- 68/68
- 4.0 m/s
- 204.8M
The problem
A locomotion policy that looks good in the simulator it was trained in has proved nothing. PhysX will happily reward a gait that exploits PhysX, and the failure is invisible from inside: the reward curve rises, the robot walks, and the behaviour is worth nothing outside the solver that taught it.
Alpine ground compounds that, because it does not present its difficulties one at a time. Grade, loose friction, rough displacement and wind arrive together, and a policy can pass every one of them in isolation while failing all four at once.
Approach
Choose a foundation on evidence
Six candidate stacks were scored across ten weighted dimensions before any training ran — disturbance robustness and rough terrain at 20% each, portability to the A3 at 15%, sim2real design and pretrained weights at 10%. Holosoma with FastSAC won on 4.35 of 5, because it trains with rough terrain, pushes and heavy randomization already in the loop rather than bolted on.
Cross-embodiment policies were rejected for having no public code or weights, and checkpoint reuse for being morphology-locked. Recording why the losers lost is what makes the choice re-checkable when one of them improves.
Pin the robot down exactly
The A3 Ultra carries 31 actuated joints — 12 leg, 3 waist, 14 arm, 2 head — at 60.18 kg. The head is welded for locomotion, leaving 29 controlled degrees of freedom, and the joint naming is G1-compatible, which is the specific property that makes Unitree presets portable to this machine at all.
Every value lives in one manifest, with the ones taken from the official model marked separately from the ones assumed. An assumed number that looks official is the kind of error that survives for months. One consequence is visible in the scene above: measured across the recorded rollout, every arm joint moves less than two degrees — the policy spends its whole budget on the legs and holds the upper body still. The walking figure's legs, ankles and waist are that rollout exactly; its arms are posed, because a robot carrying one arm out in front of it for eighteen seconds reads as a broken render rather than as a design decision.
Make the two assets provably one robot
Isaac Sim imports the URDF and MuJoCo reads the MJCF, so the validation gate is only meaningful while the two describe the same machine. A parity test fails the build if they drift apart, and because the manifest's joint order differs from the MJCF kinematic-tree order, direct qpos indexing is banned by a second test rather than by convention.
Both tests exist because the alternative is a sim2sim result that disagrees for a reason nobody can find, and a silent asset divergence is indistinguishable from a real transfer failure.
Randomize what is actually applied
Isaac's stock G1 configuration disables almost all of its own randomization in a post-init hook: pushes, base mass and centre-of-mass terms are set to None, reset velocities are zeroed, and friction ranges collapse to point values. What survives is observation noise and nothing else. The replacement rebuilds the full set as event terms — and the gate reads the resulting spread back out of PhysX rather than trusting the config that claims to have set it.
Three sub-findings fell out: joint friction has no Isaac counterpart on this asset, since the USD ships zeros and a scale operation cannot lift zero; joint resets must be by offset, not by scale, because 17 joints default to exactly 0.0; and the terms must be installed after the parent post-init chain, or the parent nulls the two that matter most.
Validate on physics that shares no code
The gate is MuJoCo 3.11.0, chosen because it shares no solver, no integrator and no source with the trainer. A policy that transfers across it has demonstrated something about the gait rather than about the simulator. The trained policy passes 68 of 68 stability scenarios against 26 of 68 for a PD-stand control on the identical harness, and it transfers with no tuning.
The observation contract is reproduced exactly on the MuJoCo side — a 100-dimensional vector assembled in alphabetical key order, at 50 Hz. Most sim2sim gaps that get reported as physics are an observation layout mismatch.
Read the failures honestly
Alpine is 0 of 3, and every stressor in it passes independently — so the failure is combination, not terrain, which is a different and more useful problem. Yaw drifts 3–6°/s under a zero yaw command. Masking the arm observation channels makes all 28 arm-motion tests pass with no retraining, which locates a coupling bug rather than a policy deficiency.
The get-up policy plateaued near 30%, which is approximately the supine share of the pose bank — evidence that one policy cannot cover every fallen posture, and the reason the track was split rather than tuned.
What I built
- Ran the weighted baseline study that chose the training stack, and recorded why each rejected option lost.
- Rebuilt the domain randomization that upstream silently disables, and wrote the gate that verifies it by reading per-environment spread back out of PhysX.
- Built the sim2sim harness against an independent physics engine, deliberately sharing no code with the trainer.
- Diagnosed a reward gate that let a commanded turn collect full yaw reward by pivoting on the spot: upstream gates the stepping reward on the linear command norm, which is correct for a decaying heading controller and wrong for a persistent joystick. The fix gates on all three commanded channels.
- Wrote the failure analysis, including the arm-coupling result and the get-up plateau that split the track.
- Ported the stack to a Unitree G1 after the A3 Ultra work concluded. Every number on this page was measured on the A3 Ultra; the G1 leg has no results yet.
Results
- Sim2sim scenarios
- 68/68
- Push, standing
- 3.0 m/s
- Push, walking
- 4.0 m/s
- Slope
- 6/6
- Flat tracking error
- 0.126 m/s
- Training
- 204.8M samples
- Control rate
- 50 Hz
- Alpine
- 0/3
Stack
Lead engineer at Geologic Dome. Reinforcement learning, domain randomization, and the sim2sim validation gate.