The Complete Beginner's Path

Understand Vision-Language-Action
Models

How foundation models learned to move robots — translating pixels and instructions into physical actions in the real world.

Prerequisites: Basic ML intuition + Curiosity about robotics. That's it.
10
Chapters
8+
Interactive Illustrations
0
Robotics Background Needed

Chapter 0: From Seeing to Acting

Vision-Language Models (VLMs) can look at an image and answer questions. But what if instead of answering with words, the model answered with motor commands? That's the leap from VLM to VLA (Vision-Language-Action): a model that sees the world, understands a language instruction, and outputs physical actions.

The insight is deceptively simple: if a VLM can generate the token sequence "pick up the red cup," why can't it instead generate the action sequence [move_to(0.3, 0.5, 0.2), close_gripper()]? In token-based VLAs, actions are another output modality encoded as symbols. Continuous-action designs instead predict or generate numerical controls.

The big idea: A VLA predicts robot actions conditioned on vision and language. RT-2 and original OpenVLA reuse a VLM to generate discrete action tokens; continuous-action VLAs add robotics-specific generators and inputs.

For a concrete toy ViT-B/16, an RGB image has shape [3, 224, 224]. Each patch is 16×16 pixels, so the grid is 14×14 = 196 positions, each encoded at width 768. A learned projector maps these features into the chosen language-model width d. The instruction tokenizer returns L integer IDs; an embedding lookup produces [L, d]. A policy conditions on both inputs and produces actions: for our single-arm Cartesian interface, six motion values plus a gripper value.

Camera
[3, 224, 224] RGB image
↓ Toy ViT-B/16 + projector
Visual tokens
196 patch features × 768 → d
+ concatenate
Text tokens
L token IDs → L embeddings × d
↓ Transformer backbone
Action output
[7] = 6-DoF pose + gripper
VLM vs VLA Pipeline

Schematic: a reused VLM backbone can be trained for different output tasks: text for VLMs, actions for VLAs.

The numbers: Our example interface is [Δx, Δy, Δz, Δroll, Δpitch, Δyaw, gripper]: seven values, or 28 bytes if serialized as float32. A seven-joint arm and this six-motion-plus-gripper interface are different descriptions. Quantizing seven values into 256 choices gives 2567 = 256 ≈ 7.2×1016 combinations, represented by seven bin indices. Other robots require different interfaces; an executable command also needs units, a reference frame and a controller.
Check: What is the key difference between a VLM and a VLA?
🔗 Pattern Recognition
Token-Based VLA: Reusing a VLM Decoder
This Lesson (VLA)
Input: [image, text] → Transformer → Output: bin-token IDs → 7 continuous controls
VLM Lesson
Input: [image, text] → Transformer → Output: text tokens [variable length] → VLM lesson

For token-based VLAs, a pretrained VLM can be fine-tuned to decode action symbols with next-token cross-entropy. Existing vocabulary tokens may be repurposed rather than extended. This is one useful design: π0 adds a continuous action expert, while RT-1 used EfficientNet, instruction-conditioned FiLM, TokenLearner and a transformer rather than a pretrained generative VLM.

Where else have you seen "same architecture, different output head"? Think about how masked language models become classifiers with a single linear layer swap.

Chapter 1: Behavioral Cloning

The simplest way to teach a robot: show it what to do. A human demonstrates the task (teleoperation), recording observations and actions. Then we train a neural network to predict the expert's action given the current observation. This is behavioral cloning (BC) — supervised learning for robotics.

θ* = argminθ Σt ||fθ(ot) − at||²   (deterministic regression example)

For a toy single-arm dataset, each episode contains observation/action pairs: an RGB image and [Δx, Δy, Δz, Δrx, Δry, Δrz, gripper]. A 10-second demonstration recorded at 10Hz gives 100 pairs. Behavioral cloning (BC) trains a policy to imitate demonstrations; deterministic regression can use MSE, token policies use categorical cross-entropy, and generative policies use other suitable objectives. Teleoperation is one way to collect that data.

When an imitation policy drifts, its next observation may be outside the demonstrated distribution. This distribution shift can compound errors. It is a failure mechanism, not proof that every small error inevitably causes failure; feedback and appropriate training coverage can support recovery.

Behavioral Cloning: Compounding Errors

The teal path is a constructed reference. The red path integrates injected random errors. This illustrates drift; it does not evaluate a trained BC policy.

Noise level1.5
Why it still matters: RT-1, RT-2 and OpenVLA learn policies from robot demonstration datasets. Demonstration collection and the imitation-learning objective are separate choices: BC does not require a particular controller, sampling rate or MSE loss.

