Skip to content

Config Reference

Full reference for every field in config.yaml. This page is the authoritative source — check here when you need a specific knob.

api_key: "ak_xxxxx"
robot_name: "lab-robot"
FieldTypeDefaultDescription
api_keystringAPI key for connecting to Adamo cloud. Fetches the router endpoint and org slug from the API at startup. Required unless zenoh.router is set directly.
robot_namestringauto-generatedRobot identifier shown in the web interface. Used in Zenoh topic paths: adamo/{org}/{robot_name}/video/{track}. If omitted, a random name is generated at startup (e.g., robot-a7k9m).

Controls how the robot connects to the Zenoh network.

zenoh:
mode: "client"
protocol: "quic"
FieldTypeDefaultDescription
routerstringDirect Zenoh router endpoint (e.g., quic/zenoh.adamohq.com:443). Bypasses the API lookup if set. Useful for self-hosted routers or testing.
modestring"peer""client" routes all traffic through the cloud router. "peer" enables direct P2P connections between robots on the same LAN or VPN; the cloud router is still used for discovery and as a fallback when direct paths are unavailable.
listenstring[][]Local endpoints this robot listens on in peer mode, allowing other peers to connect to it directly. Example: ["udp/0.0.0.0:7447", "tcp/0.0.0.0:7447"]. Has no effect in "client" mode.
protocolstring"quic"Transport protocol for the cloud router connection: "quic", "tcp", or "udp". QUIC is recommended — it multiplexes streams over a single UDP socket and handles NAT traversal well.

Controls the ROS-Zenoh bridge integration.

ros:
enabled: true
backend: "ros2dds"
domain_id: 0
auto_start_bridge: true
FieldTypeDefaultDescription
enabledbooltrueEnable ROS-Zenoh bridging. When enabled, ROS topics are bridged into the Zenoh key space and ros_* video source types are available.
backendstring"ros2dds"Backend for key expression mapping. "ros2dds" uses the embedded zenoh-bridge-ros2dds process. "rmw-zenoh" uses the rmw_zenoh_cpp middleware layer instead.
domain_idint0ROS domain ID. Set this to match your ROS nodes if using a non-default domain.
auto_start_bridgebooltrueAutomatically start the embedded zenoh-bridge-ros2dds process when backend is "ros2dds". Set to false if you are managing the bridge process yourself.

Controls the Zenoh-to-ROS control relay. When enabled, control messages published to the Zenoh prefix are forwarded to ROS.

control:
enabled: true
zenoh_prefix: "adamo/my-robot/control"
FieldTypeDefaultDescription
enabledbooltrueEnable the Zenoh-to-ROS control relay.
zenoh_prefixstring"adamo/{robot}/control"Zenoh key prefix to subscribe to for incoming control messages. Defaults to adamo/{robot_name}/control using the resolved robot name. Override this if you need a custom topic path.

An array of video track configurations. Each entry defines one video stream published over Zenoh.

