Now recruiting capture teams worldwide. Get paid to record first-person video of real work.

Apply to capture

Comparison

MCAP vs LeRobot Format for Robot Training Data

MCAP is an open container for timestamped messages on channels; LeRobotDataset is a training layout of Parquet, MP4 video and metadata.

Short answer

MCAP is an open container for timestamped messages on channels, built for logging multimodal robot data. LeRobotDataset is a training-ready layout: Parquet for state and action, MP4 for camera video, plus metadata. MCAP suits recording and replay; LeRobot suits loading into LeRobot training. Firsthand delivers both; the site states MCAP delivery and the LeRobot v2.1 layout.

Spec comparison

MCAP and LeRobotDataset side by side, as each project documents itself.

PropertyMCAP (mcap.dev, foxglove/mcap)LeRobotDataset (Hugging Face docs, huggingface/lerobot)
What it isOpen source container file format for multimodal log data; a Foxglove projectA standardized format for robot learning data: multi-modal time-series data, sensorimotor signals and multi-camera video, with rich metadata
Built forPub/sub logging and robotics applicationsRecording, storing, sharing and training on robot demonstrations in the LeRobot library
Core structureMultiple channels of timestamped, pre-serialized messages in one fileParquet for tabular state and action data, MP4 for camera video, and JSON or Parquet metadata
Message encodingSerialization-agnostic: Protobuf, DDS (CDR), ROS, JSON and moreFixed by the format: named features such as action and observation.state, with schema in metadata
SchemaStored alongside the data, so files stay readable as code evolvesDescribed in meta/info.json: feature names, dtypes, shapes, frame rates and path templates
Optional featuresChunking, indexing, CRC checksums, LZ4 or Zstandard chunk compressionImages or MP4 video per camera; image transforms are applied at training time, not stored
ReaderNative libraries in C++, Go, Python, Rust, Swift and TypeScript, plus a CLILeRobotDataset in Python, returning dictionaries of PyTorch tensors, and a streaming variant for the Hugging Face Hub
EpisodesNot a concept of the containerFirst-class: episode boundaries are resolved through metadata
LicenceMIT (repository)Apache License 2.0 (repository)
Firsthand deliveryMCAP delivery stated; dataset 06 ships as MCAPLeRobot v2.1 layout stated; custom orders can name LeRobot

Spec comparison

Firsthand streams and what the site states for each delivery format.

Stream or itemWhat the site statesIn a LeRobot deliveryIn an MCAP deliveryQuestion for the spec
Head and wrist RGBhead_rgb and wrist_l/r in the episode schemaFeatures observation.images.head and observation.images.wrist_l/r, one mp4 per cameraNot statedIn MCAP, are they channels, and in what encoding?
Hand and body pose21 joints per hand with a per-joint visibility flag; body jointsPacked into observation.state: 2×21×3 hand joints flattened, then 24×3 body jointsChannel layout and joint order not statedWhich joint order, and is visibility kept?
ActionsListed in the episode schemaAn action featureNot statedAre actions inside the MCAP file?
Stereo pairDual fisheye, 1080p per eye, 62 mm baseline (dataset 06)Not stated; the listed features are head and wrist camerasDataset 06 is stated as shipped as MCAP; channel layout not statedHow is each eye carried, and in which format?
Depthdepth_mm and depth_conf; metric depth, 848×480 at 30 HzNot embedded in the mp4; pull it from the HDF5 exportNot statedIs depth in the file you are buying?
IMU9-axis on dataset 06; head and two wrist IMU streams in the episode schemaNot statedChannel layout and rate not statedWhich streams and rates?
Timestamps and syncHardware-triggered onto one clock; median 1.12 ms, 2.0 ms ceilingPer-frame timestamps aligned to the head-camera clockHow sync maps to message times not statedHow do you verify alignment in the delivered file?
CalibrationPer-unit on dataset 06; measured every session and shipped with the episodeNot statedPlacement in the file not statedInside the file or beside it?
Version, topics, rates, file sizes, indexNot stated beyond LeRobot v2.1v2.1 layout statedAgreed in the skill spec and confirmed on a Spec PilotWhich LeRobot version? Chunked, indexed, CRC?
Left to right: the stream, what the site states about it, what the site states for a LeRobot delivery, what the site states for an MCAP delivery, and the question to settle in the skill spec. Not stated means the site does not say.

Spec comparison

LeRobotDataset v2.1 and v3.0, as the official documentation describes them.

