Menlo

Wire format

Session channels, EdgeTelemetry fields, CloudCommand structure, and EdgeEvent types.

This page is a lookup for the exact shape of messages flowing between the platform and a robot. For the mental model behind sessions and channels, see Concepts → Sessions & channels.

Session channels

A session is a WebRTC room (implemented via LiveKit). Inside it are three data channels plus two media tracks:

ChannelReliabilityDirectionPurpose
commandsReliable, orderedCloud → RobotSend CloudCommand — a oneof of velocity, trajectory, or mode
stateLossyRobot → CloudReceive EdgeTelemetry at ~10 Hz
systemReliable, orderedRobot → CloudReceive EdgeEvent — robot-side events (boot, errors, alerts, mode transitions)
Video trackRobot → CloudFPV and third-person camera streams
Audio trackBidirectionalRobot microphone and speaker

Start a session using the Python SDK's connect() function. The SDK handles session creation and joins the WebRTC room automatically.

EdgeTelemetry

Delivered over the lossy state channel as protobuf. Each packet contains:

FieldDescription
timestamp_usEdge clock timestamp in µs (CLOCK_REALTIME)
fw_timestamp_usFirmware clock timestamp in µs
sequenceMonotonically increasing packet counter
fw_modeCurrent firmware mode (FW_MODE_DAMP / FW_MODE_STAND / FW_MODE_MOVE)
joint_posJoint positions in radians (25-element array, one per motor)
joint_velJoint velocities in rad/s
joint_currentMotor currents in amps
joint_tempMotor temperatures in °C
imu_quatIMU orientation quaternion [w, x, y, z]
imu_gyroIMU angular velocity [x, y, z] in rad/s
imu_gravityProjected gravity vector from the IMU [x, y, z]
error_flagsBitfield of active error codes
alert_countNumber of active alerts
last_video_timestamp_usTimestamp of the most recent video frame (backend correlates with LiveKit RTP)
last_audio_timestamp_usTimestamp of the most recent audio frame

Use the SDK's session.state.get() for a one-shot current state read.

CloudCommand

Sent on the reliable commands channel. CloudCommand is a protobuf oneof — exactly one of the three fields is set per message:

VariantPurpose
velocityVelocityCommand with vx, vy, vyaw
trajectoryJoint-space trajectory (reserved — used by higher-level planners)
modeFirmware mode transition (damp / stand / move)

VelocityCommand

FieldDescription
vxForward / backward velocity (m/s)
vyLeft / right lateral velocity (m/s)
vyawRotational velocity (rad/s)

EdgeEvent

Delivered over the reliable system channel. Carries boot progress, error reports, alert triggers, and mode-transition notifications from the robot. Use it to react to state changes rather than polling telemetry.

How is this guide?

On this page