video_tracks:
- name: "front"
source_type: "v4l2"
v4l2_device: "/dev/video0"
encoder: "auto"
bitrate: 4000
fps: 30
FieldTypeDefaultDescription
namestring"video"Track name. Appears in the Zenoh topic path: adamo/{org}/{robot}/video/{name}. Use short, descriptive names like "front", "rear", "depth".
source_typestring"v4l2"Video source. See Source Types below.
encoderstring"x264enc"H.264 encoder. See Encoder Options below. Use "auto" to let Adamo pick the best available encoder.
bitrateint2000Target bitrate in kbps. Starting bitrate for adaptive bitrate tracks.
fpsint30Target framerate.
ValueDescription
jetson_argusJetson CSI camera via the Argus API. High-quality capture path, supports ISP tuning. Requires --features jetson.
jetson_nvv4l2Jetson CSI camera via NVIDIA V4L2. Alternative capture path for Jetson. Requires --features jetson.
v4l2Standard V4L2 camera. Works with USB webcams and most Linux-connected cameras.
gstreamerCustom GStreamer pipeline. Provide the full pipeline string via gstreamer_pipeline.
ros_auto / rosAuto-detect ROS message type from the topic name. Infers compressed, H.264, FFMPEGPacket, or raw image based on the topic string. Requires ros_topic.
ros_imageROS sensor_msgs/Image (raw pixel data). Re-encodes to H.264 before publishing. Requires ros_topic.
ros_compressed_imageROS sensor_msgs/CompressedImage. Decodes JPEG/PNG then re-encodes. Requires ros_topic.
ros_h264ROS H.264 passthrough. Forwards the compressed H.264 stream directly without re-encoding. Requires ros_topic.
ros_h264_transcodeROS H.264 decode and re-encode. Use when you need to change bitrate or keyframe behavior. Requires ros_topic.
ros_ffmpeg_packetROS FFMPEGPacket passthrough. No re-encoding. Requires ros_topic.
ros_ffmpeg_packet_transcodeROS FFMPEGPacket decode and re-encode. Requires ros_topic.
lidar_pcdLidar point cloud files converted to a range image video stream. Requires lidar_pcd_dir.
FieldApplies toTypeDescription
v4l2_devicev4l2stringDevice path (e.g., "/dev/video0").
v4l2_capture_resolutionv4l2[int, int]Capture resolution as [width, height]. Must match a resolution the camera supports.
ros_topicros_*stringROS topic name to subscribe to (e.g., "/camera/image_raw").
gstreamer_pipelinegstreamerstringGStreamer launch string. The pipeline should produce raw video frames. Note: shorthand capsfilter syntax does not work — use capsfilter caps=<caps> explicitly.
source_formatv4l2, gstreamerstringPixel format hint passed to the encoder pipeline (e.g., "bgra" for ZED cameras, "BGRA").
lidar_pcd_dirlidar_pcdstringDirectory containing .pcd files for playback.
lidar_widthlidar_pcdintRange image width in pixels. Default: 2048.
lidar_heightlidar_pcdintRange image height in pixels. Default: 64.
lidar_fpslidar_pcdintPlayback framerate. Default: 10.
lidar_range_scalelidar_pcdfloatMeters per unit in the 24-bit range image encoding. Default: 0.001.
lidar_range_biaslidar_pcdfloatRange bias offset in meters. Default: 0.0.
lidar_azimuth_minlidar_pcdfloatMinimum azimuth angle in radians. Default: .
lidar_azimuth_maxlidar_pcdfloatMaximum azimuth angle in radians. Default: π.
lidar_elevation_minlidar_pcdfloatMinimum elevation angle in radians. Default: -0.2618 (~-15°).
lidar_elevation_maxlidar_pcdfloatMaximum elevation angle in radians. Default: 0.2618 (~15°).
lidar_looplidar_pcdboolLoop the PCD files indefinitely. Default: true.
EncoderHardwareNotes
autoAuto-detectProbes the GStreamer plugin registry at startup and selects the best available encoder in priority order. Recommended for most deployments.
nvv4l2h264encJetson dedicated NVENCBest choice on Jetson platforms. Uses the on-chip video encoder, leaving the GPU free. Requires --features jetson build flag.
nvh264encNVIDIA desktop GPUNVENC via the nvcodec GStreamer plugin. For workstations and servers with NVIDIA discrete GPUs.
vah264encIntel / AMD VA-APIHardware-accelerated encoding on Intel and AMD integrated and discrete graphics.
vtenc_h264macOS VideoToolboxHardware encoder on Apple Silicon and Intel Macs. Selected automatically on macOS when using auto.
x264encCPU (software)Software fallback. Works everywhere with no hardware requirements. Higher CPU usage at equivalent quality.
FieldTypeDefaultDescription
keyframe_distancefloat-1.0Seconds between periodic keyframes. -1.0 disables periodic keyframes entirely — keyframes are only sent on-demand in response to PLI or FIR requests from the receiver. Set to a positive value (e.g., 2.0) if the stream must be joinable mid-stream without a request.
passthroughboolfalseSkip H.264 encoding and forward the compressed stream directly. Use when the GStreamer pipeline already produces H.264 output (e.g., filesrc ! h264parse).
stereoboolfalseMark this track as a top/bottom stereo stream for VR viewing. Use with ZED cameras or other stereo sources that pack both eyes into a single frame.
fecboolfalseEnable Forward Error Correction. Adds parity packets so receivers can reconstruct lost packets without retransmission. Increases bandwidth by fec_parity_shards / fec_data_shards (50% with defaults).
fec_data_shardsint4Number of data packets per FEC group.
fec_parity_shardsint2Number of parity packets per FEC group. With 4 data + 2 parity, the stream survives any 2 lost packets per group.
nackboolfalseEnable NACK-based retransmission. The receiver requests re-send of lost packets. Adds latency proportional to RTT. Useful on reliable but occasionally lossy links.

