In-browser MuJoCo policy · live training graphs · technical note
Methods note · SuperDroid Robots research
How we train sim-concept-01 (“Rocky”) to walk and recover from large pushes: a phase-locked reference gait plus capture/stumble scaffolding, a residual PPO policy in MuJoCo MJX (Warp), coupled curricula that never lower the difficulty ceiling, and an explicit plan to fade every hand-written term to zero.
End-to-end bipedal RL under impulsive disturbances is hard because a fixed gait clock and a throttled swing residual are excellent for clean walking and terrible for protective steps. A push can demand that the planted foot move immediately; a scripted schedule that still owns that leg makes ~100% survival at 250 N structurally unreachable. Our answer is not to soften the task. We keep 1500-step episodes and a 30–250 N push range, and instead introduce an explicit, measurable scaffold that assists recovery during Stage A, then fades to zero (Stages B–C) so the final artifact is network + PD only.
At 50 Hz the actor emits 22 residuals a. Joint targets are assembled
identically in training (MJX) and deploy (CPU MuJoCo / this browser):
q_ref = q₀ + w_g·gait(φ)·move_gate(cmd) + w_s·steer(v,r) + w_u·stumble(·) + α(r)·tanh(a)·authority(φ,r)
Torques follow MIT PD,
τ = clip(kp·(q_ref−q) − kd·q̇),
held across physics substeps (~250 Hz). Phase 1 keeps feedforward torque at zero.
Arms are PD-held (ARMS_MODE=held). The scripted gait uses cos-phased stride
and large knee/ankle clearance (~0.68 / 0.38 rad) with no baked-in
abduction (the policy owns frontal balance). Swing sagittal joints are throttled to
SWING_POLICY_WEIGHT = 0.22 while walking so the residual cannot cancel the
reference lift.
A scalar recovery gate r ∈ [0,1] rises with torso tilt
(|ĝ_xy|) and uncommanded horizontal velocity error. Thresholds were
recalibrated after measuring that undisturbed gait can produce ~1 m/s velocity-error
peaks—earlier settings made the gate a gait-phase detector. A
gate latch (~0.75 s) holds recovery through the
velocity→tilt hand-off after a push.
Recovery drives two different paths on purpose. The control path (steer,
authority, optional gait fade / 2× phase rate) engages on tilt or velocity so feet can
move. The reward path is anti-farmed: capture and recovery-shaped credit require
push_recent or a large velocity kick—tilt alone is not paid, because
policies otherwise learn to walk “tipsy” to harvest rewards.
Capture steer biases foot placement (including crossover / stagger / relief
modes: if the fall-side foot is loaded, briefly plant the other foot nearby so the loaded
leg can take the wide recovery step). Stumble adds multi-step scaffolding in the re-armed
post-capture window. Authoritative abduction override exists as a lever but is
off on current public runs (CAPTURE_ABD_OVERRIDE_SCALE=0).
Training uses PPO with an asymmetric actor-critic in MuJoCo MJX (Warp), typically 1024 environments on an RTX 3080. The shipped actor sees only deployable features:
Network: dense 256→256→256 tanh MLP → 22-D Gaussian mean (fixed log-std on recent consolidation runs). Critic uses privileged state and is discarded at publish. Domain randomization includes mass, friction, sensor noise, and a hard tail (~30% of envs) with elevated push floors and mid-swing onset to concentrate rare failure modes (e.g. relief-plant misses) without easing the rest of the distribution.
Three ramps advance only when gates pass (survival, tracking, recovery bars, minimum update counts)—and the environment ceiling stays hard:
command_ranges.Gold checkpoints and high-impulse probes (fixed seed suites) decide whether a rung is keepable. A representative Stage A deliverable recovered 47/48 probe events (r69@8500); later rungs (r72/r73) raise hard-tail force floors and add relief-mode steering rather than relaxing physics.
The standing directive is that scaffolding is temporary. Hard removal in one shot has been falsified (r62); Stage B fades levers rung-by-rung with probe gates between rungs.
q_ref = q₀ + α·tanh(a).| Lever | Stage A default | At 0 |
|---|---|---|
GAIT_REF_WEIGHT | 1.0 | No scripted walking reference |
STEER_WEIGHT | 1.0 | No capture / relief steer |
STUMBLE_GAIN | 0.8 | No multi-step stumble scaffold |
AUTHORITY_WEIGHT | 1.0 | No swing-authority throttle logic |
RECOVERY_PHASE_RATE_GAIN | 1.0 | Plain phase clock |
RECOVERY_GAIT_FADE | 0.0 (already) | Gait always on during recovery |
CAPTURE_ABD_OVERRIDE_SCALE | 0.0 (already) | No authoritative abd override |
The charts above are the pinned TensorBoard scalars used to judge runs—not marketing proxies:
Policies and metrics publish on a cadence to this page; your browser runs MuJoCo WASM and refreshes about every 15 s. The Nudge control samples the training push force/duration ranges with a random heading. Browser recovery is still a simplified subset of the full Python scaffold path—useful for intuition, not a claim of probe parity.
This is not a physical robot livestream, not Stage C completion, and not a statement that every probe failure class is solved. It is a living methods note for the Stage A scaffold-assisted stack that currently feeds the public checkpoint, and a map of how that scaffold is designed to disappear.