Files
cvmmap-streamer/docs/mcap_legacy_single_camera_layout.md
crosstyan d0f3dc5cf1 docs(mcap): split legacy single-camera layout reference
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.
2026-03-24 18:56:52 +08:00

61 lines
2.6 KiB
Markdown

# 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 `copy` uses `/{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](./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/pose` use 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/video` must exist and contain at least one message
- `/camera/depth` must exist and contain at least one message
- `/camera/calibration` must exist exactly once
- `/camera/video` and `/camera/depth` message counts must match
- `/camera/depth_calibration` may appear zero or one time
- `/camera/pose` is optional, but it may not outnumber `/camera/video`