It's well-known that robotics data is messy. For the data to be suitable for training, several unstable input streams must be well-formed and perfectly in sync. Many different data corruption errors, ranging from very obvious to very subtle, can silently damage training runs and raise the noise floor. Without clean underlying data, strong model architectures can fail to outperform weaker, but more noise-resistant ones.

We looked at several major open-source UMI and teleoperated bimanual 6-DOF arm + 1-DOF gripper datasets to diagnose and correct issues. We're releasing per-episode manifests for these datasets:

We also inspected and cite examples from:

Preprocessing and Unified Episode Schema

To make the process of diagnosis and cleaning tractable over many varying datasets, we adapt every dataset into a unified “episode” struct. We do so by writing dataset-specific adapters which are cognisant of each dataset's quirks (e.g. the number of cameras and their types, video resolutions, the structure and file format of the dataset, etc). For our purposes, we also downscale and center-crop all cameras to a 224p square. Some datasets contain stereo egocentric cameras or multiple cameras per wrist; in these cases, we drop additional cameras and limit each episode to at most one overhead view and one view per wrist. The episode struct below is illustrative.

Unified episode structexpand
episode
├── episode_id: string
├── source_dataset: string
├── task_description: string
├── duration_s: float64
├── num_frames: int64
├── fps: float64
├── cameras[]
│   ├── name: string
│   ├── role: {left_wrist, right_wrist, overhead}
│   ├── video: encoded bytes[num_frames, 224, 224, 3]
│   └── frame_timestamps_ns: int64[num_frames]
└── robot_states
│   ├── states: float32[num_frames, 14]
│   └── state_timestamps_ns: int64[num_frames]
└── robot_actions
    ├── actions_local: float32[num_frames-1, 14]
    ├── actions_global: float32[num_frames-1, 14]
    └── action_timestamps_ns: int64[num_frames-1]

For actions, we convert everything to relative end-effector delta transformations 1. This requires some care since states cannot be naively subtracted to find deltas; they must be treated as SE(3) group operations.1 In current UMI data, the consensus default for the “action” taken at a frame is the next state achieved. We want our action data to be in terms of frame-to-frame state deltas, consistent with the signals we would send to a robot.

We additionally trim all episodes such that every episode has precisely T states and T-1 actions, and such that every video and action stream in an episode has the same number of states and actions respectively. This is straightforward since each frame has a globally-synced timestamp.

At this normalization phase, we already find many malformed episodes with either non-overlapping video streams, large numbers of missing frames, or extremely short malformed episodes.

Visualization and Filtering

We can now visualize the data and start filtering for issues. Our methodology is essentially the following loop:

  1. Establish a prior about how well-formed data should look, either from existing knowledge or spot checks of randomly sampled episodes. For example, “episodes where the gripper speed exceeds some threshold are likely to contain action errors” or “motion seen by the cameras should match motion taken by the end effectors.”
  2. Express the prior as an explicit programmatic flag condition.
  3. Run our flag condition on all episodes and spot check episodes that fail it.
  4. Determine the severity (as bad as a total reject and as good as a false positive) of the flag.

To visualize the data, we use a dashboard that shows synced camera views, action graphs, and 3D reconstructions of end effector trajectories for each episode. We add features to this dashboard as necessary for each new prior and spot check. Our visualizations in this article are derived from this dashboard.

Our priors are biased towards those which would impact world and world action models the most, with de-emphasis on VLA-based or behavior cloning-based policies. In the next section, we use “world modeling” to mean both action-conditioned “world models” and state-conditioned “world action models”. Our process quickly uncovered a lot of data anomalies; we give examples of the most interesting and important ones we found below.

Anomalies

Camera disconnection