Itemv2.1 (site delivery)v3.0 (official docs)
FilesPer-episode Parquet and mp4 files, per the v3.0 migration notesMany episodes per Parquet or MP4 file
Episode lookupPer-episode filesEpisode boundaries and offsets resolved through metadata
StreamingNot statedStreamingLeRobotDataset streams from the Hugging Face Hub
LibraryLoads with lerobot.common.datasets, as the site statesIncluded in lerobot 0.4.0 and later; imports from lerobot.datasets
MigrationNot applicableA converter aggregates v2.1 per-episode files into shards and writes episode offsets
Recording noteNot statedCall dataset.finalize() before pushing, or the Parquet files are incomplete
The site states the v2.1 layout. The official docs describe v3.0, so confirm the version in the skill spec. Not stated means the site does not say.

Spec comparison

Which format fits which situation?

Your situationBetter fitWhy, per the sources
You train policies with the LeRobot libraryLeRobotLeRobotDataset returns PyTorch tensors and plugs into the training scripts
You record and replay multi-stream sensor logsMCAPmcap.dev describes pub/sub logging of timestamped multi-channel data
Your reader is Python, Go, Rust, Swift, TypeScript or C++ and not LeRobotMCAPmcap.dev lists native libraries in those languages
You want files readable as your code evolvesMCAPSchemas are stored alongside the data
You want one episode-aware dataset to stream from the Hugging Face HubLeRobot v3.0The docs describe StreamingLeRobotDataset for v3.0
You want stereo head rig data as deliveredMCAPDataset 06 is stated as shipped as MCAP
You need depth in the fileNeither aloneThe site says depth is not embedded in the LeRobot mp4; MCAP depth is not stated
You need both inspection and trainingBothThe same episodes are stated to ship in several formats; name each in the spec
A decision aid built only from what the official documentation and the Firsthand site state. It is not a benchmark.

Decision

MCAP or LeRobot: which should a robot learning lab choose?

They answer different questions, so the choice is about where the data goes next. MCAP, per mcap.dev, is an open source container file format for multimodal log data, with multiple channels of timestamped pre-serialized messages. LeRobotDataset, per the Hugging Face docs, is a standardized format for robot learning data that pairs tabular signals with multi-camera video and metadata. If you are logging and replaying sensor streams, MCAP is the natural container. If you are training in the LeRobot library, LeRobotDataset is the layout it reads.

This page is a decision guide for labs choosing how stereo egocentric training data is delivered. It is not a benchmark. The sources read for it state no read speeds, write speeds, compression ratios or file sizes for either format, and the Firsthand site states none for its deliveries, so none appear here. Where a detail is missing the page says Not stated. Firsthand is not affiliated with Foxglove, Hugging Face or the LeRobot maintainers.

Firsthand offers MCAP delivery and the LeRobot v2.1 layout. Where coverage is deep, the median to first validated batch is 48 hours, and for work the catalog does not cover yet, Firsthand runs custom collection at scale through a network of thousands of capture providers, for a consistent, recurring data flow to labs.

MCAP

What is MCAP, per its own documentation?

The mcap.dev home page describes MCAP as an open source container file format for multimodal log data, ideal for pub/sub or robotics applications. It is a Foxglove project, and the foxglove/mcap README calls it a modular, performant, serialization-agnostic container under the MIT License. Serialization-agnostic means the container does not dictate the message encoding: the home page lists Protobuf, DDS (CDR), ROS and JSON among the formats it can record and replay.

The design is row-oriented and append-only, to minimize disk I/O and reduce the risk of corruption during unclean shutdowns. Schemas are stored alongside the data. An optional index allows efficient seeking, even over a low-bandwidth connection, and chunk compression can use LZ4 or Zstandard while still supporting indexed reads. Chunking, indexing, CRC checksums and compression are optional, so a given file may or may not have them. The home page also says MCAP is the default log format in ROS 2, and the README gives the media type application/vnd.mcap.

LeRobot

What is the LeRobot dataset format, per the official docs?

The huggingface/lerobot README describes LeRobot as models, datasets and tools for real-world robotics in PyTorch, and says LeRobotDataset is a standardized, scalable format hosted on the Hugging Face Hub. Its structure is synchronized MP4 videos (or images) for vision and Parquet files for state and action data. The README lists tools to delete episodes, split by indices or fractions, add or remove features, and merge datasets. The repository is listed under the Apache License 2.0.

The LeRobotDataset v3.0 documentation names three pillars. Tabular data, meaning states, actions and timestamps, lives in Apache Parquet. Visual data is camera frames concatenated and encoded into MP4, sharded per camera. Metadata is JSON or Parquet describing feature names, dtypes, shapes, frame rates, normalization statistics and episode segmentation. The directory layout holds meta/info.json, meta/stats.json, meta/tasks.jsonl, meta/episodes/, data/ and videos/. The docs say image transforms are applied at training time and raw images are stored, so augmentation can change later without re-recording.

Kind

Are MCAP and LeRobot the same kind of format?

