Skip to main content
A signal is one named, typed, timestamped series: vehicle speed, a joint-angle vector, a gripper opening, a heart rate, a turn-signal state. Signal names are free. There is no registry and no approval: declare heart_rate and it is ingested.

Declaration

Each signal is one entry in the overlay’s signals array:
The type set is closed on purpose: it is what lets any name work.

Wire format

Signal channels carry nomadic.Signal protobuf messages, one message per sample:
  • Each message is one timestamp and one value. Do not batch samples into arrays: one value per message is what lets the same file plot directly in Foxglove (numeric signals in the Plot panel, categorical ones in State Transitions). MCAP chunk compression absorbs the overhead.
  • The sample time is the message’s MCAP log_time. See Clock.
  • The signal’s name, type and unit come from the overlay, never from the message.
The full .proto files are on the Schemas page.

Units

  • unit is a free-form string, not converted for you. SI is strongly recommended.
  • Where a profile or a part slot specifies a unit, that exact unit string is required.
  • If your source does not document a unit, omit unit and say so in note. An invented unit is worse than an absent one, because it will be believed.

Orientation

Publish orientation as derived angles, yaw, pitch and roll in rad, rather than raw quaternion components. A series of q[2] is meaningless to a reader. Full poses belong in foxglove.PoseInFrame messages (see Frames, poses and units).

Recognised names

Any name is accepted. These names have a defined meaning; when you have the quantity, use the name.

Vehicle

Publish every other vehicle-bus signal too (steering-wheel angle, brake pressure, gear, turn signals, wheel speeds) under any name, with its unit. An instruction that changes during the recording, such as turn-by-turn navigation, is a string signal named navigation_instruction (or an enum when the instructions come from a fixed set), with one message whenever the instruction changes:
An empty text ends the current instruction. One instruction for the whole recording goes in recording.task instead.

Machines and robots

  • Publish machine joint angles and operator commands of heavy equipment as ordinary signals, each with its unit and a note saying which it is. A joystick command is not a joint angle.
  • Publish all robot proprioception that no part slot covers (commanded joints, joint velocities, motor torques, battery state) as ordinary signals.

Profiles

A profile, declared in the top-level profile field, fixes the names and units of a set of signals so they can be interpreted, not just stored. Profiles are opt-in. Signals outside the profile stay generic, and an unrecognised profile is ignored. Declare a profile only if your source can honestly fill its required fields.

nomadic.driving.v1

Scalar float signals with these names and exactly these unit strings (compared case-insensitively; m/s², rad/sec, deg/s and km/h do not match): speed and gyroz are required. Every other field is optional and is used when its unit matches and it covers the same time span as speed and gyroz.

Spec 1.0 arm signals

Before parts, spec 1.0 described a robot arm by signal names. They remain valid in 1.0 overlays: For two arms, declare profile: "nomadic.yam_bimanual.v1" and prefix every name with the side: left_joint_positions, left_ee_x, …, right_gripper_position. In a 1.1 overlay, declare parts instead. Once parts are declared, these names and the bimanual profile have no further meaning, and preflight warns where you still use them.