Issue
One of the wrist cameras fully disconnects during the episode, causing its feed to stop updating while the other camera streams normally.
Detection
We flag sustained periods in which consecutive frames from a camera feed show little or no visual change.
Downstream Impact
The disconnected camera feed damages world modeling objectives as it no longer reflects the robot's motion.
IPEC-COMMUNITY/FastUMI_100k_lerobotAdd_Rice_to_Rice_Cooker / episode_002602
left wristframe 200
right wristframe 200
10.00 s
200 / 415
Flagged frames
Adjacent-frame visual changeluma MAD
left wrist 2.3213 luma MADright wrist 11.51 luma MAD

Camera freeze and non-uniform brightness changes

Issue
This time the camera freezes without disconnecting. We can see the arm is moving from the other wrist camera. We also note that in this and some other datasets, the frame-by-frame camera brightness difference is spiky, indicating that the camera does not record frames at uniform intervals (despite the native timestamps being at uniform intervals). This is clearer in the full episode brightness graph.
Detection
Camera freezes and disconnections are both flagged by long stretches of no change in frame. We don't explicitly flag the brightness change spikes, as they appear uniformly in certain datasets.
Downstream Impact
Camera freezes damage world modeling, like disconnects. Non-uniform frame intervals would add some noise to world modeling, though it may be avoidable/negligible over chunks with smooth ground truth actions. They can also be avoided by downsampling the FPS.
IPEC-COMMUNITY/FastUMI_100k_lerobotArrange_Toothbrush_and_Toothpaste / episode_000113
left wristframe 0
right wristframe 0
0.00 s
0 / 335
Flagged frames
Adjacent-frame visual changeluma MAD
left wrist 0.0000 luma MADright wrist 0.0000 luma MAD

Cuts in the footage

Issue
The footage shows clear cuts in the episode.
Detection
The cuts can be detected through both state change spikes and, in cases like this where the ground truth gripper positions are correct, action change spikes.
Downstream Impact
Windows placed over these cuts would be discontinuous and highly unusual in a training distribution.
WorldEngineAI/WEB-Datasetbagging-groceries / episode_000020
left wristframe 3,480
right wristframe 3,480
58.00 s
3,480 / 7,370
Left wrist adjacent-frame visual changeluma MAD
left wrist 7.7910 luma MAD

Episode missing small chunks, appearing as fast forward

Issue
The episode drops several short segments, causing the footage to briefly appear fast-forwarded.
Detection
The missing segments create action discontinuities. We note that the state changes are smoother due to the fast forward effect, so they do not spike as strongly as in the case of cuts in the footage.
Downstream Impact
These sections are essentially noisier, higher fps data which would be out of distribution for world model training.
genrobot2025/10Kh-RealOmin-OpenDataOrganize_Clutter / desktop_object_sorting / 00010 / 00557
left wristframe 300
right wristframe 300
10.00 s
300 / 959
Left wrist adjacent-frame visual changeluma MAD
left wrist 4.1494 luma MAD

One gripper is pixelated in the other wrist camera

Issue
One gripper becomes visibly pixelated in the other gripper's wrist camera.
Detection
We found this from manual inspection and don't have an automatic flag for it. It seems to appear consistently in HiFi-UMI-2K.
Downstream Impact
This penalizes world models for predicting the view of the other gripper accurately when it blurs in the footage.
simple-world-lab/HiFi-UMI-2Kchunk-0000 / part-0000 / 0
left wristframe 81
right wristframe 81
3.24 s
81 / 451
Flagged frames

Camera views are too dark

Issue
Both wrist camera streams are too underexposed to clearly see the manipulation.
Detection
We flag sustained periods of extreme darkness.
Downstream Impact
Since there's too little state information to make reasonable predictions, this example would have high noise in world modeling.
genrobot2025/10Kh-RealOmin-OpenDatafold_and_store_clothes / 00007 / 00675
left wristframe 0
right wristframe 0
0.00 s
0 / 3,320
Flagged frames

Covered camera

