TL;DR: a tripod nudge can push the policy much further out of distribution than a completely new object layout. Fixing this likely requires multi-view training, viewpoint augmentation, or representations explicitly encouraged to factor viewpoint out.
Why a tripod nudge kills a VLA that handles object variation fine.
Every VLA deployment hits the same wall. The policy handles object positions it has never seen, then fails completely when the camera moves. This is not anecdote: controlled decompositions of the imitation-learning generalization gap rank new camera positions among the hardest distribution shifts — well above new object positions (Xie et al., 2023) — and it’s the failure that viewpoint-augmentation methods exist to patch (Tian et al., 2024; Chen et al., 2024). Placements varied in training; the camera didn’t. We wanted to see this asymmetry directly in the representation, with the smallest experiment that could show it.
The experiment
18 photos of our two-arm rig: the same four objects (a headset shell, a shoe last, a Joy-Con, an orange bezel) in 3 layouts, each shot from 6 camera positions. Cameras A–C are overhead variants; D–F are side views from table height — spanning everything from a mount nudge to a full re-rig.
Same layout across a row of cameras, same camera across a column of layouts — so every pair of photos is exactly one of: objects moved, same camera (18 pairs), camera moved, objects untouched (45 pairs), or both (90).
Encoders — the four ViTs that VLAs actually deploy: SigLIP So400m/14, the vision tower of PaliGemma and therefore π0; SigLIP2, its successor in the GR00T N1 family; DINOv2 ViT-L, half of OpenVLA’s fused encoder; and CLIP ViT-L, the classic VLM tower. All at 224px. The metric is mean cosine distance between corresponding tokens of the 16×16 patch grid — the visual state the language model consumes. For scale, a 10% brightness change scores 0.05 on SigLIP (and 0.001 on DINOv2).
Moving the camera changes more than moving the world — in every encoder
| encoder | objects moved | camera moved | both | camera ÷ objects |
|---|---|---|---|---|
| SigLIP So400m | 0.46 | 0.61 | 0.63 | 1.3× |
| SigLIP2 So400m | 0.40 | 0.54 | 0.57 | 1.4× |
| DINOv2 ViT-L | 0.31 | 0.57 | 0.60 | 1.9× |
| CLIP ViT-L | 0.36 | 0.52 | 0.54 | 1.4× |
Two things to note. Moving the camera with the world untouched lands within a few percent of “everything changed” — once the viewpoint shifts, rearranging the objects barely adds anything. And the full distance matrix shows the structure directly: the light stripes are the object rearrangements, the dark blocks are camera changes.
Placing all 18 images in 2D by their distances makes it blunt: the representation’s biggest axis is which camera, not what’s on the table. The side-view photos clump together with all three layouts interleaved — world state is a detail inside a camera cluster.
The bands do overlap at the extremes: the smallest camera move (E→F, adjacent side views: 0.31) scores less than the biggest rearrangement (0.57). Distance tracks how much of the image changed — and a camera move changes all of it, a layout change only some of it. That is precisely the problem.
The objects were never lost
The obvious suspicion — the encoder can’t track objects across views — is mostly wrong. Cluster all 4,608 patch tokens with k-means and paint the clusters back: the same content clusters (objects, arms, wood, wall) appear in every view, overhead or side-on.
So where does the viewpoint hide?
In every token, one level below the content. For each patch, ask which other image holds its single nearest neighbor. Chance is 5.9% per candidate image. A same-camera partner attracts 15% of an image’s patches; a partner showing the identical scene from another camera attracts 9%; an unrelated image 2% (SigLIP; 14–17% vs 9–10% vs 2% across all four encoders). Content pulls above chance — the objects are recognized — but the camera pulls harder.
Why this breaks VLAs
The policy’s state is that token grid. Camera pose is its dominant coordinate, so a viewpoint change relocates the state further than any object rearrangement — into a region the action head has never mapped. And it never mapped it because the camera was bolted down for every demo: placements came with thousands of training variations, viewpoint with zero. The information needed to recognize “same scene, different view” is demonstrably in the tokens; there was just never any training pressure to use it. Which also says what won’t fix this — a better object detector. The camera has to move in training — via multi-view data or synthesized viewpoints (RoVi-Aug, VISTA) — or the representation has to be forced to factor it out.