Here is an independent no-error toy calculation: if each command has a 99% chance of being error-free, the probability of no errors in 100 commands is 0.99100 ≈ 36.6%, and in 500 it is about 0.657%. This is not a measured task-success rate: errors can be correlated, some are harmless and feedback can recover. The practical BC problem is distribution shift: an action changes the next observation, and a policy may drift into states its demonstrations did not cover.

python
# Behavioral cloning training loop (simplified)
for obs, action in demonstration_dataset:
    # obs: [3, 224, 224] camera image
    # action: [7] expert's 6-DoF + gripper command
    optimizer.zero_grad()
    predicted = policy(obs)           # [7] predicted action
    loss = F.mse_loss(predicted, action)
    loss.backward()
    optimizer.step()
Check: What is the main failure mode of behavioral cloning?
⚔ Adversarial: What does deterministic MSE predict for two opposing labels at the same observation?
For the same observation and instruction, half your demonstrations command Δx=+0.02m and half command Δx=−0.02m. The deterministic MSE policy receives no extra information distinguishing the two strategies. What output minimizes this conditional loss?

Chapter 2: Action Representations

How do you represent "move the arm"? This choice is critical — it determines what the model predicts, how precise it can be, and whether it transfers across robots. There are two fundamental frames: joint space (the angles of each motor) and task space (the position and orientation of the end-effector in the world).

RepresentationFormatDimsProsCons
Joint angles (absolute)[θ1,...,θ7]7Matches a joint-target controllerDepends on joint conventions and controller
End-effector pose (absolute)[x, y, z, rx, ry, rz, grip]7Intuitive, more transferableNeeds compatible pose controller; IK may be required
Delta end-effector[Δx, Δy, Δz, Δrx, Δry, Δrz, grip]7Small values, relative motionErrors accumulate over time
Discrete bins (RT-2 style)Token index per dim8 fields in original RT-2Works with discrete-token decodersLoses precision between bins

A seven-joint arm has seven joint angles; a Cartesian six-motion-plus-gripper command is a different interface. Delta actions specify changes rather than absolute targets. For an illustrative command, Δx=0.01m,Δy=−0.005m,Δz=0.02m. Absolute joint targets are also useful: ACT's original bimanual setup predicts them. The choice depends on data and controller conventions.

Action Discretization

This widget uses equal-width bins reconstructed at their centers. Drag the slider to change the bin count; finer bins reduce the maximum in-range rounding error. The endpoint-level code lab below uses a distinct convention. The green dot shows the discretized position.

Bins per dim16
Token-based recipe: Discretize continuous action dimensions, then map choices to existing vocabulary IDs. RT-2 uses integer tokens for PaLI-X and repurposed infrequent tokens for PaLM-E. Training and valid-action decoding rules are part of the interface.
python
# Toy endpoint quantizer (not an exact RT-2/OpenVLA tokenizer)
action_range = [-1.0, 1.0]          # normalized action space
n_bins = 256

def discretize(a):
    # Continuous [-1, 1] → bin index [0, 255]
    return int(round(max(0.0, min(1.0, (a + 1) / 2)) * (n_bins - 1)))

def undiscretize(bin_idx):
    # Bin index [0, 255] → continuous [-1, 1]
    return bin_idx / (n_bins - 1) * 2 - 1

# Example: dx=0.3 → level 166 → teaching symbol "166"
Precision check: Our teaching quantizer uses B endpoint levels, including both ends of the interval. Spacing is (high−low)/(B−1); rounding has maximum error half that spacing for in-range inputs. For a one-metre interval and B=256, spacing is 3.922mm and maximum error is 1.961mm. With 256 equal-width bins reconstructed at centers instead, the values are 3.906mm and 1.953mm. Physical error depends on the action interval, not the arm's reach. Continuous heads avoid a fixed bin grid but retain numerical, policy and controller limitations.
Check: Why do VLA models often discretize continuous actions?
🔨DerivationQuantization: Resolution and Conditional Predictions▶✓ ATTEMPTED

Our toy quantizer rounds to B=256 endpoint levels on [−0.5m, 0.5m]. Derive its spacing and maximum reconstruction error. Then compare a deterministic MSE prediction with a categorical distribution when equally likely target deltas are −0.2m and +0.2m.

B endpoint levels create B−1 intervals. Divide the one-metre span by 255; the furthest in-range input is half an interval from a nearest level.
The deterministic squared-error optimum is the conditional mean. A categorical distribution can instead allocate probability to two separated quantized values.

Spacing = 1/255m = 3.922mm; maximum rounding error = 1/510m = 1.961mm. This excludes out-of-range inputs that are clipped. With 256 equal-width center-reconstructed bins, the bounds would instead use 1/256 and 1/512m.

For the two equally likely deltas, deterministic MSE minimizes 0.5(&hat;a+0.2)2 + 0.5(&hat;a−0.2)2 at &hat;a=0. A categorical policy can place mass on the two quantized modes and sample one. That is a representation advantage over a single conditional-mean output, not a guarantee of successful execution.

