heart_rate and it is ingested.
Declaration
Each signal is one entry in the overlay’ssignals array:
The
type set is closed on purpose: it is what lets any name work.
Wire format
Signal channels carrynomadic.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.
.proto files are on the Schemas page.
Units
unitis 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
unitand say so innote. 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.
Navigation instructions
An instruction that changes during the recording, such as turn-by-turn navigation, is astring
signal named navigation_instruction (or an enum when the instructions come from a fixed
set), with one message whenever the instruction changes:
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
notesaying 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-levelprofile 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.