If you warn a walking robot that a shove is coming, does it stay on its feet? Two simulated robot dogs, identical but for a four-number warning, shoved about 148,000 times.
All three at 250 N, roughly 1.8× the robot's own weight. The overlay uses the code's names for them: anticipatory, reactive, anticipatory (blind). These are independent rollouts, not the same shoves replayed, so read them as an illustration rather than the measurement.
I trained two robots to walk while something shoved their body from a random direction every three to six seconds. The only difference between them: one saw a warning shortly before each shove — which direction it was coming from, how hard, and how long until it landed — and the other had to deal with the shove after it arrived. Then I froze both and shoved them at seven fixed strengths, 1024 robots in parallel, and counted the falls.
Up to 160 N the two robots are the same: 0.9% and 0.8% falls, a tie. Reacting after the shove lands is fast enough at that strength — the robot thinks 50 times a second. The gap only opens at 200 N and becomes large at 250 N.
That is the part worth knowing, because the obvious experiment misses it. Had I only tested up to 160 N, the honest conclusion would have been "warning the robot does nothing."
| Shove | Warned | Not warned | Warning off |
|---|---|---|---|
| 35 N | 0.0% | 0.0% | 0.0% |
| 60 N | 0.0% | 0.1% | 0.0% |
| 90 N | 0.1% | 0.5% | 0.6% |
| 120 N | 0.5% | 0.4% | 2.3% |
| 160 N | 0.9% | 0.8% | 10.4% |
| 200 N | 0.7% | 1.7% | 27.8% |
| 250 N | 1.2% [1.0, 1.5] | 6.1% [5.5, 6.6] | 52.3% [51.4, 53.2] |
Between 6,692 and 11,188 shoves per cell. Ranges are 95% confidence intervals.
| Shove | Warned | Not warned | Warning off |
|---|---|---|---|
| 35 N | 4.9° | 5.6° | 5.5° |
| 120 N | 13.0° | 15.9° | 21.2° |
| 250 N | 16.5° | 29.2° | 54.2° |
Mean peak trunk tilt. Past 70° counts as a fall. The warned robot tips about as far under the hardest shove as the unwarned one does under a medium one.
This is the part I did not see coming. I took the trained warned robot and fed it zeros where the warning normally goes — nothing else changed. It went from falling 1.2% of the time to 52.3%.
That is not a fall back to normal. The robot that never had a warning falls 6.1% of the time, so removing the warning left this one about nine times worse than never having had one. It learned "brace when told" instead of the more general skill of recovering from a shove.
This is the third clip from the top of the page. The arrow is still drawn for you; the robot can no longer see it. If a real robot's warning came from a camera or a sensor that failed, this is what you would get — and making it cope without the warning is a separate job you do not get for free.
Every number above comes from a force applied directly to the robot's body, because that gives an exact strength to put on the chart. The trouble is that "a force was applied to the body" is not something you can watch.
So here is the same trained robot, unchanged, with a real 5 kg ball thrown at it instead. No measurement comes from these clips. About one throw in three misses — the ball is aimed where the robot is going to be, and the warned robot slows down when it sees the throw coming.
The robot model, the walking task, the training algorithm and the reward functions all come from mjlab. I wrote about 450 lines on top of it: the threat command that picks a shove, counts down to it, tells the robot what is coming and applies the force; the difficulty curriculum; and the two environment configs, which differ by one line.
I wrote no reward functions — mjlab already has the ones this task needs, and adding my own would have introduced differences that had nothing to do with the question. I did remove mjlab's built-in random push, which is an instant velocity change that ignores mass and cannot be aimed, scaled or announced; leaving it in would have added a second kind of shove neither robot could ever be warned about.
Code on GitHub — the write-up, the ~148,000-row eval tables, and the tests that check the two setups differ by exactly one thing.
Release — both trained policies, every training checkpoint, and all 40 clips: each robot at each shove strength, learning from scratch, and the ball throws.