Anyone in the room can drive
Control is first come and unauthenticated. The follower grants the lease to whoever claims it first and does not check who they are. There is no handover queue and no operator identity. The room is the boundary. Treat a room id and a token together as the credential that lets someone move your hardware.Supervision
Run the follower under a process supervisor. systemd, or a Kubernetes restart policy, or whatever already runs on the host.HOLDING, applies nothing until a
leader claims control, and nothing resumes on its own.
There is a second watchdog you do not configure: if your own loop stops
calling
tick(), the follower notices and enters a failsafe with reason
STALLED. A hung process does not leave the arm armed.Reconnects
A transport drop is not a pause. The follower drops the lease with reasontransport:<why> and enters its failsafe, because the lease belongs to a peer
that is now gone.
When the link comes back, the operator has to claim again. That is deliberate:
a session that silently resumed would put an arm back under the control of
someone who may have walked away.
Set resume_requires_reclaim=True to extend the same rule to a watchdog trip,
so the arm stays in HOLDING after commands stop until someone calls
Follower.arm().
Tokens
VIDEOSDK_TOKEN is read at construction. A token that expires mid-session does
not stop the session, but the next start() fails with a TimeoutError from
the transport, which reads like a network problem and is not.
More than one robot
One room per follower and leader pair. A room holds one arm and whoever is driving it. Give each machine its ownrobot_id. It goes into logs, recordings and the
manifest, and two hosts sharing one makes a dataset ambiguous later.
Network
A session is one WebRTC connection: a data channel for joints and one video track per camera.
Measure rather than assume.
stats() gives you round trip
time, jitter and loss on the live link, and max_staleness_ms should be set
from what you actually see under load rather than from the default.
The defaults are deliberately low. Measure
watchdog_timeout_s and
max_staleness_ms on your own link, with traffic on it, and set them from
that. See SafetyConfig.Before you leave it running
1
Set limits()
The default returns
{}, which is no position limit at all.2
Set slew per joint
One number is wrong on a machine whose joints do not share units.
3
Set max_misalignment on the leader
So arming cannot make the arm travel to meet a controller somewhere else.
4
Check the failsafe matches the hardware
on_starvation=TORQUE_OFF drops a gravity-loaded arm. HOLD is the
default for a reason.5
Watch the numbers
Tick overruns, watchdog trips and how many commands correlated. See
Monitoring.
Related
Safety
The checks a command passes, and what none of them catch.
Monitoring
Reading a live session’s health.
Cloud recording
Uploading episodes to your own storage alongside the local copy.
Troubleshooting
Symptoms, and what to change.