Does warning a walking robot before a shove keep it on its feet? Two simulated robot dogs, identical but for a four-number warning, shoved about 148,000 times.
The trained policies, running in your browser on MuJoCo compiled to WebAssembly. Pick a robot, set the force, and click or tap the floor to shove it from that side.
The not-warned robot walks low; it does in the clips below too. W A S D or the arrows steer, Space throws a random shove. In this browser physics, 2,000 shoves per robot at 250 N gave 1.6%, 5.4% and 52.4% falls, against 1.2%, 6.1% and 52.3% in the study.
All three at 250 N, about 1.8× the robot's weight. The overlay calls them anticipatory, reactive and anticipatory (blind). Independent rollouts, so an illustration, not the measurement.
I trained two robots to walk while being shoved from a random direction every 3–6 s. One saw a warning before each shove: direction, strength and time to impact. Then I froze both and shoved them at seven fixed strengths, 1024 robots in parallel.
Up to 160 N the two tie: 0.9% and 0.8% falls. Reacting after the shove is fast enough there; the robot acts 50 times a second. The gap opens at 200 N and is large at 250 N.
Testing only up to 160 N would have said the warning 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 at 250 N as the unwarned one at 120 N.
I fed the trained warned robot zeros where the warning goes, and changed nothing else. Its falls went from 1.2% to 52.3%.
The robot that never had a warning falls 6.1%, so this one ended up about nine times worse than never having one. It learned "brace when told", not how to recover.
That is the third clip above. A warning lost to a failed sensor would look like this, and coping without it is a separate job.
Every number above comes from a force applied to the body, which you can't see.
Here the same robot gets a real 5 kg ball instead. No measurement comes from these clips. About one throw in three misses: the ball is aimed where the robot will be, and the warned robot slows down when it sees it coming.
The robot model, walking task, training algorithm and rewards come from mjlab. I wrote about 450 lines: the threat command (picks a shove, counts down, warns the robot, applies the force), the curriculum, and the two configs, which differ by one line.
I wrote no reward functions; my own would have added differences unrelated to the question. I removed mjlab's built-in random push, an instant velocity change that can't be aimed or announced, so it wouldn't add a second shove neither robot could be warned about.
Code on GitHub: the write-up, the ~148,000-row eval tables, and tests that check the two setups differ by one thing.
Release: both policies, every checkpoint, and all 40 clips.
From the repository's CITATION.cff:
@software{goel2026bracing,
author = {Goel, Mitanshu},
title = {Bracing for a hit},
year = {2026},
version = {1.0.0},
license = {MIT},
url = {https://github.com/mitanshu-2004/brace-for-impact}
}