Action → camera-image motion: learning a dense, state-dependent ActionImage

A small encoder that maps the robot action into the optical-flow field on the camera image, on the world model's 16×16 latent grid. It is the visual analog of the tactile action→gel-flow encoder, and it exists to answer one question: the analytic ActionImage projects only the two sensors (a sparse prior), so it can describe hand motion but not the motion of the manipulated PCB — the exact thing the world model hallucinates. Can a model learn that propagation?

Answer: yes, and it needs both inputs. The ActionImage alone reaches 3.76 px error and the visual state alone 3.85 px — but together 2.42 px, against 5.45 px for the analytic prior and 7.07 px for predicting no motion at all. In the object (PCB) region specifically the learned encoder is 2.3× better than the analytic prior. Super-additivity is the point: neither the action nor the image alone determines how the board moves — their interaction does.

Setup

Task and data

Per latent transition (5 frames at 6 fps): predict the pooled AllTracker optical flow of the middle camera. Inputs are the 12-channel ActionImage the video expert already uses — 6 position Gaussians (2 sensors × gel centre / normal / up) plus 6 endpoint-motion channels (2 sensors × du, dv, weight) — the visual state (the Wan2.2 VAE latent of the frame the transition starts from), and an analytic prior (the ActionImage's own weight-averaged displacement, fading to zero away from the sensors). Prediction is residual + gain · prior, so the model learns a correction to the geometry rather than the field from scratch.

Targets: AllTracker flow at 6 fps for all 36 episodes, cropped to the region the VAE actually encodes and pooled to the latent grid (units: px in the 256×256 crop). Validation is two fully held-out episodes. 150–810 K parameters per variant; minutes to train each.

Results

Ablations — active-pixel end-point error (lower is better)

variantinputsEPE activeEPE all direction cos
zero baseline7.074.45
analytic priorgeometry only, no learning5.453.76
Aprior only4.242.620.754
BActionImage3.762.310.807
Bmmotion channels only3.822.350.807
Cvisual state3.852.350.760
DActionImage + state2.451.520.868
EActionImage + state + prior 2.421.510.865

Bm drops the position Gaussians and keeps only the motion channels — a near-tie with B, so at this resolution where the sensors are adds little once how they move is given.

Where the gain lives: hand vs object

regionzeroanalytic priorlearned (E)
hand / sensor cells14.028.073.85
object (PCB) cells6.025.05 2.20

The analytic prior barely beats predicting nothing in the object region (5.05 vs 6.02) — as expected for a two-point projection. The learned encoder cuts that error to 2.20.

Visualization

Predicted vs ground-truth flow fields

quiver comparison

Left to right: analytic prior · ActionImage only (B) · visual state only (C) · all inputs (E) · ground truth. One arrow per latent cell (all 16×16), drawn on the camera crop the model sees; the vertical sign is image convention (down = down, verified against the sensors' measured displacement). Arrow length is magnitude, exaggerated 5× — one grid cell of arrow = 5 px of flow in the 256-crop ≈ 9 px in the source frame ≈ 14 mm of physical motion over the transition's 0.83 s. Colour also encodes magnitude (pale yellow ≈ 0, dark red ≈ 12 px), so sub-pixel flow reads as faint without being hidden. Switch Split to compare held-out episodes (0510-ep005/006, never seen in training) against training episodes — the two look similar, which is the point: a 150–810 K-parameter encoder on 34 episodes is not memorising.

Reading the background

Why there are arrows off the motherboard

Three distinct causes, worth separating because only one of them is a model artifact:

Why it matters

Toward a learned ActionImage

The world model currently conditions on the sparse analytic ActionImage. This encoder's output is a dense, state-dependent one — the same representation, but able to say what the action does to the object, not just to the sensors. The natural next step is to feed this predicted field back as the video branch's ActionImage (or inject its frozen motion feature), which is now justified by measurement rather than hope.

Caveats: two held-out episodes, one task (motherboard assembly), same session as training — this measures "unseen trajectory, seen conditions". Errors are per latent transition, in px of the 256×256 crop, on the 16×16 grid the world model operates on.