d0f3dc5cf1
Move the legacy /camera/* contract into its own reference page so the main MCAP layout doc can stay focused on current bundled and copy-layout behavior. Document the compatibility model explicitly: legacy single-camera is operationally equivalent to one-camera copy when the effective camera label is treated as the literal `camera`. Update the mcap_rgbd_example helper and recipe docs to accept legacy /camera/* inputs under that compatibility rule instead of rejecting them.
2.6 KiB
2.6 KiB
Legacy Single-Camera MCAP Layout
This page is the reference for the older /camera/* MCAP wire shape.
It is still used by some generic sink/tester paths in the repository, but it is no longer the default shape written by zed_svo_to_mcap for a single .svo or .svo2 input.
Compatibility With Copy Layout
In practice, this layout is very close to the one-camera copy shape:
- legacy single-camera uses
/camera/video,/camera/depth, and related/camera/*topics - one-camera
copyuses/{label}/video,/{label}/depth, and related/{label}/*topics
So the compatibility mental model is:
- treat the camera label as the literal
camera - replace
/{label}/...with/camera/... - there is still no
/bundle - timestamps remain per-camera sample timestamps
That is why legacy single-camera is conceptually compatible with copy, even though the topic paths are not namespaced the same way.
Topics
| Topic | Schema / Encoding | Notes |
|---|---|---|
/camera/video |
foxglove.CompressedVideo |
H.264 or H.265 Annex B access units |
/camera/depth |
cvmmap_streamer.DepthMap |
RVL-compressed depth payload |
/camera/calibration |
foxglove.CameraCalibration |
Video intrinsics |
/camera/depth_calibration |
foxglove.CameraCalibration |
Written only when depth resolution differs from video |
/camera/pose |
foxglove.PoseInFrame |
Optional; only when pose export is enabled and tracking is valid |
/camera/body |
raw cvmmap.body_tracking.v1 |
Optional raw body-tracking packets; see mcap_body_tracking.md |
Timestamp Semantics
Legacy single-camera export preserves the original per-frame source timestamp on video, depth, and pose messages.
Like copy, there is no separate bundle time:
/camera/video,/camera/depth, and/camera/poseuse the original camera sample timestamp- calibration and depth-calibration messages use the timestamp of the first emitted sample
Corruption Behavior
Like copy, this layout has no manifest or placeholder contract:
- unreadable tail frames are treated as end-of-stream
- mid-stream corruption is skipped until a readable frame is found
- the topic stream simply resumes at the recovered readable frame
Validation Expectations
The current validation contract is:
/camera/videomust exist and contain at least one message/camera/depthmust exist and contain at least one message/camera/calibrationmust exist exactly once/camera/videoand/camera/depthmessage counts must match/camera/depth_calibrationmay appear zero or one time/camera/poseis optional, but it may not outnumber/camera/video