Nail it in the dream — training where physics is perfect
This hopper lives in a simulator with perfect grip, zero sensor noise, zero motor delay. Its policy has two knobs — jump power and forward push — and a hill-climbing trainer tweaks them, keeping whatever hops farther. Click Train a few times and watch the curve climb and the gait get aggressive. In sim, aggression is free.
Real hill-climbing over a real (toy) physics sim, running in your tab. Distances are measured from the simulation, not scripted.
Now wake up — the same policy meets a real floor
Same trained policy, frozen. But reality has less friction than the sim assumed, noisy actuators, and latency between sensing and acting. Drag the sliders to set how unlike the sim your "reality" is, then deploy. The grip check below the canvas tells you, before it even jumps, whether physics will forgive the policy's habits.
The cheat code that doesn't exist — exploiting a simulator bug
Simulators have bugs, and optimizers are bloodhounds for them. This sim's contact solver has a classic one: slam into the ground hard enough and it ejects you forward — free speed. Train in the buggy sim and watch the policy learn to dive-bomb the floor on purpose. Then deploy it to reality, where hard landings just… break you.
Train in a thousand worlds — domain randomization
The fix sounds paradoxical: make the simulator worse. During training, re-roll friction, noise and latency every episode, so no single world can be memorized. The chart compares the one-perfect-sim policy against the randomized one across the whole friction range. Slide the marker and race them on any floor you like.
Both policies were genuinely trained in your browser when the page loaded — same trainer, same budget, only the training worlds differ. Curves are averages of 8 fresh runs per point.
Too much of the cure — when randomization kills learning
If some randomization is good, is maximum randomization better? No — and you can prove it here. The σ slider sets how wild the training worlds get. Train at σ 0, at 0.5, at 1.0, and compare the deployments on the same real test floor. At σ 1.0 two things break at once: the only policy that survives everywhere is a timid crawl, and evaluations get so noisy the trainer can't tell good from bad.