Prerequisites
Before registering a robot with Servo, ensure you have:- A Calibrated Robot: Servo does not communicate directly with motor buses or perform joint zeroing. Calibrate your robot using your hardware driver’s normal bringup tools before connecting to Servo.
- Local Configuration Files: Have the paths to your robot driver’s local configuration files on disk
(for example, left and right arm configs).
- Servo uses these files strictly to record a SHA-256 fingerprint (
configuration_digest). Servo never parses, modifies, or uploads them. - If developing or testing without physical hardware, create two placeholder files:
- Servo uses these files strictly to record a SHA-256 fingerprint (
- A Python Runtime Factory (
open_yam): A zero-argument function in your robot application that opens and returns your calibratedRobotEnv(implementingget_obs(),step_command_only(joints), andclose()). See Connect sensors and actuators for a complete reference implementation.
Bimanual YAM contract
Register a physical robot
Run setup on the computer wired to the robot, passing the paths to your local configuration files:--config accepts the hardware configuration files identified in the prerequisites. Pass the left arm
configuration file first and the right arm configuration file second.
Servo reads their raw bytes and stores a SHA-256 digest (configuration_digest) to record an immutable
hardware revision fingerprint. This allows Servo to detect if a physical arm’s zero-offsets or motor setup
have changed without coupling Servo core to specific motor or driver tooling.
Bimanual YAM is the default type. Use --manifest for a custom robot.
Give every physical rig a unique name. Running setup again with the same name and type keeps its
rob_* ID across process restarts, operating-system reinstalls, and robot-computer replacements.
If the configuration changes, run setup again to record the new hash.
View the inventory from any signed-in computer:
Choose a model
Choose the model after registering the robot:Connect sensors and actuators
Servo accepts a runtime factory from your robot application. A runtime factory is a zero-argument function that opens and returns the YAMRobotEnv:
open_yam() returns a YAM runtime instance implementing three methods:
get_obs(): returns a dictionary containing camera frames and joint positions:left_rgb,front_rgb,right_rgb: 360 × 640 RGB image frames asnumpy.ndarray(uint8); andjoint_positions: 14 float values in radians (left arm joints 0..5, left gripper, right arm joints 0..5, right gripper).
step_command_only(joints): applies a 14-value target array in radians to the motor controllers; andclose(): releases the arms, cameras, and communication buses.
front_rgb to the registered top camera role, validates all three frames and the
14-value joint state, and passes validated 14-value targets to step_command_only. If your runtime
loads local configuration files to configure its motor buses, pass those same files to
servo robot setup so Servo can record their configuration fingerprint. Servo never passes files into
the runtime; your robot application owns device discovery, camera role assignment, bus addresses,
and controller setup.
The local controller enforces motor limits and emergency-stop behavior. Servo rejects malformed or
expired action rows and enforces a measured action-jump limit when one exists for the selected
model and robot.
Calibration
Calibrate the robot with its normal hardware tools before a Servo run. Servo treats calibration as
a local precondition. Calibration files remain on the robot computer.
Add a custom robot
Generate a local integration package:servo-robot.json: Starts with type IDlocal.lab-arm.v1. Edit its camera roles, state axes, action axes, units, and control rate, then setstatustoready.integration.py: ContainsSensorSourceandActuatorSinkdrivers, plus aConfigurationPydantic model defining local settings (such asport: str).config.yaml: Create your local hardware config file containing device settings (for example,port: /dev/ttyACM0).
--config records the cryptographic fingerprint of your local configuration file.
Open the installed integration from the robot application:
configuration dictionary passed to sv.robots.attach is validated against the Configuration
schema defined in integration.py. Run sv.models.for_robot(robot) to list available hosted models.
An empty list means no hosted model matches that robot type yet.