feat(record): add raw ZED body MCAP capture
This commit is contained in:
@@ -86,6 +86,10 @@ If you need audio transport, muxing, or A/V sync, that is outside the current re
|
||||
|
||||
MCAP recording stores one `foxglove.CompressedVideo` message per encoded access unit. Replay depends on encoded keyframes carrying decoder configuration; this is handled by the current writer on keyframes.
|
||||
|
||||
### MCAP Body Recording Is Raw Packet Capture
|
||||
|
||||
When the producer exposes ZED body tracking, MCAP recording stores one raw `cvmmap.body_tracking.v1` message per body PUB packet on `/camera/body` by default. These payload bytes are not normalized by `cvmmap-streamer`; downstream consumers should parse them with the cv-mmap body-tracking v1 contract.
|
||||
|
||||
## External Server Caveats
|
||||
|
||||
### Local SRS Defaults Can Hit `ulimit`
|
||||
|
||||
@@ -45,6 +45,7 @@ MCAP support is validated separately with:
|
||||
|
||||
- `./build/mcap_reader_tester`
|
||||
- `./build/mcap_replay_tester`
|
||||
- `./build/mcap_body_record_tester`
|
||||
- `./scripts/replay_mcap.sh`
|
||||
|
||||
Current recording scope:
|
||||
@@ -53,6 +54,7 @@ Current recording scope:
|
||||
|--------|-------|-------|
|
||||
| MCAP `foxglove.CompressedVideo` | H.264 | Stored as Annex B access units |
|
||||
| MCAP `foxglove.CompressedVideo` | H.265 | Stored as Annex B access units |
|
||||
| MCAP raw body packets | `cvmmap.body_tracking.v1` | Payload bytes are identical to the cv-mmap ZED body PUB packet |
|
||||
|
||||
## Current Defaults
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user