Skip to the lesson
FixTheRobot Home / VLA / Phase 10 / 10.4

VLA · Phase 10 · Humanoid VLA Systems

10.4 — VLA Policies for Humanoid Manipulation

What changes when a VLA drives arms and hands on a humanoid body.

  • Roadmap phase 10
  • Humanoid VLA Systems
  • About 12 minutes to read

A humanoid has more joints, a camera that moves and two arms that must agree. This lesson quantifies each with small computations and ties them to the models of phase 6 and the earlier lessons of phase 10.

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:

  • Estimate the action size and token count for a humanoid.
  • Explain why a head camera needs head pose in the observation.
  • Explain why bimanual errors compound.
  • Name the data challenges for humanoids.
  1. A head camera sees the scene (moving with the head)
  2. The VLA uses images, language and body state
  3. It outputs arm and hand actions, perhaps for the upper body only
  4. A separate controller keeps the body balanced
  5. Both hands must agree on shared targets
Humanoid manipulation.

The one-sentence idea

Same VLA ideas, more joints and more ways to be inconsistent.

Include head and body pose; budget for two-arm error.

What changes on a humanoid

Everything in phases 1 to 9 applies to a humanoid, but four things get harder: more degrees of freedom (two arms, two hands, a torso, a neck, and legs), two arms that must cooperate, a camera on a moving head, and a body that can fall over. GR00T N1 was deployed on the Fourier GR-1 humanoid for language-conditioned bimanual manipulation tasks,[1] Helix's System 1 is stated to output continuous robot actions at 200 Hz,[2] and RDT-1B targets bimanual manipulation with an action layout that preserves each joint's physical meaning.[3] This lesson looks at the manipulation side; balance is the subject of lessons 10.5 and 10.6.

More degrees of freedom, more numbers

Degrees of freedom depend on the configuration. For the Unitree G1, listings give a base configuration of 23 DoF (two 6-DoF legs, two 5-DoF arms and a 1-DoF waist), with 43 DoF when fitted with dexterous hands, and other variants in between; the count for a given unit must be checked against its configuration.[4] What a larger action vector costs a model:

configs = {"two arms only (2 x 7)": 14, "G1 base, 23 DoF": 23, "G1 with hands, 43 DoF": 43}
chunk_steps = 30
for name, dims in configs.items():
    tokens = dims * chunk_steps
    print(f"{name:<24} {dims:>2} numbers per step -> {tokens:>4} numbers (= tokens, one per number) for a {chunk_steps}-step chunk")

Output:

two arms only (2 x 7)    14 numbers per step ->  420 numbers (= tokens, one per number) for a 30-step chunk
G1 base, 23 DoF          23 numbers per step ->  690 numbers (= tokens, one per number) for a 30-step chunk
G1 with hands, 43 DoF    43 numbers per step -> 1290 numbers (= tokens, one per number) for a 30-step chunk

Toy model. The 14 is an assumed two-arm layout, and not every DoF of a humanoid is commanded by the policy: lower-body joints are often handled by a separate controller (lesson 10.5).

Hands add the most. Hand motion is also smooth and high-frequency, which is the case where per-number binning performs poorly according to the FAST paper (lesson 4.8),[5] one reason continuous or compressed outputs are common on humanoids.

A fixed table camera sees the same object at the same pixel every time. A head camera does not: turning the head by 1 degree shifts the image by roughly f·tan(1°) pixels, and the same object appears elsewhere. If the policy does not know the head angle, it cannot tell “the object moved” from “the head moved”:

import numpy as np

f = 600.0                                                       # focal length in pixels
for degrees in (1, 5, 15):
    shift = f * np.tan(np.radians(degrees))
    print(f"head turned {degrees:>2} deg -> an object straight ahead moves by about {shift:5.1f} pixels in the image")

Output:

head turned  1 deg -> an object straight ahead moves by about  10.5 pixels in the image
head turned  5 deg -> an object straight ahead moves by about  52.5 pixels in the image
head turned 15 deg -> an object straight ahead moves by about 160.8 pixels in the image

Two remedies: give the policy the head (and torso) pose as part of the state, so it can account for it, or control the head with a separate behaviour that keeps the workspace in view. Either way, the observation definition must say where the camera is and how it can move (lesson 9.3).

Two arms must agree

In a handover or a two-handed lift, both hands must hit the same place. If each arm independently has a position error of about 1 cm, the gap between the hands is larger than either error alone, because the errors add (in variance):

import numpy as np
rng = np.random.default_rng(0)

