humanoid-push
Humanoid (MuJoCo Humanoid-v5) · open 0 of 9 agent attempts pass
more
Push recovery is the standard robustness test of legged robotics and needs reactive foot placement. Open: the humanoid-forward oracle falls on 40/40 seeds (within 2.6 s) and on 34/40 under a 50 N push (matrix on 40 non-task seeds, 2026-10-24).
Gate. per-seed success is the `forward` rung of this benchmark's ladder ['alive', 'forward', 'brisk', 'fast'] (`--success-mode forward`), not the evaluator's default flag; the task is solved when the success rate over the grader's held-out seeds is `>= 0.9`; the same gate must also hold on the sibling scenario(s) `push_v1` (`--scenarios`)
Axes: plant:humanoid, scenario:standard_v0+push, gate:forward_3m, robustness:push-recovery
Each video re-runs the attempt's final controller through the task's own evaluator on a public seed (never the grader's held-out ones). The table under each video is the official grade on the held-out seeds.
push_v1| criterion | graded | needed |
|---|---|---|
| base:forward | 1.000 | ≥ 0.900 |
| scenario:push_v1 | 0.675 | ≥ 0.900 |
The agent's final message
The controller passes the official evaluator on the visible seeds, but it probably won't clear the 0.9 gate on `push_v1` with the grader's unseen seeds. On push seeds it never saw during tuning, about 7 in 12 succeed (~58%). **Evaluator on seeds 0–4:** `solved=True`. Standard 5/5, push_v1 5/5, mean distance about 10 m (brisk rung). Those seeds were part of the tuning set, so this result is optimistic. **Seeds never used in tuning (20–31):** | scenario | pass | note | |---|---|---| | standard_v0 | 12/12 | 11–12 m each | | push_v1 | 7/12 | the failures fall 0.3–1 s after a push | Standard looks solid; push is the weak point. **How `/app/work/controller.py` works** (its docstring explains every gain): - **Model copy:** it keeps a private copy of the MuJoCo model and loads the measured state from `gym_obs` each step. That gives foot positions, Jacobians, joint axes and gravity torques. - **Gait:** it alternates stance and swing legs. The swing ends when that foot touches down near its target, or when the step timer runs out. - **Swing leg:** the foot is placed relative to the mass centre by a capture-point rule: forward distance grows with forward speed, and step width grows with sideways speed. The foot is pulled there by forces through the leg Jacobian. The knee folds early in the swing then straightens, and hip_z keeps the leg pointing forward. - **Stance leg:** the hips apply a world-frame torque to keep the torso upright and facing forward, minus the swing hip's reaction…
A SIMBICON-style walker alternates stance and swing legs on touchdown or phase timeout, placing the swing foot with velocity-based Raibert foot placement via Jacobian-transpose force while stance hips regulate torso attitude and the knees, abdomen and arms use PD servos, with gains found by random search.
Shown: public seed 0 (push_v1); this episode passes the forward rung. This episode: episode_steps 1000, x_final 12, min_height 1.2, max_abs_pitch 0.171, n_steps 110, total_reward 5738.
controller.py · agent transcript · trial humanoid-push__GVKZzx9
push_v1| criterion | graded | needed |
|---|---|---|
| base:forward | 0.975 | ≥ 0.900 |
| scenario:push_v1 | 0.000 | ≥ 0.900 |
The agent's final message
The final controller is in place at `/app/work/controller.py`. Clock: started 01:22, finished 02:02, well inside the 60-minute budget, and no tuners are still running. **Outcome** | Scenario | Visible seeds 0-9 | Fresh seeds 32-47 | |---|---|---| | standard_v0, forward gate | 10 of 10 pass, 5.5 m mean, return 5340 | 16 of 16 pass | | push_v1, forward gate | 0 of 10 | not run | The nominal gate is met with margin, but the push gate is not. The task is therefore not solved as graded. **What the controller does** It is a SIMBICON-style stepping controller: a two-state machine alternates the stance leg, the swing foot is placed by a Raibert rule relative to the mass centre with lateral capture-point feedback, leg geometry converts foot targets into hip angles, and the stance hip plus the abdomen hold the torso upright in the world frame. All joints run a PD law scaled by the motor gears. The docstring explains every gain. **What I found along the way** - The feet are frictionless spheres with no ankle, so balance has to come from foot placement. Standing still is not an option. - My first PD gains caused a sampled-data limit cycle at the 15 ms control step. Cutting the derivative gains to match the leg segment inertias fixed it. - Hand-designed structure got survival to about 5 s. The parameter tuner did the rest, in four rounds from TPE to CMA-ES, taking the nominal pass rate from 20 percent to 100 percent. - Tuning against a mild 30 N push gave the installed gait, which …
A finite-state stepping controller alternates stance legs on foot contact or timeout, places the swing foot with Raibert velocity-feedback targets converted to hip and knee angles under PD tracking, while the stance hip and abdomen torques regulate torso pitch and roll.
Shown: public seed 0 (push_v1); this episode fails the forward rung. This episode: episode_steps 359, x_final 2.37, min_height 0.999, max_abs_pitch 0.565, n_steps 20, total_reward 1934. It was the first failing one of 1 public seeds tried.
controller.py · agent transcript · trial humanoid-push__jars2M8
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 0.825 | ≥ 0.900 |
| scenario:push_v1 | 0.000 | ≥ 0.900 |
The agent's final message
That notification is just the last background wait finishing, and it doesn't change anything. The final controller is still the one I described: 5/5 on `standard_v0` and 0/5 on `push_v1` in the official verifier. It does not meet the gate. I stopped the search jobs before finishing. I have no further changes to make.
The humanoid alternates stance and swing legs, with the stance hip torques PD-regulating torso attitude and the knee holding leg length, while the swing foot follows a smooth lifted path to a velocity-based Raibert/capture-point target tracked via analytic IK and joint PD.
Shown: public seed 6 (standard_v0); this episode fails the forward rung. This episode: episode_steps 767, x_final 3.89, min_height 0.995, max_abs_pitch 0.176, n_steps 61, total_reward 3962. It was the first failing one of 7 public seeds tried.
controller.py · agent transcript · trial humanoid-push__bX5Q4b8
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 0.000 | ≥ 0.900 |
| scenario:push_v1 | 0.000 | ≥ 0.900 |
The agent's final message
The push-scenario tuning found no parameters that survive the pushes, so the current file stays as the deliverable. **Outcome: the gate is not met.** The final controller at `/app/work/controller.py` survives the nominal plant on most seeds but does not reach the 3 m forward rung and does not survive the pushes. Official evaluator results on the final file: | Run | alive | forward | push_v1 forward | |---|---|---|---| | seeds 0-4 | 0.60 | 0.00 | 0.00 | | seeds 5-12 | 0.75 | 0.00 | 0.00 | **What the controller does.** It is a hand-designed, learning-free stepping gait with a fast cadence of about 0.17 s per step. The stance leg regulates torso pitch and roll through its hip motors with a nearly straight knee. The swing leg places its foot Raibert-style relative to the mass centre, follows a smooth lifted path, and is driven through two-link inverse kinematics. Heading is held through the hip yaw motors, and all placement is computed in the yaw frame. Tunable gains live in a `PARAMS` dict with bounds, and the docstring explains each one. **Why it fell short.** Three properties of this plant dominated the hour: - **Point feet give no yaw resistance.** The robot spun 90 degrees in one second until foot placement was moved into the heading frame and yaw was corrected through the hips. - **The hip abduction motors saturate at 40 N m.** Lateral foot placement is slow, so the legs crossed and the robot fell sideways. A minimum lateral clamp fixed the crossing but lateral velocit…
A clocked two-state stepping machine keeps the stance leg balanced with PD on torso pitch and roll, while the swing foot is placed by Raibert-style velocity-based forward and lateral targets, tracked with a smoothstep path and inverse kinematics, and the gait switches on touchdown or timeout.
Shown: public seed 0 (standard_v0); this episode fails the forward rung. This episode: episode_steps 460, x_final 0.906, min_height 0.985, max_abs_pitch 0.655, n_steps 58, total_reward 2281. It was the first failing one of 1 public seeds tried.
controller.py · agent transcript · trial humanoid-push__HJCGZ5q