Nested under a video track. When enabled, the encoder bitrate adjusts dynamically based on measured network capacity using Google Congestion Control.

video_tracks:
- name: "front"
source_type: "jetson_argus"
encoder: "nvv4l2h264enc"
bitrate: 4000
adaptive_bitrate:
enabled: true
min_bitrate: 500
max_bitrate: 8000
priority: 1.5
FieldTypeDefaultDescription
enabledboolfalseEnable adaptive bitrate control for this track.
min_bitrateintMinimum bitrate in kbps. The encoder will not go below this value even under severe congestion.
max_bitrateintMaximum bitrate in kbps. The encoder will not exceed this value even when bandwidth is available.
priorityfloat1.0Bandwidth allocation weight relative to other tracks. A track with priority: 2.0 gets roughly twice the bandwidth of a priority: 1.0 track when both are contending for capacity. Higher-priority tracks are also protected first when the network degrades.

A realistic multi-track configuration with ROS bridging, control relay, adaptive bitrate, and FEC:

api_key: "ak_xxxxx"
robot_name: "lab-robot"
zenoh:
protocol: "quic"
ros:
enabled: true
auto_start_bridge: true
control:
enabled: true
video_tracks:
- name: "front"
source_type: "jetson_argus"
encoder: "nvv4l2h264enc"
bitrate: 4000
fps: 30
fec: true
keyframe_distance: -1.0
adaptive_bitrate:
enabled: true
min_bitrate: 500
max_bitrate: 8000
priority: 1.5
- name: "rear"
source_type: "v4l2"
v4l2_device: "/dev/video2"
encoder: "nvv4l2h264enc"
bitrate: 2000
fps: 15
adaptive_bitrate:
enabled: true
min_bitrate: 300
max_bitrate: 4000
priority: 1.0
- name: "depth"
source_type: "ros_auto"
ros_topic: "/camera/depth/image_rect_raw"
encoder: "nvv4l2h264enc"
bitrate: 3000
fps: 30

Robots on the same LAN communicate directly. The cloud router handles discovery and browser connections, but robot-to-robot traffic never leaves the local network:

api_key: "ak_xxxxx"
robot_name: "field-robot"
zenoh:
mode: "peer"
listen:
- "udp/0.0.0.0:7447"
- "tcp/0.0.0.0:7447"

ZED Stereo Camera with Custom GStreamer Pipeline

Section titled “ZED Stereo Camera with Custom GStreamer Pipeline”
api_key: "ak_xxxxx"
robot_name: "orin"
zenoh:
mode: "client"
ros:
enabled: true
backend: "ros2dds"
domain_id: 0
auto_start_bridge: true
control:
enabled: true
video_tracks:
- name: "main"
source_type: "gstreamer"
gstreamer_pipeline: "zedsrc stream-type=2 camera-resolution=3 camera-fps=60"
encoder: "nvv4l2h264enc"
bitrate: 8000
fps: 60
source_format: "BGRA"
keyframe_distance: -1.0
stereo: true
adaptive_bitrate:
enabled: true
min_bitrate: 1000
max_bitrate: 12000
priority: 1.0