Issue
One of the cameras is covered by a cloth during the episode.
Detection
Same as frozen/disconnected camera.
Downstream Impact
Same as frozen/disconnected camera, though slightly different since this can happen during a well-formed real-world deployment without a hardware failure. It's possible that such data is useful for learning the connection between overhead and wrist cameras.
left wristframe 540
right wristframe 540
18.00 s
540 / 1,148
Flagged frames
Adjacent-frame visual changeluma MAD
left wrist 2.5439 luma MADright wrist 1.5225 luma MAD

Auto exposure causes significant visual change without action

Issue
A change in scene causes auto exposure to adjust image brightness when the robot isn't moving.
Detection
This triggers our 'visual change unexplained by action magnitude' check. We note that this check has a high false positive rate because small actions can drastically change the pixels in the wrist camera's view during close manipulation.
Downstream Impact
These exposure shifts are a form of visual change that is unrelated to the recorded actions, contributing to noise in world model training.
left wristframe 1,891
right wristframe 1,891
63.03 s
1,891 / 1,949
Flagged frames
Left wrist visual change vs. action magnitudeindependent scales
left wrist pixels 5.0771 luma MADleft wrist action 0.0010 intensity

Actions shifted by several frames

Issue
Stored gripper open/close actions begin roughly two frames before the gripper visibly moves. Position and rotation actions are correctly aligned.
Detection
We manually spot check episodes looking for action errors.
Downstream Impact
This would trick world models into predicting states and actions too early or too late.
genrobot2025/10Kh-RealOmin-OpenDataClutter Tidy-Up [Stage2] / 00001 / 01706
left wristframe 1,976
right wristframe 1,976
65.87 s
1,976 / 2,044
Gripper action timing|Δ open|
left · source timing 0.1917 |Δ open|left · aligned v8 0.0308 |Δ open|right · source timing 0.0551 |Δ open|right · aligned v8 0.0190 |Δ open|

Action spike with no visual analogue

Issue
One gripper registers an action that is not reflected in the camera footage. In this case, the left gripper action has a 10.46 cm translation in one 50 ms interval, even though the left wrist camera doesn't show any motion.
Detection
We flag high action acceleration and large actions that correspond to very little state change (and vice versa).
Downstream Impact
A large action with no state change would directly poison any world modeling objective, since the causal relationship between action and state change is disrupted.
IPEC-COMMUNITY/FastUMI_100k_lerobotArrange_Toothbrush_and_Toothpaste / episode_001424
left wristframe 384
right wristframe 384
19.20 s
384 / 394
Flagged frames
Action magnitude vs. visual changeindependent scales
source left translation 10.46 cmleft wrist pixels 1.3076 luma MAD

Actions stopped recording

Issue
Actions are recorded for a few seconds, then stop while the episode continues.
Detection
This triggers our flag for state change and action correlation falling below a correlation of .04. We note that this is a manually selected threshold; in this example, only one of the two wrists triggers it.
Downstream Impact
The recorded actions do not correspond to the observed state transitions, introducing significant noise into world model training objectives.
IPEC-COMMUNITY/FastUMI_100k_lerobotAdd_Rice_to_Rice_Cooker / episode_000331
left wristframe 0
right wristframe 0
0.00 s
0 / 415
Flagged frames
Recorded action intensityintensity
left 0.0000 intensityright 0.0000 intensity

A gripper didn't record open/close actions

Issue
Video footage shows a gripper taking open/close actions, but they are missing from the action data.
Detection
We filter for all episodes where either gripper takes no actions. Although this catches a gripper disconnection, it also flags any episode where a gripper validly did not take open/close actions (though this also constitutes a dataset bias; we expect bimanual data to use both end effectors for manipulation). In our current iteration, we do not separate these false positives from the genuine gripper disconnections. We have also found episodes where the gripper does not record actions for part of an episode, but these are much harder to filter for efficiently.
Downstream Impact
This would directly damage any world modeling objective.
genrobot2025/10Kh-RealOmin-OpenDataClutter Tidy-Up [Stage2] / 00001 / 01829
left wristframe 135
right wristframe 135
4.50 s
135 / 1,448
Recorded gripper apertureopen fraction
left gripper 1.0000 open fractionright gripper 0.2769 open fraction