No. MCAP is a container: it holds messages on channels and says nothing about what a robot episode is. LeRobotDataset is a dataset layout: it names features like action and observation.state, ties them to episodes and tasks, and is read by a loader that returns tensors. That is why the comparison is less a rivalry than a question of which layer you need.

The practical consequence is that an MCAP file needs a mapping step before a LeRobot training run, and a LeRobotDataset has no channel model for replaying a live message stream. The site states no converter from an MCAP delivery to LeRobot, so if you need both, name both in the skill spec rather than assuming one derives from the other.

Time

How does each hold time-stamped multi-stream data?

In MCAP a multi-stream recording is a set of channels on one time axis, each message carrying its timestamp, per mcap.dev. In LeRobotDataset, low-dimensional high-frequency signals such as states, actions and timestamps are stored as Parquet rows, and video frames sit in per-camera MP4 files. The loader can return temporal windows through delta_timestamps, which are seconds relative to the current frame, for example the frames 0.2 and 0.1 seconds earlier.

For Firsthand capture, the site states hardware-triggered synchronization onto one clock, with a 1.12 ms median and a 2.0 ms ceiling. In the LeRobot delivery the site states per-frame timestamps aligned to the head-camera clock. For an MCAP delivery the site does not state how that sync maps to message times, so ask for it, and verify alignment in the delivered file rather than assuming the container preserves it.

Version

Which LeRobot version does Firsthand deliver?

The site states the v2.1 layout: parquet plus one mp4 per camera in the Hugging Face datasets layout, loading with lerobot.common.datasets. The official docs now describe LeRobotDataset v3.0, where many episodes share each Parquet or MP4 file and episode boundaries come from metadata. They say v3.0 is included in lerobot 0.4.0 and later and ship a converter that aggregates v2.1 per-episode files into larger shards.

That gap is worth an explicit line in the skill spec. If your training stack is on v3.0, ask whether you need v3.0 or the stated v2.1 layout plus a conversion step. The site does not state a v3.0 delivery, so this page does not claim one. The version table above sets the two side by side from the sources.

Streams

Which Firsthand streams map to each format?

The site states these streams for its stereo egocentric work: a stereo pair from dual fisheye cameras at 1080p per eye with a 62 mm baseline on dataset 06, head and wrist RGB, metric depth at 848×480 and 30 Hz, hand pose of 21 joints per hand with a per-joint visibility flag, and a 9-axis IMU on dataset 06. Calibration is measured every session and shipped with the episode. The streams table above sets each against what the site states for a LeRobot and an MCAP delivery.

For LeRobot the site is specific: features observation.images.head, observation.images.wrist_l and wrist_r, observation.state and action, with hand and body pose packed into the state vector, hands first. Depth is not embedded in the mp4, so pull it from the HDF5 export if your policy consumes it. The site does not state that the stereo pair is a LeRobot feature. For MCAP the honest gap is the file layout: the site does not state topic names, message schemas, encodings, rates or which streams are channels. Those are agreed in the skill spec and confirmed on a Spec Pilot.

Choose

When would a lab pick MCAP, and when LeRobot?

Pick MCAP when you want several streams on one time axis with an optional index for seeking, when you inspect data from the MCAP CLI (installable with brew install mcap), or when your tooling already reads ROS 2 logs, since mcap.dev calls MCAP the default log format in ROS 2. Native libraries exist in C++, Go, Python, Rust, Swift and TypeScript, and the repository is MIT licensed. MCAP is a container of messages, not an episode schema, so if you need episode boundaries or action segments inside the file, say so in the spec.

Pick LeRobot when your policies train with the LeRobot library (pip install lerobot, with extras such as lerobot[dataset] and lerobot[training]) and you want LeRobotDataset returning PyTorch tensors to a DataLoader. The repository is Apache License 2.0. Video is mp4, so the site warns decoding is the bottleneck: use the dataset’s built-in video backend rather than decoding per item. Depth is not in the mp4, and datasets you record yourself need finalize() before pushing, per the docs.

Both

Do you have to choose only one, and can you convert between them?

No. The site states that a custom order is packaged in the format you name, such as MP4 with JSON or CSV, MCAP, LeRobot or a custom layout, and that the same captured and annotated episodes ship as RLDS, LeRobot, WebDataset, HDF5 and zarr, with Rerun .rrd for inspection. MCAP is one option among them.

The sources read document no MCAP-to-LeRobot converter, and the site states none, so treat any conversion as work to scope. The only documented LeRobot conversion is the official v2.1 to v3.0 migration. For the training-format side of the choice, the RLDS vs LeRobot comparison covers the alternatives, and the MCAP vs ROS bag and MCAP vs HDF5 pages cover the container side.

Task examples

Which tasks show the difference in practice?