error_per_arm = 0.01                                           # 1 cm standard deviation per axis, per arm
left = rng.normal(0, error_per_arm, (100000, 3))
right = rng.normal(0, error_per_arm, (100000, 3))

gap = np.linalg.norm(left - right, axis=1)
print("typical error of one arm (RMS distance):", round(float(np.sqrt(np.mean(np.sum(left**2, axis=1)))) * 100, 2), "cm")
print("typical gap between the two hands (RMS):", round(float(np.sqrt(np.mean(gap**2))) * 100, 2), "cm")
print("ratio:", round(float(np.sqrt(np.mean(gap**2)) / np.sqrt(np.mean(np.sum(left**2, axis=1)))), 2), "(about the square root of 2)")

Output:

typical error of one arm (RMS distance): 1.73 cm
typical gap between the two hands (RMS): 2.46 cm
ratio: 1.42 (about the square root of 2)

The gap is about 1.4 times a single arm's error. Tasks where the hands must meet or jointly hold something are less forgiving than single-arm tasks, which is one reason bimanual data is scarce and models target it specifically; RDT-1B was fine-tuned on a self-created bimanual dataset of over 6K episodes.[3]

Humanoid data

Collecting humanoid demonstrations means teleoperating many joints at once, often with a motion-capture or VR rig, and the human's body does not match the robot's. That is one reason heterogeneous sources like human videos and synthetic data are used alongside robot data.[1] It also means that the action definition (lesson 4.1) and the retargeting from human to robot motion must be documented with the data.

Common misconceptions

Misconception 1 “A humanoid VLA outputs all joints.”

Correction Often only the upper body; the legs are handled by a separate controller.

Misconception 2 “A head camera is just a camera.”

Correction It moves; the policy must know how.

Misconception 3 “Two arms are twice as easy to coordinate.”

Correction Their errors add.

Engineering takeaways

  1. 43 DoF with hands on G1.
  2. Hands need continuous or compressed outputs.
  3. Give head pose to the policy.
  4. Two-arm gaps are ~1.4× single errors.

More body, more things to keep consistent.

Knowledge check

Try each question first, then reveal the explanation.

Question 1

A 40-number action and 25-step chunk: numbers per chunk?

Explanation

1,000.

Question 2

Why does turning the head shift the image?

Explanation

The camera moves with it, so a fixed object appears at a new pixel.

Question 3

Each arm has 2 cm RMS error. Typical gap between hands?

Explanation

About 2.8 cm.

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.

  1. NVIDIA (Bjorck, J., et al.) (2025). GR00T N1: An open foundation model for generalist humanoid robots. arXiv. arXiv:2503.14734

    Cited for:

    • Trained on a heterogeneous mix of real-robot trajectories, human videos and synthetically generated datasets; evaluated on simulation benchmarks across several robot embodiments and deployed on the Fourier GR-1 humanoid for language-conditioned bimanual manipulation; the GR00T-N1-2B checkpoint, training data and simulation benchmarks are public. Checked against the paper’s abstract.
  2. Figure AI (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.
  3. Liu, S., et al. (2025). RDT-1B: a diffusion foundation model for bimanual manipulation. ICLR 2025 / arXiv. arXiv:2410.07864

    Cited for:

    • Introduces a physically interpretable unified action space that represents different robots’ actions in one format while preserving the physical meaning of each original action, to help transfer physical knowledge across robots. Checked against the paper’s abstract.
    • Fine-tuned on a self-created multi-task bimanual dataset of over 6K episodes; reports zero-shot generalisation to unseen objects and scenes, language instruction following and learning new skills from about 1 to 5 demonstrations. Checked against the paper’s abstract.
  4. Unitree Robotics and distributors (n.d.). Unitree G1 humanoid: specifications and software interfaces. www.unitree.com

    Cited for:

    • The number of degrees of freedom depends on the configuration: a base configuration with 23 DoF is listed (two 6-DoF legs, two 5-DoF arms and a 1-DoF waist), higher configurations are listed at 29, 41 or 43 DoF (with dexterous hands), and the count for a given unit should be confirmed against its configuration. Checked against the publication record.
  5. Pertsch, K., Stachowicz, K., et al. (2025). FAST: Efficient action tokenization for vision-language-action models. RSS 2025 / arXiv. arXiv:2501.09747

    Cited for:

    • Per-dimension, per-timestep binning schemes typically perform poorly when learning dexterous skills from high-frequency robot data. Checked against the paper’s abstract.

What’s next

Next: how learned policies combine with whole-body control.

Next lesson

10.5 — Learned policies and whole-body control

How learned policies combine with controllers that coordinate the whole body.

Back to the VLA roadmap