E1 · Workbench ready
10 minRun the setup block. If you already had ~/fth from course 0, confirm that nothing was reinstalled besides this course's clone.
Done when: cd ~/fth/mujoco_menagerie && git log -1 --format=%h → 62ab00f.
Lesson 1 · 15 min
Walking is just the start. To pick up a box, wave, or obey a VLA, the humanoid has to coordinate legs, torso, and arms at the same time, without falling. In this lesson you set up the course workbench and, in a simulation loop, count the three layers that make this happen: who decides, who coordinates the body, and who moves each joint.
Start the lesson
Goal: set up the bench and name the three layers of a full-body humanoid (VLA, S0 and motor PD) with the frequency of each.
Click each block.
The names S2/S1/S0 follow Figure's Helix 02 (01/27/2026): the VLA is S2 + S1, whole-body control is the S0. The VLA itself is the subject of the vla-v72 course.
Click each step.
Humanoid control was built from hand-written blocks: a step planner, the foot's trajectory in the air, the support leg, and balance via ZMP or MPC (model predictive control).
It works and it is interpretable, but every new skill needs new engineering. Lesson 6 of FTH course 0 showed the center of mass and the support polygon behind it.
The open path became: human motion capture or video → retargeting (GMR) → a motion tracking policy trained with PPO across thousands of simulations (BeyondMimic, GMT, SONIC) → sim2sim → robot.
One policy imitates any reference motion and serves as the base for teleoperation and for the VLA. Figure described the same thing in Helix 02: a 10M-parameter controller at 1 kHz, trained on more than 1.000 h of human motion, which replaced 109.504 lines of C++.
MPC × RL: the research for this course found no independent quantitative comparison in 2026. MPC remains strong where a guarantee is required; RL is the dominant practice in open repositories.
A widely used middle ground: RL on the legs (walking and balancing) and IK on the arms (reaching). This is the decoupled WBC from the GR00T-WholeBodyControl repository, used under GR00T N1.5 and N1.6.
This course's kit follows that split: legs in the model's "stand" pose, arms via IK.
If you took course 0, the venv and the Menagerie already exist, and only this course's clone is new. If you didn't, the same block creates everything. The Menagerie is pinned to the tested commit.
F=${FTH:-$HOME/fth}; mkdir -p $F && cd $F
[ -d .venv ] || python3.12 -m venv .venv
. .venv/bin/activate && pip install -q mujoco==3.16.0 numpy
[ -d corpo-inteiro ] || git clone -q --depth 1 https://github.com/inematds/formacao-fth-corpo-inteiro-v72 corpo-inteiro
[ -d mujoco_menagerie ] || git clone -q --filter=blob:none --sparse https://github.com/google-deepmind/mujoco_menagerie
cd mujoco_menagerie && git sparse-checkout add unitree_g1
git checkout -q 62ab00f && git log -1 --format='menagerie %h (%ad)' --date=short
python3 -c "import mujoco, numpy; print('mujoco', mujoco.__version__, '· numpy', numpy.__version__)"menagerie 62ab00f (2026-10-15) mujoco 3.16.0 · numpy 2.5.4
Two lines and no errors. A different MuJoCo version may change the last digit of the numbers in the next lessons: pin the version.
hierarquia.py runs the G1 standing for 2 s. Every 200 ms (task) it switches the right-hand target; every 20 ms (S0) it redoes the arm IK; every 2 ms it takes one physics step with the motors' PD.
F=${FTH:-$HOME/fth}; cd $F/corpo-inteiro && . $F/.venv/bin/activate
python3 kit/hierarquia.py; echo "saída: $?" if i % k2 == 0: # task (S2+S1 in a VLA): decides "what" (here, a script of targets)
alvo = alvos[n2 % len(alvos)]
n2 += 1
if i % k1 == 0: # S0: whole-body control, decides "how" the body gets theresimulado: 2 s · passo de física 2 ms tarefa (VLA: S2+S1) : 10 chamadas (5 Hz) S0 corpo inteiro (IK) : 100 chamadas (50 Hz) PD do motor + física : 1000 passos (500 Hz) mão direita a 0.7 cm do último alvo · pelve a 0.79 m · de pé: sim 3 camadas saída: 0
1000 PD steps for 100 S0 decisions and 10 task decisions. The hand ends less than 1 cm from the last target and the robot is still standing.
ERRO: S0 (30 Hz) e tarefa (5 Hz) precisam dividir o passo de 500 Hz. saída: 1
The bottom loop sets the clock: the upper layers run every N steps. 30 Hz does not fit into 500 Hz a whole number of times. Use divisors (50, 100, 250 Hz).
S0 corpo inteiro (IK) : 200 chamadas (100 Hz)
Twice as many body decisions in the same time. Helix 02 takes this to the extreme: the learned S0 runs at 1 kHz.
Workbench, loop and frequencies.
Run the setup block. If you already had ~/fth from course 0, confirm that nothing was reinstalled besides this course's clone.
Done when: cd ~/fth/mujoco_menagerie && git log -1 --format=%h → 62ab00f.
Run hierarquia.py and note how many times each layer was called.
Done when: python3 kit/hierarquia.py; echo "saída: $?" → 3 camadas and saída: 0, with 1000 passos in the motor PD.
Run with the S0 at 100 Hz and compare the hand's final distance to the target with the one at 50 Hz.
Done when: python3 kit/hierarquia.py --wbc-hz 100 | grep S0 → 200 chamadas (100 Hz).
The explanation appears after your answer.
Question 1 of 4
On a full-body humanoid, which layer runs fastest?skill
Question 2 of 4
What is the "decoupled WBC" in GR00T-WholeBodyControl?
Question 3 of 4
Why does hierarquia.py refuse the S0 at 30 Hz?
Question 4 of 4
What did Figure swap out in Helix 02, according to the course research?
Choose an option. The explanation appears after you try.