Autoregressive action tokens can condition later dimensions on earlier ones. A continuous vector head can also couple dimensions, and generative continuous models can represent multiple modes. Token generation reuses LM machinery but requires an action encoding, training and decoding rules; the best interface depends on task and controller precision.

💻 Build It Implement Action Tokenization & Detokenization ▶ ✓ ATTEMPTED
Implement the toy endpoint-level quantizer used in the preceding lab: normalize each continuous value to [0,1], clip, round to one of B levels, then reconstruct with the endpoint inverse. These level indices are teaching symbols, not actual LM vocabulary IDs. Original RT-2 and OpenVLA use model-specific encodings; OpenVLA reconstructs bin centers.
signature def tokenize_action(action: list[float], action_low: list[float], action_high: list[float], n_bins: int = 256) -> list[int]: """Convert continuous action to bin indices. Args: action (7 floats), per-dim min/max, number of bins. Returns: list of 7 integers in [0, n_bins-1].""" def detokenize_action(tokens: list[int], action_low: list[float], action_high: list[float], n_bins: int = 256) -> list[float]: """Convert bin indices back to continuous action. Returns: list of 7 floats in original robot-specific ranges."""
Test case
action = [0.1, -0.05, 0.3, 0.0, 0.0, 0.0, 1.0] low = [-0.5, -0.5, -0.5, -3.14, -3.14, -3.14, 0.0] high = [0.5, 0.5, 0.5, 3.14, 3.14, 3.14, 1.0] tokens = tokenize_action(action, low, high) # Expected: [153, 115, 204, 128, 128, 128, 255] recovered = detokenize_action(tokens, low, high) # Expected: close to original (within bin resolution) for a, r, lo, hi in zip(action, recovered, low, high): assert abs(a-r) <= (hi-lo)/510 + 1e-9 # half-spacing in each dimension's units
Normalize with norm=(action−low)/(high−low), clip to [0,1], then use round(norm*(B−1)). The inverse is level/(B−1)*(high−low)+low. Require B≥2 and high>low; clipping is a numerical range rule, not a workspace-safety check.
python
def tokenize_action(action, action_low, action_high, n_bins=256):
    tokens = []
    for i in range(len(action)):
        # Normalize to [0, 1]
        norm = (action[i] - action_low[i]) / (action_high[i] - action_low[i])
        # Clamp to [0, 1] (numerical range clipping)
        norm = max(0.0, min(1.0, norm))
        # Map to bin index [0, n_bins-1]
        token = int(round(norm * (n_bins - 1)))
        tokens.append(token)
    return tokens

def detokenize_action(tokens, action_low, action_high, n_bins=256):
    actions = []
    for i in range(len(tokens)):
        # Bin index to [0, 1]
        norm = tokens[i] / (n_bins - 1)
        # Denormalize to robot-specific range
        val = norm * (action_high[i] - action_low[i]) + action_low[i]
        actions.append(val)
    return actions
Bonus challenge: Define a toy [k,7] trajectory encoding with time-major ordering (seven values at each timestep), then reconstruct it. State the chosen order explicitly. This is an extension exercise, not a claim that original RT-2 predicts action chunks.
Checkpoint — Before you move on
Explain in your own words: why does discretizing continuous actions into 256 bins enable the use of pre-trained language models for robot control? What specific property of LM training makes this work?
✓ Gate cleared
Model Answer

A next-token LM predicts a categorical distribution over vocabulary IDs. Mapping action choices onto discrete symbols lets a token-based policy reuse that decoder and cross-entropy objective. An autoregressive sequence can model dependencies between action dimensions. A categorical distribution can contain several quantized modes; a deterministic MSE output gives one conditional mean. This does not make discretization universally preferable: continuous generative action heads also model multimodality, with different precision and compute tradeoffs.

Chapter 3: RT-2 — Language as Action

RT-2 (Robotics Transformer 2) by Google DeepMind is the landmark paper that proved VLMs can directly control robots. The key insight: fine-tune a VLM so that instead of generating text, it generates action tokens.

RT-2 fine-tuned PaLI-X (5B/55B) and PaLM-E (12B). Its original action schema is [terminate, Δx, Δy, Δz, Δrx, Δry, Δrz, gripper]: eight fields, with continuous dimensions uniformly quantized into 256 bins. PaLI-X uses existing integer tokens; PaLM-E repurposes 256 infrequent vocabulary tokens. Robot-task decoding is constrained to valid action symbols. The stated schema includes termination even though the paper's displayed integer example omits a field.

Input
[Camera image] + "Pick up the bottle"
↓
VLM Backbone
PaLM-E (12B) or PaLI-X (5B/55B)
↓
Output
8 fields: termination + six motion values + gripper
RT-2 Action Tokenization

