Guide
What Format Should Robot Pretraining Data Be Delivered In?
Short answer
For pretraining scale, pick the format your training stack already loads: RLDS for TFDS-based pipelines, LeRobot for the smallest on-disk footprint and LeRobot-based tooling, or WebDataset for shard-streamed training beyond local disk. HDF5/zarr and Rerun .rrd cover verification and inspection. Firsthand delivers all six directly from one underlying episode schema.
Last reviewed:
What format should robot pretraining data be delivered in?
The right answer depends on what stage of the pipeline the data feeds and how it will be loaded, not on which format is objectively "best." A pretraining corpus is large enough that the wrong container adds real friction: a format that does not stream well forces you to stage everything locally first, and a format that does not match your training library forces a conversion step before you can start a run. The starting question is not "which format is best" but "which format does my training code already expect, and does the corpus need to stream or fit on local disk."
Every Firsthand delivery format is a projection of the same underlying episode schema — meta, streams, annotations and calibration groups with explicit dtypes, shapes and metric units, documented on the episode schema page. That means the choice of RLDS, LeRobot, WebDataset, HDF5/zarr or Rerun .rrd is a packaging decision, not a data-completeness one: no format is missing a field the others have, except where a format is architecturally unable to embed something (LeRobot’s mp4 layout does not carry depth inline, for example).
Which formats does Firsthand deliver?
- RLDS
- TFDS-compatible tfrecord shards, ~1.9 GB per shard, one skill line per directory. Loads with tensorflow_datasets.
- LeRobot
- Parquet + mp4 per camera, Hugging Face datasets layout, v2.1. Loads with lerobot.common.datasets �������� the smallest on-disk option.
- WebDataset
- .tar shards of 512 samples, streamed from signed URLs. Loads with the webdataset library for training beyond local disk.
- HDF5 & zarr
- One group per episode, time-major 30-frame chunks. The most complete format — what Firsthand’s own QA tooling reads.
- Rerun .rrd
- One recording per episode, every stream on a shared timeline. For inspection before writing a loader, not for training.
- Episode schema
- The canonical meta/streams/annotations/calibration layout every other format is a projection of.
Delivery formats and their intended use
All six are documented on their own format pages with a field mapping, a loading snippet and known gotchas — see the formats hub.
RLDS vs LeRobot vs WebDataset: which suits pretraining?
For a pretraining-scale corpus specifically, the deciding factor is usually how the data will be fed into training, not a feature difference between the formats. RLDS keeps every stream at native rate in TFDS-compatible shards, which suits large-scale pipelines already built on tensorflow_datasets and is the format that keeps depth (observation.depth_mm) directly on each step. LeRobot is the smallest on-disk option because video is compressed per camera into mp4, and it loads natively into LeRobot-based imitation-learning tooling — but its mp4-based layout does not embed depth, so a policy that needs depth pulls it from the accompanying HDF5 export. WebDataset is built for streaming: shards are .tar archives read directly from signed URLs, which matters when a pretraining corpus is larger than a team wants to stage on local disk before a run starts.
| RLDS | LeRobot | WebDataset | |
|---|---|---|---|
| Container | TFDS-compatible tfrecord shards | Parquet + mp4 per camera, HF datasets layout | .tar shards, 512 samples per shard |
| Loading library | tensorflow_datasets | lerobot.common.datasets | webdataset (signed-URL streaming) |
| Depth included | Yes — observation.depth_mm per step | No — pull from the HDF5 export | Yes — depth.png per sample, 16-bit |
| On-disk footprint | Larger — fields stored directly | Smallest — compressed mp4 per camera | Moderate — shard size depends on content |
| Best fit | TFDS-native pipelines wanting native-rate streams | LeRobot-based imitation-learning pipelines | Training beyond local disk, shard-streamed |
RLDS vs LeRobot vs WebDataset for pretraining-scale delivery
This table restates the same facts already documented on the RLDS, LeRobot and WebDataset format pages and on the RLDS vs LeRobot comparison page — nothing here is a new claim.
What goes in each episode?
Regardless of delivery format, an episode follows the same four-group episode schema: meta.json (episode_id, skill_id, site_id, participant_id, duration_ns, license, reject_flags), a streams/ group (head_rgb, wrist_l/r, depth_mm, depth_conf, imu_head, imu_wrist_l/r, and per-stream *_timestamp_ns), an annotations/ group (hand_joints, hand_visible, body_joints, contact_events, instance_masks, objects, action_segments, gaze_target), and a calibration/ group (intrinsics, extrinsics as SE3, rms_reproj_px). Units are metric throughout — depth in millimetres, hand joints in metres — and every format packages a projection of these same four groups differently, not a different set of fields.
- meta.json
- episode_id, skill_id, site_id, participant_id, duration_ns, license, reject_flags
- streams/
- head_rgb, wrist_l/r, depth_mm, depth_conf, imu_head, imu_wrist_l/r, *_timestamp_ns
- annotations/
- hand_joints, hand_visible, body_joints, contact_events, instance_masks, objects, action_segments, gaze_target
- calibration/
- intrinsics, extrinsics (SE3), rms_reproj_px
Episode schema groups and what they carry
How are depth, IMU and hand-pose streams stored per format?
Depth, IMU and hand pose are the fields most likely to differ in how (or whether) a given format embeds them, so it is worth mapping each explicitly rather than assuming parity across formats. RLDS keeps depth as observation.depth_mm and hand pose as observation.hand_joints, both directly on the step. LeRobot flattens hand joints (2×21×3) and then body joints (24×3) into a single observation.state vector, and does not embed depth in its mp4 files at all — that has to come from the HDF5 export. WebDataset carries depth as depth.png (16-bit, decode as uint16 millimetres, not 8-bit) and hand pose inside ann.json alongside action and contact_events. HDF5/zarr stores everything under streams/ and annotations/ exactly as the episode schema defines it, which is why it is the format Firsthand’s own QA tooling reads.
- RLDS
- observation.depth_mm and observation.hand_joints as separate step keys, plus IMU is not a named base step key
- LeRobot
- Depth not embedded (pull from HDF5); hand + body pose flattened into observation.state
- Rerun .rrd
- world/hands and depth surfaced visually on the shared timeline, for inspection rather than loading into a training loop
- WebDataset
- depth.png (16-bit) per sample; hand_joints inside ann.json alongside action and contact_events
- HDF5 & zarr
- streams/depth_mm, streams/imu_head, streams/imu_wrist_l/r; annotations/hand_joints as [T, 2, 21, 3] metres
Depth, IMU and hand-pose field mapping by format
Can you convert between formats later?
Yes, because every format is a projection of the same episode schema, but converting after the fact means re-mapping keys rather than gaining new fields. The RLDS-to-LeRobot conversion guide walks through exactly this: observation.head_rgb becomes observation.images.head, hand and body pose get flattened into observation.state in a fixed hands-then-body order, and depth has to be pulled from the HDF5 export since it is not embedded in LeRobot’s mp4 layout. It is usually simpler to request the format your pipeline already expects at delivery time than to convert afterward, but Firsthand ships the RLDS converter as readable source specifically so the field mapping can be retargeted if your loader needs something different.
How do you specify the delivery format in a pretraining request?
The delivery format is one line in a collection spec, alongside the skill list, streams and label set — it does not change the price or the collection process, since every format is generated from the same captured episodes. Name the format your training stack already loads (RLDS for TFDS pipelines, LeRobot for the smallest footprint, WebDataset for shard-streamed training, HDF5/zarr if you want to verify sync yourself) when requesting a custom pretraining dataset, and Firsthand exports it directly rather than requiring a separate conversion step after delivery.
FAQ
What Format Should Robot Pretraining Data Be Delivered In?, answered.
01What format should I choose for a robot pretraining corpus?
Pick the format your training stack already loads: RLDS for TFDS-based pipelines that want native-rate streams and inline depth, LeRobot for the smallest on-disk footprint and LeRobot-based tooling, or WebDataset for shard-streamed training beyond local disk. All three are generated from the same episode schema, so no format is missing data the others have.
02Does every delivery format include depth data?
No. RLDS, WebDataset and HDF5/zarr all carry depth directly (observation.depth_mm, depth.png, or streams/depth_mm respectively), but LeRobot’s mp4-based layout does not embed depth — it has to be pulled from the accompanying HDF5 export if your policy consumes depth.
03How is a pretraining corpus sharded for streaming?
RLDS ships in roughly 1.9 GB tfrecord shards, one skill line per directory. WebDataset ships in .tar shards of 512 samples, streamed from signed URLs and shuffled across shards. LeRobot follows the v2.1 parquet-plus-mp4 dataset layout. HDF5/zarr organizes one group per episode with time-major 30-frame chunks for random access.
04What is the difference between the episode schema and a delivery format?
The episode schema is the canonical four-group layout (meta, streams, annotations, calibration) that every delivery format is a projection of. RLDS, LeRobot, WebDataset, HDF5/zarr and Rerun .rrd package that same underlying data differently for different loading libraries and use cases.
05Can I inspect a pretraining episode before writing a loader?
Yes — Rerun .rrd puts every stream (camera, hands, point cloud, sync-error plot) on one shared timeline in a single recording per episode. It is not a training format; it is the recommended way to look at the data and verify alignment before writing training code against RLDS, LeRobot or WebDataset.
06Can I convert RLDS to LeRobot after delivery instead of requesting a specific format?
Yes, since both project from the same episode schema — see the RLDS-to-LeRobot conversion guide for the field-by-field mapping. But it is simpler to specify the format your pipeline already expects in the collection request than to convert afterward.
07How do IMU and hand-pose fields differ between RLDS and WebDataset?
RLDS exposes observation.hand_joints as a direct step key. WebDataset packs hand_joints inside each sample’s ann.json alongside action and contact_events. Both ultimately come from the same annotations/hand_joints field in the episode schema, just packaged differently.
08Does the delivery format change the price or collection process for pretraining data?
No. The delivery format is specified alongside the skill list, streams and label set in the collection spec, but every format is generated from the same captured episodes — choosing RLDS, LeRobot, WebDataset or HDF5/zarr does not change how the data is collected.
Sources
Where is this documented?
- RLDS (GitHub) (opens in a new tab)Official RLDS repository and step/episode structure documentation. github.com
- LeRobot (GitHub) (opens in a new tab)Official LeRobot repository, dataset loader, and v2.1 layout documentation. github.com
- WebDataset (GitHub) (opens in a new tab)Official WebDataset repository and sharded tar-archive streaming documentation. github.com
Check it against the sample pack.
40 episodes across 4 environments, delivered in the exact schema these guides describe.