FTH 3 · Whole body|INEMA.CLUB-PRO

Lesson 7 · 15 min

When a VLA drives the whole body

A VLA sees the scene, understands the request, and proposes an action a few times per second. Turning that into safe movement of 29 joints, without falling, is the job of whole-body control. In this lesson you send high-level commands to the simulated G1 and see what it carries out and what it refuses before moving.

Start the lesson
Humanoid robot with a dark visor carefully placing a mug on a countertop, with a blurred monitor in the foreground.

In this lesson you will

  1. 1What the VLA hands down: targets, tokens or actions
  2. 2Decoupled WBC: legs by RL, arms by IK
  3. 3The lower layer checks before it executes
  4. 4The end-to-end VLA flow on the G1 (GR00T N1.7 + SONIC)

Goal: send high-level commands to a simulated whole-body controller and see which ones it executes and which it refuses.

01From request to movement

Click each block.

Click each block of the diagram to see what it does.

The VLA proposes; whole-body control checks and executes. Safety cannot depend only on the model above.

02How this is built in 2026

Click each case. Facts with sources; VLA details in vla-v72.

1. Figure

Three layers: slow S2, S1 emitting joint targets at 200 Hz, and a learned S0 at 1 kHz, which replaced 109,504 lines of C++ (01/27/2026).

S0 was trained with more than 1,000 h of retargeted human motion and sim-to-real RL: lessons 2 to 4 of this course at industrial scale.

03Four high-level commands

The commands file plays the role of a VLA's output. comando_wbc.py checks each one, executes it in 1 s (ramp + closed-loop correction at 50 Hz), and says whether the hand arrived.

Terminal · run commands
F=${FTH:-$HOME/fth}; cd $F/corpo-inteiro && . $F/.venv/bin/activate
python3 kit/comando_wbc.py; echo "saída: $?"
File · kit/comandos.json
{
  "descricao": "Saída de alto nível, como a de um VLA a poucos Hz: o QUÊ fazer. Alvos da mão em metros, relativos à pelve (x para a frente, y para a esquerda, z para cima).",
  "comandos": [
    {"acao": "alcancar", "mao": "direita", "alvo_m": [0.30, -0.20, 0.15]},
    {"acao": "girar_tronco", "graus": 20},
    {"acao": "alcancar", "mao": "esquerda", "alvo_m": [0.30, 0.25, 0.20]},
    {"acao": "voltar"}
  ]
}
Example from the repository
comando 1 · alcancar direita (0.3, -0.2, 0.15) → executado: sim (mão a 1.1 cm do alvo)
comando 2 · girar_tronco 20° → executado: sim
comando 3 · alcancar esquerda (0.3, 0.25, 0.2) → executado: sim (mão a 1.0 cm do alvo)
comando 4 · voltar → executado: sim
robô de pé: sim · pelve a 0.79 m
executado: sim
saída: 0

Four commands, four executions, hand about 1 cm from each target, and the robot standing at the end.

04Practice

Run, refuse, write your own.

E1 · Kit commands

5 min

Run the four kit commands.

Done when: python3 kit/comando_wbc.py; echo "saída: $?" → executado: sim and saída: 0.

E2 · Bad commands

5 min

Run the bad commands file and read the reason for each refusal.

Done when: python3 kit/comando_wbc.py --comandos kit/comandos-ruins.json | tail -1 → executado: não · 3 comando(s) recusado(s).

E3 · Your sequence

10 min

Write ~/fth/movimentos/meus-comandos.json with five commands (both hands, a torso turn, and return) and run it. If any is refused, the reason gives the distance to the shoulder: the arm reaches 0.38 m to the wrist.

Done when: python3 kit/comando_wbc.py --comandos ~/fth/movimentos/meus-comandos.json | tail -1 → executado: sim.

05Lesson quiz

The explanation appears after your answer.

Question 1 of 3

The VLA says to reach a point 92 cm from the shoulder. What should the lower layer do?skill

06In three sentences

The what × the howThe VLA says the what; whole-body control decides the how.
ContractThe interface (targets, tokens) is what connects one to the other.
CheckThe lower layer refuses what can't be done, before moving.

Going further

Previous lessonNext lesson