Illustrative original RT-2 schema: discrete termination plus seven control fields. Continuous values map to bin indices, then model-specific vocabulary IDs. This is not a learned action prediction.

Why this works: RT-2 reported improved generalization in its evaluated semantic tasks, including reasoning about objects and symbols. The robot still needs motor skills supplied by robot demonstrations; web pretraining alone does not teach an arbitrary new physical skill.

RT-2 co-fine-tunes on robot trajectories and the original vision-language data. This improved robot generalization compared with robot-only fine-tuning in its evaluations. Robot data contributes about 50% of the PaLI-X training mixture and 66% of the PaLM-E mixture. These are model-specific sampling choices, not a universal balance that guarantees preserved language ability.

Emergent capabilities: RT-2 deployed learned manipulation skills under novel semantic instructions, including placing objects near numbers or icons absent from the robot demonstrations. Chain-of-thought prompting also helped select an improvised hammer, such as a rock. Semantic recombination does not supply arbitrary new physical skills; those remain limited by robot training and execution.
Check: How does RT-2 represent robot actions?
🔨DerivationLoss Reduction: Sum or Mean?▶✓ ATTEMPTED

Consider a teaching example with text-output token losses [0.2,0.4,0.6,0.8] and action-output losses [0.3,0.7]. Compute each sample's loss using a token sum, then a token mean. Does either calculation establish the ratio of gradient magnitudes?

A sum adds all supervised token losses; a mean divides that sum by the number of supervised tokens.
The derivative depends on predicted probabilities, targets and the model Jacobian. Token count alone does not tell you how parameter gradients align or cancel.

Text sum=2.0 and action sum=1.0: a 2:1 ratio of scalar loss contributions. Text mean=2/4=0.5 and action mean=1/2=0.5: equal scalar contributions. Neither gives a gradient-norm ratio.

Input/instruction tokens may be excluded from the supervised output loss; this chooses what is predicted, not how gradient lengths are balanced. Sampling ratios and sum/mean reductions both influence optimization. State both when implementing a mixed-task objective; do not infer a universal ratio from response lengths.

RT-2's approximately 50% or 66% robot sampling fractions are reported empirical training choices. They are not a derivation that text and action gradients have equal magnitude. Original OpenVLA evaluates cross-entropy on action output tokens during robot training.

Chapter 4: Diffusion Policies

What if instead of predicting a single action, the robot could sample from a distribution over actions? Diffusion Policy applies the same denoising process used in image generation to robot action prediction.

Starting from random noise, the model iteratively refines an action trajectory. This naturally handles multimodal action distributions — when there are multiple valid ways to do something (reach from the left or right), the diffusion model can represent all of them.

a0 ~ N(0, I)  →  a1 → ... → aT = denoised action

A trajectory generator can start from noise of shape [H, action_dim]. Diffusion Policy learns conditional noise/score predictions and uses a diffusion scheduler to generate an action sequence; its prediction, execution and denoising horizons depend on the task. Published settings include H=16, executing 8 commands before replanning, with 100 evaluation sampling steps. This is distinct from the flow-matching Euler example below.

Flow matching: Original π0 predicts 50-action chunks using 10 Euler integration steps. Training interpolates between noise and demonstrated actions, and teaches an observation-conditioned vector field. A linear training interpolation does not guarantee straight learned sample paths. In its three-camera RTX4090 timing, image encoding took 14ms, observation processing 32ms, and all ten action passes 27ms: 73ms onboard total. Step count alone does not establish a speedup over another policy.
python
# Toy noise-to-data flow inference; model/observation encoding not implemented here
a = torch.randn(k, action_dim)     # [50, 7] random noise
for i in range(10):
    t = i / 10.0                     # left endpoint: 0.0,...,0.9
    v = model(a, t, obs, instruction)  # predict velocity
    a = a + v * (1.0 / 10)          # Euler step; timing depends on implementation
# a is a generated [50, 7] toy action chunk; execution can still fail
Schematic Noise-to-Trajectory Interpolation

This constructed illustration interpolates a noisy curve toward a known target. It runs no learned diffusion network or scheduler; animation progress is not a denoising-step count.

Why not just a conditional mean? With equally likely left and right trajectories at the same observation, deterministic MSE predicts their mean, which may intersect an obstacle. Conditional diffusion or flow models can represent multiple modes and sample a trajectory rather than return that mean. This improves expressive capacity, not a guarantee that every generated trajectory is valid or physically feasible.
Check: What can a generative Diffusion Policy represent that a single deterministic MSE output cannot?
🔗 Pattern Recognition
Action Representations and Training Objectives
Discrete Tokenization (RT-2)
Actions as categorical tokens. Cross-entropy loss. Autoregressive generation. Multiple modes via conditional categorical distributions.
Flow-Matching VLA (π0)
Actions as continuous vectors. Flow matching loss. Iterative denoising. Multimodal via sampling. → Diffusion lesson

