# MCAP ZED Body Tracking Contract `cvmmap-streamer` records native cv-mmap ZED body-tracking packets into MCAP as a raw binary channel. ## Channel - default topic: `/camera/body` - `messageEncoding`: `cvmmap.body_tracking.v1` - schema: none (`schemaId = 0`) - channel metadata: - `packet_layout = cvmmap_body_tracking_v1` - `payload_format = raw` - `source_transport = cv-mmap-body-pub` The channel is created lazily on the first valid body packet, so non-body inputs do not produce an empty `/camera/body` channel. ## Payload Each MCAP message payload is byte-for-byte identical to the cv-mmap ZED body PUB packet: - 64-byte `body_tracking_message_header_t` - followed by `body_count` packed `body_tracking_body_t` records The intended parser contract is the existing cv-mmap body-tracking v1 layout: - `cvmmap::parse_body_tracking_message(...)` - `cv-mmap/docs/cvmmap_body_tracking_v1.ksy` This recording path does not remap joints, filter fields, or convert the packet into protobuf/JSON. ## Timing And Alignment - `logTime` and `publishTime` use `header.timestamp_ns` - if `header.timestamp_ns == 0`, they fall back to `header.sdk_timestamp_ns` - cross-topic alignment should use body `frame_count` and timestamps, not MCAP file order ## Configuration MCAP body capture follows the normal MCAP recording switch: - enable MCAP with `--mcap` or `record.mcap.enabled = true` - override the body topic with `--mcap-body-topic` or `record.mcap.body_topic` There is no separate body-enable flag. If the input never emits body packets, no body channel is written.