Spiky actions

Issue
The frame-by-frame actions exhibit an unusual spiky pattern.
Detection
We identified this by spot checking action graphs; it appears uniformly in some datasets.
Downstream Impact
These actions may introduce unintended biases into world model training and cause issues. We observe similar nonuniformity in the state-to-state camera observation differences when episodes are played back at low fps, suggesting that affected datasets may require a deeper correction or downsampling to fully adjust for this issue.
agibot-world/AgiBotWorld-Betatask_352 / episode_000000
right wristframe 936
overheadframe 936
31.20 s
936 / 1,170
Right-arm action magnitudesindependent scales
right translation 0.1078 cmright rotation 0.0036 rad

Spiky gripper actions

Issue
Gripper actions show a spiky pattern, similar to the spiky actions seen earlier.
Detection
This occurs on a per-dataset basis like spiky movement actions, but occurs independently of those.
Downstream Impact
Same impact as spiky actions.
RealSourceData/RealSource-WorldArrange_the_cups / episode_000192
left wristframe 345
right wristframe 345
11.50 s
345 / 802
Gripper open/close actionsΔ open
left gripper 0.0000 Δ openright gripper 0.0000 Δ open

Extremely slow actions

Issue
Part of the task is performed much slower than a human would. The slowness is not uniform within the task.
Detection
Identified during manual inspection.
Downstream Impact
These segments are not strictly harmful for world modeling, but introduce another bias that we should be cognisant of generally.
tencent/Hy-Embodied-0.5-VLA-Datatable_000 / episode_000000
left wristframe 540
right wristframe 540
18.00 s
540 / 1,565
Local relative translation magnitudecm
left 0.0084 cmright 0.0476 cm

Long actionless tail

Issue
The episode continues for an extended period after the task is complete.
Detection
We flag long prefixes or suffixes with action magnitudes substantially lower than the episode average. These segments can then be masked or clipped.
Downstream Impact
This would inject an unwanted bias toward training on no-op states and actions in our task, though damage may be low as we'd expect models to learn such transitions early. They can also obscure the true task endpoint, making it harder to extract goal frames for goal image latent-conditioned value functions or planners.
x-humanoid-robomind/RoboMINDfold_clothes / 2024_12_23-10_46_54-173639055863363776.00
left wristframe 441
right wristframe 441
20.84 s
441 / 692
Flagged frames
Local relative translation magnitudecm
left 0.0037 cmright 0.3775 cm

Unnecessary handoffs

Issue
The right gripper hands off flower stems to the left gripper despite being able to place the stem directly in the vase (which it sometimes does directly).
Detection
Identified during manual inspection; hard to filter for automatically.
Downstream Impact
Not strictly harmful for world modeling, but suboptimal for behavior cloning and good to be aware of as a dataset bias.
XDOF/ABC-130karrange_the_flowers_into_the_vase / episode_7607cfd9-2660-4e61-944f-065cb7c87b92
left wristframe 900
right wristframe 900
30.00 s
900 / 3,517

Nonuniform task descriptions

Issue
Task labels range from terse class names to procedural bilingual transcripts with metadata mixed into the same field.
Detection
Manual inspection of task descriptions.
Downstream Impact
Unnormalized task descriptions could make it difficult to learn any sort of text-conditioned model over multiple datasets.
Source task fields

Close the left gripper, press the button to open the rice cooker; take a wooden spoon from the chopstick holder with the right hand, scoop a spoonful of rice and pour it into the rice cooker, then put the wooden spoon back into the chopstick holder.

IPEC-COMMUNITY/FastUMI_100k_lerobotAdd_Rice_to_Rice_Cooker / episode_002602

Fold the gray pants neatly on the table.

allenai/MolmoAct2-BimanualYAM-Datasetepisode 10018