Both categorical and continuous generative policies can model multiple modes. Tokenization reuses a discrete LM decoder; diffusion and flow matching add continuous generation machinery. Their numerical outputs still have finite precision. RL fine-tuning optimizes a reward objective and can complement demonstration pretraining; it is a training choice, not a third action representation.

The same "discrete vs continuous" tradeoff appears in image generation (VQ-VAE tokens vs diffusion pixels). What changes when choosing a discrete decoder versus a continuous generator for actions?

Chapter 5: Action Chunking

A single-step policy chooses one next command. Action chunking predicts H future actions jointly, helping model temporal dependencies and potentially reducing planning overhead. ACT (Action Chunking with Transformers) uses this idea for imitation learning; chunking is also used by diffusion and flow policies. Neither single-step control nor chunking guarantees a particular smoothness.

The output has shape [H, action_dim]. In a toy 50Hz controller, H=50 represents one second of planned commands. The system may execute E≤H commands before re-observing: E=10 means 0.2 seconds between policy updates. Prediction horizon H, execution window E, policy-update rate and low-level servo rate are different quantities.

Why chunk instead of predicting one step at a time? Two big reasons:

Temporal dependencies: Joint prediction can capture a coordinated action sequence, including pauses or a consistent strategy. Learned errors and execution disturbances can still cause rough motion.
Compute amortization: With H=50, E=10 and a 50Hz command stream, one policy update supplies the next 0.2 seconds of commands. Compute must finish before the buffer runs out; a faster command stream does not imply equally fast visual feedback.
Single-Step vs Chunked Actions

Constructed comparison: the red path receives larger injected noise, while the green path interpolates target endpoints with smaller noise. Change H to inspect piecewise planning; this is not a measured policy comparison.

Chunk size H8
Temporal ensembling: Original ACT queries the policy every timestep, creating overlapping action chunks. It averages predictions for the same execution timestep, not neighboring commands. With predictions ordered oldest to newest, wi=exp(−m i) gives older predictions greater weight. Smaller m incorporates new observations faster. This adds inference work; it is not the same schedule as executing a whole chunk open-loop.
python
# Toy aggregation of predictions for the SAME execution timestep
predictions = np.stack([old_plan[t_old], new_plan[t_new]])  # oldest first
weights = np.exp(-0.01 * np.arange(len(predictions)))
weights = weights / weights.sum()
a_blend = weights @ predictions
robot.execute(a_blend)  # units/interface defined by controller

The execution window E determines how long new visual evidence waits before the next policy update. At 50Hz, E=10 spans 0.2 seconds. In a separate configuration with H≥200, E=200 spans 4 seconds. H can be larger than E; receding-horizon control discards or revises unused predictions. Longer windows may amortize compute but reduce reactivity, and open-loop dynamics can still amplify error. Choose horizons by task dynamics and measured latency.

Check: What does action chunking predict?
🔨DerivationCount Commands, Planning Calls and Observation Windows▶✓ ATTEMPTED

A toy task needs 100 commands at 50Hz. Each planning call predicts H=50 actions, and E=10 are executed before a new observation. How many planning calls are required, how long is each execution window, and how many predictions from each call are not executed?

Planning calls=ceil(T/E); window duration=E/rate. H determines predicted length; E determines how much is consumed before replanning.

100/10=10 planning calls. Each execution window lasts 10/50=0.2 seconds. Each call consumes 10 of its 50 predictions and leaves 40 unused; the task lasts 100/50=2 seconds under this schedule.

These counts do not prove an error reduction. Action errors can propagate through robot dynamics within a window; feedback can correct disturbances, while unfamiliar observations can challenge a learned policy. Compare error empirically or state a dynamical model before deriving bounds.

💥 Break-It Lab What Dies When You Remove VLA Components? ▶ ✓ ATTEMPTED
This constructed toy illustrates possible effects of removing temporal planning, joint-state input or task instructions. The toggles explicitly inject error patterns; they do not run learned-policy ablations. These inputs/designs vary across VLAs: original OpenVLA uses a single image and instruction without proprioception or action chunking.
Remove Action Chunking ACTIVE
Constructed effect: This toy adds larger command jitter when chunking is disabled. A real single-step policy can be smooth; jointly predicted sequences can also be inaccurate. Chunking helps model temporal dependencies, but its effect requires an actual policy comparison.
Remove Proprioception Input ACTIVE
Possible ambiguity: Joint-state input can disambiguate an occluded arm configuration. Removing it may harm precision in some designs; an image-only policy can still control a robot when vision and training provide sufficient information. The toy exaggerates an overshoot pattern to make that role visible.
Remove Language Conditioning ACTIVE
Task ambiguity: If the same scene supports several tasks, removing the instruction removes one selection signal. The learned response need not be uniform or an average reach: it depends on other context, objectives and data. This toy constructs a generic reach to illustrate missing task information.
Checkpoint — Before you move on
You're designing a VLA for a task that involves both fast reactive motions (catching a thrown object) and slow precise motions (threading a needle). How would you handle action chunking? Can you use a single fixed chunk size, or do you need something more sophisticated?
✓ Gate cleared
Model Answer

