VLA · Phase 10 · Humanoid VLA Systems
10.5 — Learned Policies and Whole-Body Control
How learned policies combine with controllers that coordinate the whole body.
A humanoid must be held up by a controller much faster than the VLA. This lesson explains the layering, summarises learned controllers from the literature and shows balance, command modes and history-based adaptation in small code.
Claims about papers, models and textbooks carry numbered references, listed with what each one is cited for in the References. Code marked “Toy model” is our own illustration, not the cited system.
Learning objectives
After this lesson, you should be able to:
- Explain why the VLA is separate from whole-body control.
- Describe learned controllers trained in simulation and transferred to hardware.
- Simulate balance with and without feedback.
- Explain command modes and history-based adaptation.
- The VLA chooses targets (reach, grasp, walk)
- A command interface says which parts to track
- The whole-body controller runs at high rate
- It balances and tracks while respecting contacts
- Proprioception feeds back to both layers
The one-sentence idea
The VLA chooses; the whole-body controller keeps the robot standing while it does.
Balance cannot wait for a slow model.
The VLA does not hold the robot up
A tabletop arm stays where it is put. A humanoid does not: it balances on two feet and, if the control stops for a moment, it falls. So humanoid systems separate what to do (a VLA choosing reaching and grasping targets at a few to tens of Hz) from how to keep the whole body consistent (a whole-body controller running much faster, tracking the targets while keeping balance and respecting contacts). Figure's Helix, for example, is described with a fast System 1 producing continuous actions at 200 Hz.[1] The whole-body controller can be classical optimisation-based control, or learned. This lesson is about the learned kind and how it fits under a VLA.
Learned whole-body and locomotion controllers
Two research results show the pattern. Hwangbo et al. trained a neural-network controller in simulation by reinforcement learning and transferred it to the ANYmal quadruped, where it followed commanded velocities more precisely, ran faster than earlier methods and recovered from falls. They note that RL had mostly stayed in simulation because training on hardware is costly and slow.[2] For humanoids, Radosavovic et al. built a fully learned walking controller: a transformer that reads the robot's recent proprioceptive observations and actions and predicts the next action, trained with large-scale model-free reinforcement learning in randomised simulated environments and deployed on the real Digit robot without further tuning. It handled various outdoor terrains and external disturbances.[3]
HOVER takes a different angle on the interface. Humanoid control needs different command modes (root velocity for navigation, upper-body joint angles for tabletop work); instead of one policy per mode, it uses full-body kinematic motion imitation as a shared abstraction and distils the modes into a single policy, reported to outperform specialised controllers.[4]
Why balance needs a fast loop
A standing humanoid behaves like an inverted pendulum: lean a little and gravity makes you lean more. The simplest model is θ″ = (g/ℓ)·θ + torque + disturbance. Without control, any lean grows exponentially. A reaching arm shifts the centre of mass, which is a disturbance on the body. A fast PD balance controller counters it:
import numpy as np
g, length, dt = 9.81, 1.0, 0.002
def simulate(kp, kd, disturbance, seconds=3.0):
theta, omega = 0.0, 0.0
for k in range(int(seconds / dt)):
t = k * dt
push = disturbance if 0.5 <= t < 0.7 else 0.0 # the arm swings out for 0.2 s
torque = -kp * theta - kd * omega # the balance controller
alpha = (g / length) * theta + torque + push
omega += alpha * dt; theta += omega * dt
if abs(theta) > 0.5: return "FELL at t = %.2f s" % t
return "upright, final lean %.4f rad" % theta
print("no balance controller: ", simulate(0, 0, 1.0))
print("balance controller (PD): ", simulate(40, 8, 1.0))Output:
no balance controller: FELL at t = 1.47 s balance controller (PD): upright, final lean 0.0000 rad
Toy model. A linearised single inverted pendulum. A real humanoid has many joints and contact forces; this shows only why a fast feedback loop is needed.
With no control the robot has fallen by 1.47 s, about a second after the arm swings out; with a PD loop it recovers and ends upright. This is the job of the lower layer, and it needs to run at a high, fixed rate regardless of how slowly the policy thinks.
Command spaces: what the policy asks the body for
The VLA must say what it wants in a form the whole-body controller accepts. HOVER's point is that there are several such forms and they overlap. A small illustration of selecting which parts of a target are tracked in each mode:
parts = ["root velocity", "upper-body joints", "lower-body joints", "hand positions"]
modes = {
"navigation": {"root velocity"},
"tabletop": {"upper-body joints", "hand positions"},
"loco-manipulation": {"root velocity", "hand positions"},
"full-body imitation": set(parts),
}
print(f"{'mode':<20}" + "".join(f"{p:<20}" for p in parts))
for name, tracked in modes.items():
print(f"{name:<20}" + "".join(f"{('tracked' if p in tracked else '-'):<20}" for p in parts))Output:
mode root velocity upper-body joints lower-body joints hand positions navigation tracked - - - tabletop - tracked - tracked loco-manipulation tracked - - tracked full-body imitation tracked tracked tracked tracked
Toy model. A hand-made table of modes for illustration, loosely following the examples in the HOVER abstract; the paper defines its own modes.
The mask idea is the same as in RDT-1B's action layout (lesson 6.5): one interface, with a mask for what each command carries.
Learning from history instead of knowing the physics
Radosavovic's controller reads recent proprioceptive history, and the idea behind that is that history carries information about the environment (a slippery floor, a heavy load) that the network can use to adapt in context.[3] A toy: a hidden extra mass makes a joint respond more slowly than expected. A controller that estimates the response from the last few steps compensates; one that assumes nominal mass does not:
import numpy as np
rng = np.random.default_rng(0)
def run(estimate_from_history, mass, steps=60):
pos, vel, target = 0.0, 0.0, 1.0
history = []
gain = 1.0 # the controller's belief about 1 / mass
for t in range(steps):
cmd = 20.0 * (target - pos) - 6.0 * vel
if estimate_from_history and len(history) >= 5:
accels = np.array([a for a, c in history[-5:]]); cmds = np.array([c for a, c in history[-5:]])
gain = float(np.clip((cmds @ accels) / (cmds @ cmds + 1e-9), 0.2, 2.0)) # least-squares estimate of 1 / mass
u = cmd / gain # compensate for the believed response
accel = u / mass
history.append((accel, u))
vel += accel * 0.02; pos += vel * 0.02
return abs(target - pos)
for mass in (1.0, 3.0):
print(f"hidden mass {mass}: distance from the target after 1.2 s -> assumes nominal mass {run(False, mass):.3f} | estimates from history {run(True, mass):.3f}")Output:
hidden mass 1.0: distance from the target after 1.2 s -> assumes nominal mass 0.029 | estimates from history 0.029 hidden mass 3.0: distance from the target after 1.2 s -> assumes nominal mass 0.254 | estimates from history 0.035
With nominal mass both do the same; with a heavy load the history-based version adapts. A transformer reading a long history can learn this kind of in-context adaptation without being told the physics.
Common misconceptions
Misconception 1 “A VLA can balance a humanoid directly.”
Correction Balance needs a fast loop; the VLA sets goals above it.
Misconception 2 “Learned controllers need real-robot training.”
Correction The cited controllers were trained in simulation and transferred.
Misconception 3 “One command mode fits all tasks.”
Correction Navigation, tabletop and loco-manipulation track different things.
Engineering takeaways
- VLA above, whole-body controller below.
- Simulation-trained controllers transferred to hardware.
- Inverted pendulum needs feedback.
- History enables adaptation.
Choose slowly; balance quickly.
Knowledge check
Try each question first, then reveal the explanation.
Question 1
Why does a leaning inverted pendulum fall without control?
Explanation
Gravity increases the lean, which increases the gravity torque.
Question 2
Where were the cited learned controllers trained?
Explanation
In simulation, then transferred to the real robot.
Question 3
What does HOVER distil into one policy?
Explanation
Multiple control modes.
References
Numbered notes in the text, like [1], point here. Each entry says what it is cited for and how that was checked. Papers and books can be revised or misread, so follow the links before relying on a detail. Code marked “Toy model” is our own illustration of an idea, not the code of the cited system.
(2025). Helix: A vision-language-action model for generalist humanoid control. www.figure.ai
Cited for:
- A two-part design: System 2, an onboard internet-pretrained vision-language model running at 7–9 Hz for scene understanding and language comprehension, and System 1, a fast reactive visuomotor policy that turns System 2’s latent representations into continuous robot actions at 200 Hz; the two systems are trained end-to-end and exchange information through shared latent representations. Checked against the authors’ own blog post.
(2019). Learning agile and dynamic motor skills for legged robots. Science Robotics 4(26) / arXiv. arXiv:1901.08652 · doi:10.1126/scirobotics.aau5872
Cited for:
- Reinforcement learning has mostly stayed in simulation for legged robots because training on hardware is costly and slow; the authors train a neural-network controller in simulation and transfer it to the ANYmal quadruped, where it follows commanded velocities more precisely, runs faster than earlier methods and recovers from falls. Checked against the paper’s abstract.
(2024). Real-world humanoid locomotion with reinforcement learning. Science Robotics 9(89), eadi9579 / arXiv. arXiv:2303.03381 · doi:10.1126/scirobotics.adi9579
Cited for:
- A fully learned humanoid walking controller: a transformer that reads the robot’s recent proprioceptive observations and actions and predicts the next action, trained by large-scale model-free reinforcement learning in randomised simulated environments and deployed on the real Digit robot without further tuning; it handled various outdoor terrains and external disturbances. Checked against the paper’s abstract.
(2025). HOVER: Versatile neural whole-body controller for humanoid robots. ICRA 2025 / arXiv. arXiv:2410.21229
Cited for:
- Humanoid whole-body control needs different control modes (for example root velocity for navigation, upper-body joint angles for tabletop manipulation); HOVER uses full-body kinematic motion imitation as a shared abstraction and a multi-mode policy distillation framework to consolidate diverse control modes into one unified policy, which is reported to outperform specialised controllers. Checked against the paper’s abstract.
What’s next
Next: balance, contact constraints and embodiment-specific actions.