Clutter Tidy-Up [Stage2]

genrobot2025/10Kh-RealOmin-OpenDataClutter Tidy-Up [Stage2] / 00001 / 01706

Take the disposable food container out of the microwave.

simple-world-lab/HiFi-UMI-2Kchunk-0000 / part-0000 / 0

Open the fridge to get food. | A robot is placed in front of the refrigerator, with the refrigerator door closed.

agibot-world/AgiBotWorld-Betatask_352 / episode_000000

Arrange the cups | Left arm picks up the stack of cups from the center of the plate; right arm separates the two cups; right arm places the cup on the right side of the plate; left arm places the cup on the left side of the plate.

RealSourceData/RealSource-WorldArrange_the_cups / episode_000192

arrange the flowers into the vase

XDOF/ABC-130karrange_the_flowers_into_the_vase / episode_7607cfd9-2660-4e61-944f-065cb7c87b92

clothes washing

BitRobot/HIW-500-LeRobotepisode 13116

将手机壳放入收纳盒

tencent/Hy-Embodied-0.5-VLA-Datatable_000 / episode_000000

fold clothes

x-humanoid-robomind/RoboMINDfold_clothes / 2024_12_23-10_46_54-173639055863363776.00

右手推动矿泉水使它靠紧墙壁@Push the water bottle with the right hand to make it flush against the wall.; 右手拿起从左往右数的第四瓶矿泉水,右手把矿泉水放到洗菜槽左侧@Pick up the fourth bottle of mineral water from the left with your right hand, then place it to the left of the vegetable sink with your right hand.; 左手拿起从左往右数的第一瓶矿泉水,左手把矿泉水放到第二瓶矿泉水左侧@Pick up the first bottle of mineral water from the left with your left hand, then place it to the left of the second bottle with your left hand.; qualified; 右手拿起从左往右数的第二瓶矿泉水,右手把矿泉水放到第三瓶矿泉水左侧@Pick up the second bottle of mineral water from the left with your right hand, then place it to the left of the third bottle of mineral water using your right hand.; 左手推动矿泉水使它靠紧墙壁@Push the mineral water bottle with your left hand to press it against the wall.; 右手拿起从左往右数的第三瓶矿泉水,右手把矿泉水放到第四瓶矿泉水左侧@Pick up the third bottle of mineral water from the left with your right hand, then place it to the left of the fourth bottle with your right hand.; arrange mineral water bottles on the desk; 右手推动矿泉水使它靠紧墙壁@Push the mineral water bottle with the right hand to press it against the wall.

RogersPyke/Galaxea-Open-World-Dataset_10K_20260123arrange mineral water bottles on the desk / episode 0

We note that many of the flags we apply require setting an arbitrary threshold. For example, how fast is too fast for an end effector? How little motion in the overhead view is too little before we flag a frozen camera? Because of this, our filtering flags catch a fair number of false positives and may produce some false negatives, depending on the flag. We occasionally see a false positive for the “visual change unexplained by action” flag when an object is dropped or very close to a wrist camera, since a small action causes a large visual change.

We also note that some of our examples are not automatically detectable and/or point to a source of bias rather than an indisputable error, like slow actions and unnecessary handoffs. We give these only as additional examples of situations to look out for in datasets, as we don't explicitly flag them with static checks.

Finally, we note one video issue we don't illustrate above, which is missing frames. A large number of episodes have intermittent gaps in state timesteps or action timesteps, in particular in XDOF/ABC-130k. It also impacts a smaller but significant chunk of genrobot2025/10Kh-RealOmin-OpenData. If only a few frames are missing, as is the case with most of our quarantined ABC-130k and GenRobot episodes with this flag, this issue is relatively benign and can be patched over, but the fix is somewhat opinionated so we only flag the episodes and provide the missing frame indices in our manifests.

Action Processing and Smoothing

