videosdk_teleop.adapters.lerobot gives you two subclasses, one per machine:

Install

That brings in LeRobot and the servo backend for the SO-101. For LeRobot hardware on a different bus, install that backend from LeRobot too. Every constructor argument on both adapters is in the Adapters reference.

Robot host

The machine with the follower arm.
Nothing moves until an operator claims control and holds the deadman.
Configure cameras on the LeRobot object, not on the adapter. LeRobot’s get_observation() returns joints and images in one call, and the adapter serves both from it.

Operator host

The machine with the leader arm.
leader.run(hz=30) does the same when the operator does not need to see the frames.
limits() returns {} on these adapters, so position clamping is off and slew is the only shaping the SDK applies. Tune it on your own hardware, and see Safety for what the remaining checks cover.

Cameras

Each camera travels as its own track, so observation() returns one array per camera:
Both describe the same instant: the joints are interpolated to that frame’s own capture time. See Sync. get_observation() is called once per observe cycle and cached, so joints and images always come from the same read.

Joint names

Use plain joint names, elbow_flex rather than elbow_flex.pos. LeRobot adds the .pos suffix, the adapter takes it off, and everything you touch, safety limits, dataset rows and callbacks, uses the plain name.

Units

Every number you set is read in the arm’s own units, since nothing converts between them. A slew of 12.0 at 30 Hz lets a joint travel 360 of those units each second.
Set it too low and the dataset records the clamp instead of the operator. Pass a per joint mapping when an arm reports its joints in more than one unit, as a calibrated SO-101 does.

SO-101

Calibrate the arms, and set slew for degrees and gripper units.

Safety

The checks a command passes before it reaches the motors.