Deployments repository¶
What runs on a lab's robots is configuration, not code, and it is the lab's own: robot names, network addresses,
joint limits, safety limits. It lives in a private <lab>-deployments repository, started from
deployments-template. The repository holds configuration only; every component it names (environments, agents,
guards) is registered by an installed Hylo repository.
<lab>-deployments/
├── README.md
└── workcells/
├── sim_arm.yaml a simulated arm, no hardware: bring-up and operator flow
├── so101.yaml an SO-101 arm through LeRobot's Robot interface
└── libero10_sim.yaml LIBERO-10 in simulation, with the robot-side runtime
uv run hylo serve workcell --config workcells/sim_arm.yaml --port 8102
uv run hylo serve workcell --config workcells/so101.yaml --host 0.0.0.0 --port 8100 --token $HYLO_TOKEN
A workcell config¶
Each file is one workcell (WorkcellConfig; all fields in deployment).
The template for a real arm:
name: so101
env:
type: lerobot.robot
remote: {runtime: robot} # the robot computer's venv with lerobot + feetech (execution profile)
params:
robot:
type: so101_follower
params: {port: /dev/ttyACM0, id: arm1, max_relative_target: 10.0}
cameras: {} # e.g. {front: agentview, wrist: wrist} with configured cameras
action_low: [-110, -100, -100, -100, -160, 0]
action_high: [110, 100, 100, 100, 160, 100]
home: [0, -90, 90, 0, 0, 10]
home_steps: 90
control_hz: 30
policy: {url: "ws://gpu-box:8000/hylo", protocol: hylo}
runtime: {clock: wall, refill_steps: 10, max_hold_steps: 30, require_reset_confirm: true, verdict_timeout_s: 120}
safety: {max_delta: 8.0}
image_every: 5
max_steps: 900
output_dir: runs/workcell
Calibration and limits¶
| What | Where | Notes |
|---|---|---|
| motor calibration | LeRobot's own calibration, keyed by the robot id (arm1) |
done with LeRobot's tools on the robot computer; not stored by Hylo |
| joint limits | env.params.action_low / action_high |
in the robot's units (degrees, gripper 0-100); required for a real robot |
| per-step limit in the robot | robot.params.max_relative_target |
LeRobot clamps each commanded change; keep it |
| home pose | env.params.home, home_steps |
reset moves there by interpolation, each step within the shield's limits |
| cameras | env.params.cameras |
robot camera name to observation name (agentview, wrist) |
| control rate | env.params.control_hz |
the wall-clock loop rate |
Safety limits and keep-out zones¶
safety configures the SafetyShield of the workcell (safety). The mandatory guards
(non-finite actions abort first, the action box is enforced last) are always on; config can only add guards or
tighten limits:
safety:
max_delta: 8.0 # largest change per step, in action units
guards:
- type: keep_out # a box the controlled point must not enter
params: {state_key: eef_pos, low: [0.3, -0.2, 0.0], high: [0.6, 0.2, 0.3], action_dims: [0, 1, 2], margin: 0.02}
keep_out zeroes the delta-position components that would move the point (state_key, read from the observation
state) into the box or deeper into it; it needs a Cartesian end-effector state and delta-position actions, so it does
not apply to joint-space control such as the SO-101 template. Other built-in guards: delta_limit, workspace,
norm_limit; labs can add their own guard plugins (extending).
The SafetyShield is a software layer, not a certified safety function: keep the robot's own limits and a hardware e-stop within reach.
Tokens and addresses¶
- Never commit tokens. Pass them at start-up (
--token $HYLO_TOKEN) from the machine's environment or a secret store; policy endpoints in a config may carrytoken, but prefer giving it when starting the episode. - A workcell binds to
127.0.0.1unless--hostsays otherwise; expose it (0.0.0.0) only on a robot network and always with--token. - Policy server addresses (
policy.url) name hosts on your network (gpu-box); the control plane can also choose the endpoint per episode.
Machine-specific settings¶
Interpreter paths and environment variables of the robot computer belong in its
execution profile (hylo profile set-runtime robot ...), not in the repository: the config says
remote: {runtime: robot} and works on any robot computer that registered that runtime.