To verify our SE(3)-based action conversion, we draw the original ground truth states as a trajectory in 3D space and compare it against the same trajectory written as an SE(3)-cumulative sum of actions. In other words, we convert original states to relative actions and then convert back to absolute states, and we verify that the round trip preserves the original trajectory.

We generally prefer robot actions with small and bounded accelerations, where velocity increases and decreases smoothly. Not only are these actions safer to execute, they're also more natural and easier for policies to predict since the variance of the distribution of actions is much lower. Raw robotics data, especially UMI data (which is not bound by robot arm kinematics) is full of abrupt spikes and jerky motions, so this requires careful post-processing.

To obtain an ideal medium between staying true to the ground truth and smoothing out jerky motions, we apply smoothing in a way that penalizes sharp accelerations while requiring that the SE(3)-based trajectory through space is minimally altered end-to-end. To do this, we minimize the sum of two loss terms that act in opposition: one that penalizes high acceleration and one that penalizes deviation from the global trajectory. This allows us to compute much smoother trajectories while avoiding compounding global error from smoothness operations; they may not be as perfectly accurate as the original state data on a frame-by-frame basis, but have significantly lower variance on short horizons of multiple actions in a chunk.

An example of our smoothing is shown below. It is particularly necessary for episodes with spiky actions since such actions would be strange and difficult to handle both as input (for world modeling) and output (for world action modeling).

agibot-world/AgiBotWorld-Betatask_352 / episode_000000
left wristframe 936
right wristframe 936
31.20 s
936 / 1,170
Local relative translation magnitudecm
left · spiky 0.3623 cmleft · smoothed 0.4865 cmright · spiky 0.1078 cmright · smoothed 0.1466 cm
SE(3) trajectory preservationCanonical states vs. integrated smoothed actions
canonical statesmoothed reconstruction
canonical right wristframe 936
xyz
smoothed right wrist0.5 mm from canonical
xyz

Beyond Our Current Static Checks

Our automatic checks catch and filter a large portion of the most severe dataset issues, but data quality issues have a long and infinitely subtle tail. As noted, we expect a fair share of false positives and false negatives due to thresholds that may vary significantly in optimal value for each dataset or task. By checking state and action correlation, we can catch mismatched cameras and actions in episodes, but datasets containing many examples of the same trajectory could slip through this check if each trajectory is similar enough. Other issues like action misalignment or partial-episode disabled grippers can occur on an episode-by-episode basis and are difficult to catch with weaker static checks; the presence of gripper action errors in some datasets warrants a dedicated per-dataset extraction policy that can somewhat deterministically verify that the gripper video is consistent with open/close actions.

As mentioned before, issues like unnecessary handoffs are higher-level opinionated issues and are much harder to check without either a human annotator or a sophisticated VLM-based pipeline (which we are exploring).

As a more general technique, a small (or large) IDM could be fitted to all datasets, or each dataset individually, to identify extremely strange actions which are difficult for a small policy to predict. This would be a smarter version of our state delta vs action delta correlation check. We are exploring this approach internally as it is a promising data quality filter, but do not speculate further on this approach here as it would be significantly more opinionated than our other standard static checks.

Credits

This project and writeup were undertaken by Sambhav Gupta. We thank XK Lu, Jenna Hong, Jannik Schilling, and Kunvar Thaman for edits and suggestions.

For past work, we broadly searched for citations of anomalies like the ones we found, but did not find major examples pointing to the same specific errors. Please reach out if you know of or produced any such work so we can cite and link it here.

If you are interested in a data-related collaboration or have any questions or comments, please contact us at data@pantheon.inc.

Open-source release

We've released a per-episode manifest of our findings for FastUMI_100k_lerobot, MolmoAct2-BimanualYAM-Dataset, 10Kh-RealOmin-OpenData, and ABC-130k. In these manifests, for each episode, we assign a list of flags for the issues we encountered. In the case that the flag is assignable at a frame level, we include a boolean mask. We also include our raw and smoothed frame-to-frame action data.

Dataset citations