Skip to main content

One file, one recording

One MCAP file is one recording: one continuous capture from one rig, robot or person. A recording SHOULD cover one logical scene or episode, because it is the unit that is uploaded, retried and displayed. Split a long drive into scenes, or a teleoperation session into episodes, in your converter.

Channels

Every channel MUST use message_encoding: "protobuf", with its schema registered as a protobuf FileDescriptorSet (schema.encoding: "protobuf") named by the message’s full name, e.g. foxglove.CompressedVideo. The mcap-protobuf-support library does this for you; see Writing a converter. Channel rules:
  • A channel topic MUST start with / and contain only printable ASCII with no whitespace (^/[!-~]*$), e.g. /cam/front, /sig/speed.
  • Every channel the overlay names MUST exist in the file and carry the message schema its declaration requires.
  • One channel carries exactly one thing. A channel MUST NOT be declared twice, whether as two views, a view and a signal, or a signal and a part’s pose.
  • Only declared views, point clouds and signals are part of the recording. A camera channel the overlay does not list in views is not ingested as a camera.

A recording must have a video

Every recording MUST resolve to at least one video view: either a declared camera, or a LiDAR whose points carry a ring field (it is rendered as a range-image video, see Point clouds). A file with signals only, or a LiDAR without ring and no camera, is rejected.

The nomadic_spec overlay

Every file MUST contain an MCAP metadata record named nomadic_spec, with one key, spec, whose value is the overlay serialized as a JSON string. It MUST be a metadata record, not an attachment or a message. Metadata records are indexed in the MCAP summary section, so the overlay can be read without scanning the file.
The overlay carries only what the Foxglove schemas cannot express: each view’s role, each point cloud’s kind, each signal’s name, type and unit, and the recording and body metadata. Pixels, points, transforms and intrinsics are in the messages, never in the overlay.

Top-level fields

An overlay MUST declare at least one view, point cloud, signal or part. Unknown keys MUST NOT appear anywhere in the overlay; the JSON Schema forbids them. A typo such as point_cloud is rejected rather than silently dropping a modality.

A minimal overlay