Mocap and video are out of step in the React training sessions

React motherboard episodes used by the vtm_cosmos and MoT world models · middle camera vs OptiTrack gel pose · 15 fps

What was checked. Every action row k is computed from the sensor pose at frame k and frame k+1, and training pairs it with the video move from frame k to k+1. That only holds if the pose timestamps match the video. For each episode and hand, the speed of the gel centre from mocap was compared with how much the image changes in a 40 px box around the projected gel centre. The two signals were cross-correlated over offsets of ±6 frames (±400 ms), and the peak was refined to a fraction of a frame.
2026-09-11 train
-91 ms
-1.36 fps15 frames · range -118 to -68 ms · 39 hand-episodes
2026-09-12 train
-104 ms
-1.55 fps15 frames · range -107 to -94 ms · 8 hand-episodes
2026-09-09 val0909
+27 ms
+0.41 fps15 frames · range +20 to +42 ms · 6 hand-episodes

In the two training sessions the video moves about 94 ms before the mocap reports it, very consistently across all 25 training segments. Val0909 is close to aligned (+27 ms). So action row k in the training data describes a move that already happened about 1.4 frames earlier in the video, and the timing differs between training and val0909 by about 121 ms.

Correlation against time offset

Mean over all hand-episodes of each session. A peak left of zero means the image changes before the mocap step.

2026-09-11 train2026-09-12 train2026-09-09 val0909
0.00.20.40.60.81.0-400-333-267-200-133-67+0+67+133+200+267+333+400image change measured this many ms after the mocap step (ms)correlation09-1109-1209-09

Offset per episode

Circles are the left hand and hollow squares the right hand. Faded marks had a peak correlation below 0.4 and are left out of the medians.

2026-09-11 train2026-09-12 train2026-09-09 val0909left handright hand
-133-100-67-33+0+33+67offset at peak correlation (ms, negative = video moves first)train median -94 msval median +27 ms0911_episode_0000911_episode_001_seg000911_episode_001_seg010911_episode_002_seg000911_episode_003_seg000911_episode_004_seg000911_episode_004_seg010911_episode_005_seg000911_episode_005_seg010911_episode_005_seg020911_episode_005_seg030911_episode_005_seg040911_episode_005_seg050911_episode_006_seg000911_episode_006_seg010911_episode_007_seg000911_episode_007_seg010911_episode_007_seg020911_episode_007_seg030911_episode_007_seg040911_episode_008_seg000912_episode_000_seg000912_episode_000_seg010912_episode_0020912_episode_0030909_episode_0000909_episode_0010909_episode_002

The two signals over time

Five seconds of smooth motion, one point per fps15 frame. Both signals are standardized so they share one axis: gray is the image change near the gel, color is the mocap speed, and r is their correlation over the stretch. In the training stretch the orange peaks come one to two frames after the gray ones; moving the mocap +1.41 frames lines them up. The training stretch was picked as the one where the shift changes the correlation most, and the val0909 stretch as the one with the highest correlation, so they illustrate the effect rather than measure it. The per-episode numbers above are the measurement.

image change near the gel (video) mocap speed at recorded time mocap speed after moving it by the session offset
Train (0911_episode_003_seg00, left hand, from frame 2915): mocap at its recorded time, r = 0.270240 s1 s2 s3 s4 s5 sSame 5 s: mocap moved +1.41 frames (+94 ms), r = 0.74020 s1 s2 s3 s4 s5 sVal0909 (0909_episode_000, left hand, from frame 2840): recorded time, r = 0.95020 s1 s2 s3 s4 s5 s

What it looks like on the video

Crops of the middle camera at full resolution during smooth, fast moves. The orange ring is the gel centre projected from mocap at the frame's recorded time. The blue dot is the same projection after moving the mocap by the session's median offset (+1.41 frames for training, -0.41 for val0909). The gel centre sits at a fixed spot on the handheld sensor, where the handle meets the loop. In training, the orange ring lags behind that spot along the direction of motion and the blue dot stays on it. In val0909 the two nearly coincide.

What to do about it

Data table

Per-episode offsets (ms) and peak correlations
episodesessionleft offsetleft peak rright offsetright peak r
motherboard_0911_episode_0002026-09-11 train-930.73-900.59
motherboard_0911_episode_001_seg002026-09-11 train-1070.67-900.78
motherboard_0911_episode_001_seg012026-09-11 train-970.90-890.61
motherboard_0911_episode_002_seg002026-09-11 train-1060.71-1050.63
motherboard_0911_episode_003_seg002026-09-11 train-1030.69-1180.58
motherboard_0911_episode_004_seg002026-09-11 train-950.72-860.38
motherboard_0911_episode_004_seg012026-09-11 train-910.76-870.67
motherboard_0911_episode_005_seg002026-09-11 train-810.79-760.40
motherboard_0911_episode_005_seg012026-09-11 train-880.69-810.39
motherboard_0911_episode_005_seg022026-09-11 train-980.71-820.60
motherboard_0911_episode_005_seg032026-09-11 train-890.75-760.74
motherboard_0911_episode_005_seg042026-09-11 train-910.71-790.68
motherboard_0911_episode_005_seg052026-09-11 train-910.73-770.61
motherboard_0911_episode_006_seg002026-09-11 train-990.72-920.37
motherboard_0911_episode_006_seg012026-09-11 train-1030.72-1070.48
motherboard_0911_episode_007_seg002026-09-11 train-830.67-680.70
motherboard_0911_episode_007_seg012026-09-11 train-980.64-880.61
motherboard_0911_episode_007_seg022026-09-11 train-900.69-920.61
motherboard_0911_episode_007_seg032026-09-11 train-900.67-980.62
motherboard_0911_episode_007_seg042026-09-11 train-1040.66-980.72
motherboard_0911_episode_008_seg002026-09-11 train-1060.60-850.72
motherboard_0912_episode_000_seg002026-09-12 train-1030.69-1030.67
motherboard_0912_episode_000_seg012026-09-12 train-940.73-1070.71
motherboard_0912_episode_0022026-09-12 train-1060.68-1050.66
motherboard_0912_episode_0032026-09-12 train-1050.64-1010.64
motherboard_0909_episode_0002026-09-09 val0909+200.82+360.74
motherboard_0909_episode_0012026-09-09 val0909+420.80+270.73
motherboard_0909_episode_0022026-09-09 val0909+270.81+250.63

Method: checkpoints/hf_spaces/build_react_sync_data.py. Image change is the mean absolute gray-level difference between consecutive fps15 frames (256 px, same crop as the latent trees) inside a 40 px box around the gel centre projected with the middle-camera calibration. Offsets are in fps15 frames; one frame is 66.7 ms.