The kitchen catalog on this site lists knife work, with dice, julienne and chiffonade, noted as fine bimanual dexterity, tool grip and control. The site’s own LeRobot loading snippet is built around a kitchen knife dicing example. For that task a policy lab training with LeRobot wants the head and wrist cameras, the pose state vector and the action feature in LeRobotDataset form, with hand visibility intact for the fine grip phases.

A lab studying the same task with stereo geometry, calibration and an IMU timeline wants the stereo head rig as MCAP, where the streams stay separate channels on one clock. Those are two reads of the same skill, and the catalog rows set the actual task list. The spec states which streams matter for the skill and which format carries them.

Failure modes

What goes wrong when a lab picks a robot data format?

The first failure is assuming the container fixes the schema. MCAP leaves message encoding to you, so write down topic names and encodings before the first batch. The second is a version mismatch: a loader on LeRobot v3.0 expecting file-based shards, handed a v2.1 per-episode layout. The third is losing the stream you needed: depth is not in the LeRobot mp4, and the stereo pair is not a stated LeRobot feature.

The fourth is slicing observation.state in the wrong order, since hands come before body. The fifth is trusting a conversion: the site does not state a converter in either direction, so test one on a Spec Pilot before volume. The sixth is assuming sync survived export. The site states a 2.0 ms ceiling at capture, so verify alignment in the delivered file, whichever format it uses. The seventh is an unindexed MCAP file when you need seeking by time, because indexing is optional.

Delivery

What does Firsthand deliver, and what does the site not state?

Firsthand offers MCAP delivery and exports the LeRobot v2.1 layout directly. The off-the-shelf stereo head rig, dataset 06, ships as MCAP with dual fisheye cameras at 1080p per eye, a 62 mm baseline, per-unit calibration, a 9-axis IMU and hand-tracking output. Off-the-shelf coverage and custom collection work together: start from the off-the-shelf pages to see formats and streams, then specify custom collection for the skills and environments you need. Custom collection runs at scale through a network of thousands of capture providers, for a consistent, recurring data flow to labs.

The site does not state MCAP topic names, message schemas, encodings, rates or files per episode, whether its MCAP files use chunking, compression, CRC checksums or an index, or a LeRobot v3.0 delivery. Those are questions for the skill spec and a Spec Pilot. For a format example, see the stereo sample clip page, which shows rig output and is a format example, not an MCAP file or a LeRobotDataset.

Order

How do you request a custom dataset in MCAP or LeRobot?

Write a skill spec that names the task, the environment and the streams you need, and name the delivery format: MCAP, LeRobot, another format the site lists, or several. If your loader is on a specific LeRobot version, say so. Confirm the layout on a Spec Pilot, then pay per validated hour. Where coverage is deep, the median to first validated batch is 48 hours.

For work that needs scale, custom collection runs at scale through a network of thousands of capture providers, for a consistent, recurring data flow to labs. Use the Request a custom dataset link below, or read the stereo MCAP hub page and the LeRobot format page first for the delivery detail.

Example footage

What the stereo rig output looks like.

A published stereo head-rig clip. It shows the capture both formats would carry, not a file in either format.

egocentric_stereo_sample.mp4 · head-mounted stereo · hands in frame · 1920 × 1080 web preview · rig example

No MCAP or LeRobot file is published on the site, so this is the nearest rig clip and a format example only. Request a sample to see delivered files. See stereo sample clip page, egocentric stereo data in MCAP format.

FAQ

Common questions.

What is the difference between MCAP and the LeRobot format?

MCAP is an open source container for timestamped messages on channels. LeRobotDataset is a training layout of Parquet for state and action, MP4 for camera video, and metadata. One is a log container, the other a dataset format read by the LeRobot library.

Is MCAP or LeRobot better for robot learning data?

Neither in the abstract. LeRobot suits training in the LeRobot library; MCAP suits recording and replaying multi-stream logs. The sources give no speed or size comparison, so this page makes no such claim.

Which LeRobot version does Firsthand deliver?

The site states the v2.1 layout, with parquet plus one mp4 per camera. The official docs describe v3.0, so confirm the version you need in the skill spec. A v3.0 delivery is not stated on the site.

Does Firsthand deliver stereo egocentric data in MCAP?

Yes, MCAP delivery is stated, and dataset 06, a calibrated stereo head rig, ships as MCAP. Topic names, schemas, rates and which streams are channels are not stated and are agreed in the skill spec.

Can an MCAP file be turned into a LeRobot dataset?

Not stated. The sources read document no MCAP-to-LeRobot converter and the site states none. If you need both, name both formats in the spec and test the result on a Spec Pilot.

Can I request a custom dataset in either format?

Yes. Write a skill spec, name MCAP, LeRobot or both, confirm it on a Spec Pilot and pay per validated hour. Where coverage is deep, the median to first validated batch is 48 hours.

Judge it on your own skill spec.

Get the free 40-episode sample pack, or send us your target skills and hours for a scoped quote.