Views
Each camera stream is one channel offoxglove.CompressedVideo, foxglove.CompressedImage or
foxglove.RawImage messages, declared in the overlay’s views array with the role a media
message cannot carry:
- Top-level
primary_viewSHOULD name the recording’s default view and, when present, MUST name a declared view’s channel. It MAY be omitted for a LiDAR-only recording. - Keep multi-camera rigs as separate views. Do not pre-stitch a mosaic: it destroys per-camera geometry and cannot be undone.
Roles
role is free text. These canonical roles have a defined meaning; an unrecognised role is
accepted, with a warning, and kept as a label, so an unusual rig is never blocked.
- A camera that is not on the body (fixed in the world, e.g. a third-person view of a robot or
a person) uses
external_<n>. Any kind of body MAY have external cameras. - On a robot, the main body or head camera is usually
front(oregoon a humanoid or head-worn rig); a camera on the end effector iswrist_leftorwrist_right. range_imageandrange_image_rgbare reserved: views with these roles are generated from LiDAR at ingest. Do not declare them.
Intrinsics
Publish each camera’s intrinsics as afoxglove.CameraCalibration message (not declared in the
overlay):
Intrinsics are per camera; cameras on one rig routinely differ. Omitting
D means the images are
rectified. Do not publish a zero D for unknown distortion: it makes “rectified” and “distortion
unknown” indistinguishable.
Encodings
Compressed video
foxglove.CompressedVideo data follows the Foxglove definition: Annex B byte stream, each message
exactly one frame, keyframes carrying their parameter sets. In addition:
- No B-frames. Decode order MUST equal presentation order, because the video is rebuilt by
concatenating message payloads in
log_timeorder. Encode with-bf 0(ffmpeg) for both h264 and h265. An h265 stream with B-frames is rejected. - If your source is h265 with B-frames, re-encode with
-bf 0(to h264 or h265) or publish afoxglove.CompressedImagesequence instead.
Image sequences
CompressedImage and RawImage sequences are assembled into video using the message timestamps,
so irregular frame intervals are preserved.