Choose the execution window E by the required feedback latency, measured inference time and controller dynamics; no universal chunk size follows from the task names. You can keep prediction horizon H fixed and vary E≤H, or use a suitable faster controller for a reactive phase. At 50Hz, E=1 spans 20ms and E=10 spans 200ms, before additional sensing/inference delays. Original ACT temporal ensembling queries every timestep and combines predictions for that timestep; it does not implicitly replan every 5–10 steps. Test the phase-specific schedule rather than assume larger chunks supply precision.

Chapter 6: OpenVLA Architecture

Original OpenVLA is a token-based VLA built on Prismatic: fused DINOv2 and SigLIP vision features, a projector and Llama 2-7B. It was trained on a curated 970k-trajectory manipulation mixture from Open X-Embodiment. Its single-step policy showed strong generalist manipulation results in the reported evaluations; it does not combine the diffusion and chunking mechanisms from the preceding chapters.

A 224×224 input is processed by two patch14 vision encoders. Their 16×16 grids give 256 spatial positions. DINOv2 and SigLIP features concatenate channel-wise, preserving 256 positions, then project to [256,4096]. The full instruction prompt produces L token IDs and [L,4096] embeddings. Llama 2 predicts one action's seven reused vocabulary IDs autoregressively; these are not raw bin indices. De-tokenization reconstructs normalized bin-center values, then dataset-specific quantile statistics restore controller units.

python
# Original OpenVLA usage sketch: model and processor already loaded
image = camera.capture_pil()
prompt = "In: What action should the robot take to pick up the cup?\nOut:"
inputs = processor(prompt, image, return_tensors="pt").to(device)
action = model.predict_action(**inputs, unnorm_key="bridge_orig", do_sample=False)
# [7] values in the selected dataset's controller units
robot.execute(action)
# Vision: two 256-position feature grids -> channel concat -> [256,4096]
# Text: L integer IDs -> embedding lookup -> [L,4096]
# Causal decoding -> 7 vocabulary IDs -> centers -> q01/q99 unnormalization
DINOv2 + SigLIP Encoders
224×224 → 256 fused feature positions
↓
Projection MLP
Align vision features to LLM space
↓
Llama 2 (7B)
[vision tokens] + "pick up the cup" → action tokens
↓
De-tokenize
Vocabulary IDs → bin centers → 7 controls
OpenVLA Token Flow

Trace the path from image + instruction to robot action. Each color represents a different processing stage.

