E1 · A push that knocks it over
3 minRun the 40 N block and describe the motion by reading the CoP and pelvis columns.
Done when: python3 kit/equilibrio.py --empurrao 40 ends with CoM dentro do apoio: não · saiu em t = 0.73 s and queda: sim.
Lesson 6 · 15 min
A standing humanoid is an inverted pendulum on two small feet. In this lesson you calculate the G1's center of mass, support polygon, and center of pressure from the model itself, push the robot with different forces, and separate three things that usually get mixed up: leaving the support, swaying, and falling.
Start the lesson
Goal: push the G1 and say, from the simulation, when the center of mass leaves the support polygon and whether the robot falls.
Click each block.
Standing still, it is enough for the CoM to be inside the support. In motion, the CoP and the speed are what matter.
A 0.2 s forward push on the torso, with the G1 just holding the pose. Click each band.
The CoM never leaves the polygon: the margin never goes negative at any moment.
That is what any rigid pose can handle: the impulse is small (3 N·s).
The robot rises onto its toes, the polygon becomes a line, and the CoM is outside it for a moment. Even so, it comes back and ends up standing.
Leaving the support is not falling: it is starting to rotate.
At 40 N the CoM leaves at t = 0.73 s; the robot sways forward, comes back, overshoots, and falls backward, without moving a foot.
A balance controller would take a step or move the hip and ankle. Here there is no controller: it is the limit of the body alone.
Classical controllers plan the ZMP to stay inside the support (centroidal models, MPC). Humanoid locomotion in research today is trained with RL in thousands of parallel simulations (course 1).
The training's research found, as of 10/2026, no independent comparison saying which one is better: the two coexist.
The equilibrio.py applies the force on the torso at t = 0.5 s and prints, every 0.25 s, the CoM margin (positive = inside the support), the CoP forward, and the pelvis height.
F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
python3 kit/equilibrio.py --empurrao 40F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
for n in 10 15 20 25 30 35 40; do
echo "$n N → $(python3 kit/equilibrio.py --empurrao $n | tail -2 | cut -d'(' -f1 | tr '\n' ' ')"
doneempurrão de 40 N por 0.2 s no tronco (t = 0.5 s) · impulso 8 N·s t (s) margem do CoM (cm) CoP x (cm) pelve z (m) 0.00 5.3 0.1 0.79 0.25 5.3 0.4 0.79 0.50 5.3 0.3 0.79 0.75 -8.1 12.0 0.79 1.00 -5.8 12.1 0.79 1.25 -8.1 12.2 0.79 1.50 -3.4 -4.8 0.79 1.75 -1.2 -4.8 0.79 2.00 -6.7 -4.8 0.79 2.25 -17.4 -4.7 0.76 2.50 -39.6 -4.5 0.64 2.75 -68.4 -8.4 0.15 3.00 -68.9 -11.4 0.06 CoM dentro do apoio: não · saiu em t = 0.73 s queda: sim (pelve a 0.06 m em t = 3 s)
The CoP goes to 12 cm (toes), then to -4.8 cm (heel); the pelvis only drops after 2.25 s, when the robot falls backward.
10 N → CoM dentro do apoio: sim queda: não 15 N → CoM dentro do apoio: sim queda: não 20 N → CoM dentro do apoio: não · saiu em t = 1.40 s queda: não 25 N → CoM dentro do apoio: não · saiu em t = 1.35 s queda: não 30 N → CoM dentro do apoio: não · saiu em t = 0.81 s queda: não 35 N → CoM dentro do apoio: não · saiu em t = 0.76 s queda: sim 40 N → CoM dentro do apoio: não · saiu em t = 0.73 s queda: sim
From 20 to 30 N the CoM leaves the support and the robot does not fall. Anyone who measures balance only by the CoM position gets it wrong from 20 to 30 N; you also need to look at the speed and what happens afterward.
Find the limit of the body without a controller.
Run the 40 N block and describe the motion by reading the CoP and pelvis columns.
Done when: python3 kit/equilibrio.py --empurrao 40 ends with CoM dentro do apoio: não · saiu em t = 0.73 s and queda: sim.
Repeat with 15 N.
Done when: python3 kit/equilibrio.py --empurrao 15 | tail -2 → CoM dentro do apoio: sim (o tempo todo) and queda: não.
Run 40 N for 0.1 s and 80 N for 0.1 s. Compare with 40 N for 0.2 s: what matters, the force or the product of force × time?
Done when: --empurrao 40 --duracao 0.1 ends with queda: não and --empurrao 80 --duracao 0.1 with queda: sim; you wrote down the three impulses (4, 8 and 8 N·s).
The explanation appears after you answer.
Question 1 of 3
With 25 N the CoM left the support polygon, but the robot ended up standing. How do you explain that?skill
Question 2 of 3
On flat ground, what is the ZMP in classical controllers?
Question 3 of 3
40 N for 0.1 s does not knock it over; 40 N for 0.2 s does. What does this teach?
Pick an option. The explanation shows up after you answer.