humanoid-robust-noisy
Humanoid (MuJoCo Humanoid-v5) · solved 3 of 9 agent attempts pass
more
Open: every locomotion design of the study falls under noise + delay (the humanoid-forward oracle: 0/40 alive, down within 1.2 s), as does TD3 on the walker. It asks for a different skill than gait design: filtering or delay compensation in the loop. Update 2026-10-25: the measurement noise reaches every observation channel (gym_obs included) since the plant correction of that day; on the corrected plant the gate was cleared in session under the Claude Code protocol by Opus 5.5 (2/3: 0.63 m/s with noise + delay at 0.93, and 0.30 m/s at 1.00 everywhere) and Fable 5.1 (1/3: 0.27 m/s at 1.00 everywhere); both detect the one-step command delay from obs['last_action'] and compensate. RL reference for the family: SB3 SAC trained with the physics knobs, pushes, noise and 0-2 steps of delay re-sampled every episode (rl_references/humanoid/train_sb3_sac_dr.py, profile all) survives noise + delay on 100 % of the grader seeds at 0.28-0.43 m/s, forward 1.00, while nominal SAC is at 0.025. The shipped solution is still the forward gait (oracle fixture 0) until one of the in-session solutions is promoted.
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) `heavy_torso_20`, `low_friction_30`, `weak_motors_20`, `gravity_high_10`, `noisy_delay_v1` (`--scenarios`)
Axes: plant:humanoid, scenario:standard_v0+physics-suite+noisy-delay, gate:forward_3m, robustness:torso-friction-motors-gravity-noise-delay
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.
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 1.000 | ≥ 0.900 |
| scenario:heavy_torso_20 | 1.000 | ≥ 0.900 |
| scenario:low_friction_30 | 1.000 | ≥ 0.900 |
| scenario:weak_motors_20 | 1.000 | ≥ 0.900 |
| scenario:gravity_high_10 | 1.000 | ≥ 0.900 |
| scenario:noisy_delay_v1 | 1.000 | ≥ 0.900 |
The agent's final message
The controller in `/app/work/controller.py` passes the gate. On the visible seeds 0–4 the official evaluator reports `solved=True`, with 5/5 on all six scenarios. Mean return is about 5270 and the robot covers about 4.6 m in 15 s, so it clears `forward` (3 m) with margin but doesn't reach `brisk` (8 m). It took about 30 of the 60 minutes. I also ran 40 seeds per scenario (500–539) that were never used in tuning. It passed 239 of 240: the only miss was one `gravity_high_10` episode (seed 509), which fell at step 187. | Scenario | Seeds 0–4 (official) | Seeds 500–539 | |---|---|---| | standard_v0 | 5/5 | 40/40 | | heavy_torso_20 | 5/5 | 40/40 | | low_friction_30 | 5/5 | 40/40 | | weak_motors_20 | 5/5 | 40/40 | | gravity_high_10 | 5/5 | 39/40 | | noisy_delay_v1 | 5/5 | 40/40 | **How it works** (the docstring explains each gain): - **Walking law:** a SIMBICON-style controller, written from scratch. The legs take turns as the support leg; they swap when the swinging foot touches down, or when a timer runs out. - **Foot placement:** each step is aimed using how far the body's centre of mass is ahead of (or beside) the support foot, and how fast it is moving. - **Torso balance:** the support hip holds the torso's pitch and roll upright. - **Joint gains:** they are scaled to each joint's inertia. The hip-twist and arm joints are so light that ordinary gains made their commands flip between the limits every step, so they get low stiffness and rely on the joints' built-in damping. -…
A SIMBICON walker alternates stance legs on foot touchdown or timeout, places the swing foot from COM offset and velocity, balances the torso via the stance hip, and runs on a model-predicted state when it detects command delay.
Shown: public seed 0 (standard_v0); this episode passes the forward rung. This episode: episode_steps 1000, x_final 4.7, min_height 1.28, max_abs_pitch 0.0881, n_steps 105, total_reward 5281.
controller.py · agent transcript · trial humanoid-robust-noisy__U8DUa4q
heavy_torso_20| criterion | graded | needed |
|---|---|---|
| base:forward | 1.000 | ≥ 0.900 |
| scenario:heavy_torso_20 | 1.000 | ≥ 0.900 |
| scenario:low_friction_30 | 1.000 | ≥ 0.900 |
| scenario:weak_motors_20 | 1.000 | ≥ 0.900 |
| scenario:gravity_high_10 | 1.000 | ≥ 0.900 |
| scenario:noisy_delay_v1 | 1.000 | ≥ 0.900 |
The agent's final message
The controller in `/app/work/controller.py` passes the gate. On the visible seeds 0–4 the official evaluator reports `solved=True`, with 5/5 on all six scenarios. Mean return is about 5270 and the robot covers about 4.6 m in 15 s, so it clears `forward` (3 m) with margin but doesn't reach `brisk` (8 m). It took about 30 of the 60 minutes. I also ran 40 seeds per scenario (500–539) that were never used in tuning. It passed 239 of 240: the only miss was one `gravity_high_10` episode (seed 509), which fell at step 187. | Scenario | Seeds 0–4 (official) | Seeds 500–539 | |---|---|---| | standard_v0 | 5/5 | 40/40 | | heavy_torso_20 | 5/5 | 40/40 | | low_friction_30 | 5/5 | 40/40 | | weak_motors_20 | 5/5 | 40/40 | | gravity_high_10 | 5/5 | 39/40 | | noisy_delay_v1 | 5/5 | 40/40 | **How it works** (the docstring explains each gain): - **Walking law:** a SIMBICON-style controller, written from scratch. The legs take turns as the support leg; they swap when the swinging foot touches down, or when a timer runs out. - **Foot placement:** each step is aimed using how far the body's centre of mass is ahead of (or beside) the support foot, and how fast it is moving. - **Torso balance:** the support hip holds the torso's pitch and roll upright. - **Joint gains:** they are scaled to each joint's inertia. The hip-twist and arm joints are so light that ordinary gains made their commands flip between the limits every step, so they get low stiffness and rely on the joints' built-in damping. -…
A SIMBICON walker alternates stance legs on foot touchdown or timeout, places the swing foot from COM offset and velocity, balances the torso via the stance hip, and runs on a model-predicted state when it detects command delay.
Shown: public seed 0 (heavy_torso_20); this episode passes the forward rung. This episode: episode_steps 1000, x_final 4.87, min_height 1.28, max_abs_pitch 0.0903, n_steps 107, total_reward 5286.
controller.py · agent transcript · trial humanoid-robust-noisy__U8DUa4q
low_friction_30| criterion | graded | needed |
|---|---|---|
| base:forward | 1.000 | ≥ 0.900 |
| scenario:heavy_torso_20 | 1.000 | ≥ 0.900 |
| scenario:low_friction_30 | 0.875 | ≥ 0.900 |
| scenario:weak_motors_20 | 1.000 | ≥ 0.900 |
| scenario:gravity_high_10 | 1.000 | ≥ 0.900 |
| scenario:noisy_delay_v1 | 1.000 | ≥ 0.900 |
The agent's final message
`/app/work/controller.py` now passes the `forward` gate (≥ 3 m, alive for all 1000 steps) on the nominal plant and on all five required sibling scenarios. The 95% upper bound on the failure rate is still 0.139 with 20 seeds, so the true rate is not pinned to 0.9 yet. | Seeds | Result | |---|---| | 0–9 | 100% on the nominal plant and on every sibling scenario. | | 40–59 | 100% nominal and on `heavy_torso_20`, `weak_motors_20`, `gravity_high_10`. 95% on `low_friction_30` and on `noisy_delay_v1` (1 failure in 20 each). | Over the 20 fresh seeds 20–39 the delay scenario scored 90% with the earlier delay parameters. After a further delay-only retune it scored 20/20 on those same seeds, and the final controller used those parameters on seeds 40–59. Those seeds were never used for tuning, but 20–39 saw both parameter sets, so that 20/20 is slightly optimistic. It walks at roughly 0.4–0.5 m/s, so `brisk` and `fast` are not reached in the final runs. Passing `forward` is all the grader requires. **How the controller works.** It is a SIMBICON-style gait: a two-state machine alternates which leg is stance and which swings. The state switches on swing-foot touchdown, with a minimum and maximum dwell time. - **Swing leg:** the hip angle is placed from the COM offset and velocity relative to the stance foot, in both the sagittal and frontal planes. The knee flexes for clearance and extends before touchdown. - **Stance leg:** the knee stays nearly straight, and the stance hip applies t…
A SIMBICON-style walker alternates right/left stance using contact and timing, placing the swing foot by COM position and velocity feedback, holding the stance knee near straight, and balancing the torso via stance-hip torque, with PD-held abdomen and arms and a delay-adaptive parameter set.
Shown: public seed 16 (low_friction_30); this episode fails the forward rung. This episode: episode_steps 96, x_final 0.111, min_height 0.975, max_abs_pitch 0.591, n_steps 11, total_reward 464. It was the first failing one of 17 public seeds tried.
controller.py · agent transcript · trial humanoid-robust-noisy__kvkEim7
weak_motors_20| criterion | graded | needed |
|---|---|---|
| base:forward | 0.950 | ≥ 0.900 |
| scenario:heavy_torso_20 | 0.975 | ≥ 0.900 |
| scenario:low_friction_30 | 0.925 | ≥ 0.900 |
| scenario:weak_motors_20 | 0.800 | ≥ 0.900 |
| scenario:gravity_high_10 | 0.825 | ≥ 0.900 |
| scenario:noisy_delay_v1 | 0.500 | ≥ 0.900 |
The agent's final message
The controller in `/app/work/controller.py` passes the official evaluator on the visible seeds 0–4. On seeds the search never saw it doesn't reliably clear the 0.9 gate, so the held-out grade is uncertain. I stopped at about 51 minutes of the 60. **Official run (seeds 0–4, `--success-mode forward`):** solved=True. Success is 1.00 on `standard_v0` and on all five sibling scenarios. Every episode lasted the full 1000 steps, the mean distance was about 4.5 m, and the robot never pitched more than 0.17 rad. **My own checks on other seeds (a scratch harness, same environment):** | Seeds | standard | heavy_torso | low_friction | weak_motors | gravity_high | noisy_delay | |---|---|---|---|---|---|---| | 5–9 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | | 10–19 | 8/10 | 8/10 | 8/10 | 7/10 | 8/10 | **4/10** | Over seeds 10–19 that's about 70–80% per scenario, and 40% under `noisy_delay_v1`. The failures are falls in the first few seconds, not walking too slowly; survivors cover 4–5 m, or about 3 m under noise and delay. The parameters were tuned on seeds 0–5, so seeds 10–19 are the fairer estimate. It is sensitive: moving the foot-placement offset `x0` by ±0.005 m changes results a lot. **How it works:** - **State and model:** each step it rebuilds the full state from `gym_obs` into a private copy of the MuJoCo model. - **Plant identification:** it reads what the plant reveals at the start of an episode: - the real motor gears, from `obs["gear"]`; - the torso mass, from the inertia d…
Each step it rebuilds the full state in a private MuJoCo model and solves a weighted bounded least-squares problem for joint accelerations and friction-cone contact forces to track torso orientation, CoM height and velocity, swing-foot trajectory and posture, then converts the resulting torques to motor commands while a stance-swap state machine places short Raibert-style steps.
Shown: public seed 13 (weak_motors_20); this episode fails the forward rung. This episode: episode_steps 117, x_final 0.649, min_height 0.999, max_abs_pitch 0.299, n_steps 13, total_reward 609. It was the first failing one of 14 public seeds tried.
controller.py · agent transcript · trial humanoid-robust-noisy__d2jr89b
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 0.700 | ≥ 0.900 |
| scenario:heavy_torso_20 | 0.025 | ≥ 0.900 |
| scenario:low_friction_30 | 0.600 | ≥ 0.900 |
| scenario:weak_motors_20 | 0.000 | ≥ 0.900 |
| scenario:gravity_high_10 | 0.000 | ≥ 0.900 |
| scenario:noisy_delay_v1 | 0.000 | ≥ 0.900 |
The agent's final message
The budget is at 51 of 60 minutes and every neighbour and search run returns to the same point, so I'm stopping here with the best controller installed. ## Outcome **The submission does not pass the gate.** The final controller at `/app/work/controller.py` walks the nominal Humanoid forward on about two thirds of fresh seeds, but it fails most of the perturbation scenarios, so the required 0.9 forward rate on all six plants is not met. Official evaluator on seeds 0 to 4 (`--success-mode forward`): | Scenario | Forward rate | |---|---| | standard_v0 | 0.60 | | low_friction_30 | 0.80 | | heavy_torso_20 | 0.00 | | weak_motors_20 | 0.00 | | gravity_high_10 | 0.00 | | noisy_delay_v1 | 0.00 | On 40 held-out seeds I ran myself (24 to 63), the nominal plant gives 27 alive and 27 forward, mean distance 3.3 m. ## What the controller is A SIMBICON-style stepping controller for a biped with point feet and no ankles. One leg is stance, the other swings. The swing thigh pitch target is set in the world frame from the mass-centre speed and its lead over the stance foot, so the foot lands further ahead the faster the body falls. The stance is kept wide with a fixed thigh abduction, and a step ends when the swing foot touches down, when the mass centre is already falling toward the swing side, or at a time limit. The stance hip holds the pelvis upright with low-pass-filtered rates and cancels the swing hip's reaction torque. The docstring explains each gain. ## What was learned, in ca…
A two-state SIMBICON-style walker swaps stance and swing legs on touchdown, lateral sway or timeout, placing the swing foot by forward velocity and CoM lead while the stance hip holds the pelvis upright and the swing knee bends for clearance.
Shown: public seed 1 (standard_v0); this episode fails the forward rung. This episode: episode_steps 381, x_final 0.69, min_height 0.983, max_abs_pitch 0.331, n_steps 36, total_reward 1909. It was the first failing one of 2 public seeds tried.
controller.py · agent transcript · trial humanoid-robust-noisy__Bu2r47z