Training data: Original OpenVLA curated 970k manipulation trajectories with a third-person camera and single-arm end-effector control. The original OXE collection spanned 22 embodiments; that collection count is not a claim that every embodiment entered OpenVLA's filtered mixture. Action statistics and compatible controller conventions matter when transferring.
The backbone problem: A pretrained vision-language representation may miss details needed for control. Robot training can adapt the backbone, or add an action generator with specialized parameters. The choices below describe different parameter/training designs; preservation and control quality are empirical questions.
StrategyHowProCon
Full fine-tuneUpdate all VLM weights on robot dataMaximum expressivityExpensive; possible forgetting
Frozen VLM + action headFreeze VLM, add small MLP for actionsCheap, preserves VLMLimited — VLM features may not capture motor-relevant info
Mixture-of-TransformersSeparate expert params for vision/language vs action tokensSeparate capacity for control; preservation is not automaticComplex architecture (π0's approach)

Original OpenVLA adapts its vision-language backbone during robot training. The paper separately studies LoRA, low-rank parameter updates, for efficient downstream adaptation. Original π0 instead adds a roughly 300M-parameter action expert to a PaliGemma VLM. Its transformer has two weight sets: image/language tokens use the VLM expert, while state/noisy-action tokens use the action expert. They interact through attention. Separate weights do not imply the pretrained expert is frozen.

python
# Original pi0 routing: two transformer experts, not three modality FFNs
token_route = {
    "image": "vlm", "text": "vlm",
    "state": "action", "noisy_action": "action",
}
# Each expert has its own transformer weights.
# Projected attention keys/queries/values allow their tokens to interact.
# This routing ledger is not a complete transformer implementation.
Check: What is OpenVLA's language model backbone?

Chapter 7: Cross-Embodiment

A human can watch someone else cook and learn the recipe, even though their arms are different lengths. Can robots do the same? Cross-embodiment learning trains on data from many different robot types, hoping that high-level task knowledge transfers even when the hardware differs.

The original Open X-Embodiment (OXE) collection assembled over one million trajectories from 22 embodiments, including single arms, bimanual robots and quadrupeds. The RT-X manipulation models used a compatible robot-data mixture and showed positive transfer across evaluated robots. A collection's full diversity and a particular model's training interface are different scopes.

Different robots expose different action spaces. For compatible single-arm manipulation datasets, a shared interface can use six end-effector motion values plus a gripper value, followed by the robot's task-space controller or IK. Matching vector length is not enough: coordinate frames, units, control modes and normalization must agree. Quadruped, hand and bimanual control require richer or different interfaces; proprioception can also matter.

Embodiments in a Dataset Collection

Schematic dataset collection: toggle embodiment categories. A trained model needs a compatible subset/interface; this does not show one seven-value policy controlling every category.

Positive transfer: RT-1-X improved performance over dataset-specific baselines in its evaluated small-data domains, and RT-2-X improved emergent-skill evaluations over RT-2. These scoped results support sharing experience across robots; they do not show that one policy beats every individual-robot model or that extra data always helps. Shared visual/task structure is a plausible explanation, not an isolated proof of regularization.
python
# Toy per-dataset action-range normalization (after frame/controller alignment)
def normalize_action(action, embodiment_config):
    # Different robots have different action ranges
    # Illustrative configured dx ranges: arm A [-0.05,0.05]m; arm B [-0.03,0.03]m
    low, high = embodiment_config['action_range']
    return (action - low) / (high - low) * 2 - 1  # map to [-1, 1]

# During training: normalize all actions to [-1, 1]
# During inference: denormalize back to robot-specific range
Check: What makes positive cross-embodiment transfer possible?
🏗 Design Challenge You're the Architect: Bimanual VLA for Kitchen Tasks ▶ ✓ ATTEMPTED
Design a hypothetical bimanual policy for “hold the jar and unscrew its lid.” Choose joint-space targets: two seven-joint arms plus two grippers, or 16 values. Inputs are two stereo camera pairs (four RGB images) and joint state. The command stream runs at 30Hz. Assume the complete policy inference, including any generation steps, takes 50ms on your chosen hardware.
Robot
2 × 7-DOF arms + 2 grippers = 16-dim action space
Control rate
30Hz (33ms per action)
Cameras
2 stereo pairs = 4 RGB images, 224×224 each
Language
Natural language commands, variable length
Latency budget
Assumed complete policy inference: 50ms
GPU
Single A100 (80GB) for inference
1. Action space: How do you tokenize 16 dimensions? Independent bins per dim (16 tokens × 256 bins)? Or group left/right arms separately?
2. Latency: The VLM takes 50ms but you need 30Hz (33ms). How do you reconcile this? (Hint: chunking isn't just for smoothness.)
3. Coordination: The two arms must coordinate (one holds the jar while the other unscrews). How do you ensure the action output captures bimanual dependencies?
4. With the toy ViT-B/16, four images produce 4×196=784 positions. Would a trained resampler help, and which spatial details might compression lose?

Worked hypothetical design: These interface and timing assumptions are chosen for this exercise, not a published ALOHA/π0 configuration.

1. Action space: Jointly predict [H,16] joint/gripper targets. H=50 at 30Hz plans 1.667 seconds. Alternatively, two Cartesian six-motion-plus-gripper commands would have 14 values; changing interfaces requires suitable training targets and controllers. A generative continuous head can model coordinated alternatives, while autoregressive tokens can condition dimensions on an action prefix.

2. Latency: Choose E=6: six commands at 30Hz cover 200ms. Under the stated 50ms complete-inference assumption, computing a new chunk within this window leaves 150ms for the rest of the schedule. Include sensing, scheduling and communication before declaring a viable buffer. The 30Hz command rate remains distinct from the 5Hz visual policy-update rate.

3. Coordination: A joint action generator can let either arm's prediction depend on both arms' context and target sequence. Bimanual demonstrations teach “hold while turning.” This coupling permits correlations; it does not guarantee successful coordination or contact mechanics.

4. Visual compression: A trained resampler could reduce 784 patch positions to a chosen query count, trading compute against information loss. Evaluate whether it preserves lid/hand alignment. Separate expert weights do not themselves reduce the number of attention positions or its quadratic term.

⚔ Adversarial: Your cross-embodiment VLA was trained on data from 20 robot types. When deployed on a new 6-DOF arm (not in training), it works for pick-and-place but fails catastrophically on insertion tasks (peg-in-hole). The action normalization is correct. What's the real issue?
In this example, logs show the new arm's limited wrist range prevents the orientation required by the predicted insertion commands. The IK/controller reports infeasible targets, and the executed orientation differs from the plan. Action unnormalization is verified correct. What explains the failed insertion?

Chapter 8: Sim-to-Real Transfer

Robot demonstrations require equipment, operators and useful task coverage. Under an illustrative ten-episodes-per-hour collection rate, 100k episodes cost 10,000 operator-hours; actual throughput depends on episode length and resets. Simulation can scale experiments, but usable demonstrations still require a task definition and a successful controller/policy. Visual differences, dynamics mismatch and sensor noise can all cause a reality gap.

The Reality Gap

Explore a schematic appearance randomizer. The slider sets variation strength; each refresh changes colors and object placement. No policy or real-world transfer score is computed.

Variation strength50%
TechniqueHowWhat it randomizes
Visual DRChange appearance every episodeTextures, colors, lighting direction, camera position (±5cm), shadows
Physics DRChange dynamics every episodeFriction (0.3-1.0), mass (±20%), motor delay (0-50ms), gravity (±2%)
System IDCalibrate sim to match realMeasured real-world physics parameters
Sim + Real co-trainMix sim and real data in trainingAdds real observations/actions; remaining gaps require evaluation
Foundation Model encoderUse VLM vision backboneProvides transferable features; visual adaptation may still be needed
Pretrained features: Internet-pretrained vision encoders can provide useful object/scene representations, but semantic recognition does not guarantee the metric detail or invariance required for control. SigLIP's WebLI source corpus is not a count of distinct pairs seen by every checkpoint, and neither establishes solved sim-to-real transfer. Measure visual and physical shifts for the chosen task.

A simulated cup may resemble a real cup while having different friction, geometry or camera calibration. Visual shifts can remain even with a pretrained encoder; OpenVLA found adapting vision features important for control. Domain randomization and system identification address selected mismatches, but neither guarantees coverage of the real deployment distribution.

A concrete experiment is to adapt a pretrained policy on task-specific real demonstrations, compare against a simulation-augmented variant, and evaluate both on held-out real scenes. Record the model, controller, data mix, hardware and success criterion. For context, OpenVLA reported downstream LoRA adaptation in 10–15 hours on one A100 for its experiments; this is not a universal under-one-day deployment recipe.

Check: What is domain randomization?

Chapter 9: The Embodied Future

VLA results span simple manipulation and more complex demonstrations, such as π0 laundry folding and table clearing. Reliable transfer, contact control and recovery remain active challenges. Distinguish a published model's measured result from a proposed engineering budget.

Hypothetical latency budget: Assume capture=5ms, preprocessing=2ms, backbone=50ms, continuous generation=20ms and controller handoff=5ms. The serial sum is 82ms, about 12.20 policy calls/s before other overhead. These are illustrative timings, not a production benchmark. H=50 predictions and E=10 executed commands at 50Hz give a 0.2-second execution window; a 50Hz command stream does not imply 50Hz reactive visual control.

Key open challenges:

ChallengeCurrent StateWhat's Needed
DexterityTask-dependent manipulation and some dexterous demonstrationsIn-hand manipulation, tool use
Long-horizonSingle-stage and some multistage demonstrationsMulti-step planning, error recovery
SafetyLab environmentsReal-world safety guarantees
Data scaleDataset/version dependentInternet-scale robot data
SpeedModel/hardware-dependent policy rateReactive control for dynamic tasks (100Hz+)
VLA Timeline

Key milestones in the journey of robot policy architectures. Dates mark the cited initial publications; spacing is schematic.

Camera capture
Assumed 5ms
↓
Image preprocess
Assumed 2ms (resize, normalize)
↓
VLM forward pass
Assumed 50ms backbone computation
↓
Action denoising
Assumed 20ms continuous generation
↓
Motor command
Assumed 5ms controller handoff
The scaling hypothesis: More useful and diverse robot experience may improve generalization, but data quality, model capacity and compatibility matter. DROID released 76k trajectories (350 hours), across 564 scenes and 86 tasks, collected through 13 institutions. Such datasets enable measured comparisons; they do not prove every expansion improves every policy.
From image and instruction to a controller command: inspect each interface, then test the resulting behavior.

You now understand the path from seeing to acting — the data flow from camera pixels to motor commands, the engineering choices of action representations and chunking, and the architectural decisions that connect pretrained models to compatible robot controllers. VLAs are teaching machines to reach out and touch the world.

Primary sources: RT-1 · RT-2 · OpenVLA and its action tokenizer · Diffusion Policy · π₀ · ACT and its temporal aggregation code · Open X-Embodiment · DROID. Model descriptions here refer to these original releases; constructed labs and assumed budgets are labeled separately.
Check: Which resource directly supplies diverse demonstrated robot behavior?