FoveaVLA: Foveation Actions Replace the Wrist Camera in VLAs

Bingao Chen1 Lihan Zha2 C. Karen Liu1,† Guy Tevet1,†

1 Stanford University 2 Princeton University

† Equal advising

0:00 / 0:00

A wrist camera gives a robot a close-up, but one that is tied to its hand. What if the policy could decide where to look?

We present FoveaVLA, a vision-language-action model that replaces the wrist camera with a learned foveation action. Alongside every action chunk, it predicts the interaction region it will need to see at the next policy query, then crops that region from the original-resolution external image. The policy thus receives both the full view for scene context and the crop for close-up detail, without a camera on the hand.

Wrist-camera view: a close-up of the gripper holding a blue marker
Wrist cameraLocal detail, limited context. In this rollout, π0.5 grasps the blue marker instead of the black one.
The external view after resizing to the policy's 224-pixel input: the scene is visible but blurry
Full viewThe whole scene, but resizing to 224×224 blurs the gripper and the marker.
FoveaVLA: the external view with a teal box around the gripper and marker, and the full-resolution crop as an inset
FoveaVLAThe full view plus a learned crop at source resolution: here at 16.8× the resolution of the resized view.

01 · Interactive

See what FoveaVLA sees

Pick a rollout from the benchmark and scrub through it. The box shows where the policy looked at each query; the inset is the exact foveal crop it received. Toggle depth to see the aligned depth crop.

1.5× real speed
0:00 / 0:00
Query 1/50 Crop — px Detail 1.0×

All rollouts are autonomous episodes from the 48-trial real-world benchmark (trial numbers follow the paper's appendix). The crop updates once per policy query (every 8 control steps); boxes are recovered by matching each recorded crop to the full frame. The sparkline shows how much detail the crop adds over the resized full view. Playback is 1.5× real speed; the clock shows real robot time.

02 · Same task, same robot

Versus the wrist camera

The same benchmark trial, run by each policy. π0.5 sees an external camera and a wrist camera; FoveaVLA sees only one external camera and chooses where to look.

π0.5external + wrist camera
1.5× real speed
0:00 / 0:00
FoveaVLA-Singleone external camera only
1.5× real speed
0:00 / 0:00

Same trial, same initial scene and instruction; one rollout per method. Each video plays at 1.5× real speed and can be paused or scrubbed on its own; the clocks show real robot time.

03 · Same pixel budget

Why crop? Resolution where the interaction happens

The vision encoder sees 224×224 pixels as a 16×16 grid of patch tokens. When a 1280×720 frame is resized, the interaction region covers only a few of these tokens; a crop of the same region from the original image covers all 256.

Original external image · 1280×720
DROID external camera image
Policy input for the boxed region
⟷
Resized full view Foveal crop
Resized full view15of 256 tokens
Foveal crop256of 256 tokens

04 · Method

Learn where to look, alongside how to act

FoveaVLA builds on π0.5. From one shared observation it produces two outputs: an action chunk from the flow-matching action expert, and a foveation action, one box per external view, decoded with PaliGemma's existing location tokens.

FoveaVLA architecture Full and foveal RGB images and aligned depth maps pass through a shared SigLIP encoder into the PaliGemma VLM together with the task prompt and discretized state. The action expert turns noisy actions and flow time into the current action chunk; the language-model head predicts the foveation action B t+w, four location tokens, and the box predicted at the previous query crops the visual inputs. Loss L = L flow + 0.1 L foveation. PaliGemma VLMSigLIP 400M + Gemma 2B Action expertGemma 300M Shared SigLIP RGBDepthFullFovealFullFovealVisual inputs at t Task prompt +discretized state○– ○– ○– ⋯– ○ Noisy actions + flow time ττn₁n₂n₃nw⋯ L = Lflow + 0.1 Lfoveation a₁a₂a₃aw⋯Previous Action chunkAt−w a₁a₂a₃⋯awCurrent Action chunkAt Bt Bt+w Foveation actionBt+wyminxminymaxxmax Crop

Supervision from existing labels

Interaction boxes come from RoboInter annotations on DROID: the smallest rectangle enclosing the components each annotated skill requires, such as the gripper, the manipulated object, and the target region.

Predicts the next region

The target is the interaction region at the next query, because the gripper and objects move while the chunk executes.

No added wait

Box tokens are decoded from the cached prefix while the robot executes the chunk, so the crop is ready when the next frame arrives.

05 · Results

Real-world evaluation

Four real-world suites on the DROID setup, 12 shared randomized trials each. Both FoveaVLA variants match the wrist-equipped baseline on plain pick-and-place and achieve higher success with distractors, cloth manipulation, and far-away objects.

π0.5 (wrist-equipped) FoveaVLA-Single FoveaVLA-Dual

What makes it work

With one external camera and no wrist view, removing either the foveal crop or depth lowers success substantially. With both, FoveaVLA-Single reaches 70.8%, above the wrist-equipped π0.5.

Where the policy attends

On a Move episode, π0.5 attends almost exclusively to the wrist view, so it can miss a target outside it. FoveaVLA keeps a steady share on the full external views, which cover the workspace, and draws close-up detail from the foveal crops.

Attention share over time: FoveaVLA splits attention among left/right external views and crops; the wrist-camera baseline attends almost only to the wrist view. Attention maps at approach, grasp and reach-to-bowl keyframes.
Image-attention share per view over time (left) and attention maps at three keyframes (right). Each model is colored relative to its own 99th percentile, so brightness is not comparable across models.

Citation

@misc{chen2026foveavla,
  title         = {FoveaVLA: Foveation Actions Replace the Wrist Camera in VLAs},
  author        = {Bingao Chen and Lihan Zha and C. Karen Liu and Guy Tevet},
  year          = {2026},
  eprint        = {2610.20064},
  archivePrefix = {arXiv},
  primaryClass  = {cs.RO},
  url           = {https://arxiv.org/abs/2610.20064}
}