Skip to content

lerobot

tested on simulator

Tier Tier 2
Protocol Hugging Face LeRobot Robot API
Covers SO-100 and SO-101 arms, Koch and OMX arms, other LeRobot arms with joint goals
Hazard default high
Conformance full
Tested with a faithful fake of LeRobot's SOFollower, with each assumption checked in the hardware test plan

Estimated reach. A dozen robot types, thousands of hobby and lab arms built from them. LeRobot registers about a dozen robot types, and the SO-100 and SO-101 kits are among the most built open source arms. The driver reads joint positions and sends joint goals through LeRobot's Robot interface, so it covers robots whose actions are joint positions. Mobile bases and hands with other action types need a map. The count is a model estimate.

The lerobot driver controls LeRobot arms such as the SO-100, SO-101 and Koch followers through LeRobot 0.6.1. Install LeRobot separately, such as pip install 'lerobot[feetech]', since LeRobot pulls in PyTorch, which lacks wheels for some machines such as Intel Macs.

Supports

Channel nameKindLeRobot call
<joint> such as shoulder_panread, deg or -100 to 100, gripper in percentget_observation()["<joint>.pos"]
torqueread, boolbus.sync_read("Torque_Enable") on every motor
<joint>_goal such as elbow_flex_goalset, same unit as the jointsend_action({"<joint>.pos": goal})
torque_off, torque_onactionbus.disable_torque(), bus.enable_torque()
move with one argument per jointactionone send_action() for several joints
MapMeaning
{ joint: wrist_flex }A joint under another channel name
{ joint: x, unit: m/s }The unit LeRobot uses for that key, for robots that aren't arms
{ torque: true }The torque state
{ command: move, joints: { pan: shoulder_pan, lift: shoulder_lift } }A move action, each argument naming a joint

Body joints read in degrees, or -100 to 100 with use_degrees: false. Grippers read 0 to 100 percent open.

Behavior

  • The driver never calibrates. An uncalibrated arm fails to connect with the lerobot-calibrate command to run.
  • Connecting turns torque on, so the arm holds position.
  • A goal channel reads the present position until a goal is sent, so max_change_per_s counts from the real position. Read-back shows the goal after max_relative_target clipping.
  • torque_on first sets every goal to the present position, so no joint jumps.

Safe state

A stop turns torque off, so the arm goes limp and falls. Rest the arm over something soft while testing. close() also turns torque off unless torque_off_on_close: false.

Setup

  1. Install LeRobot with the motor extra in the hub's environment.
  2. Calibrate once with lerobot-calibrate --robot.type=so101_follower --robot.port=<port> --robot.id=<id>.
  3. Start from openhal/drivers/lerobot/examples/so101-follower.hal.yaml and keep goal limits narrow.
KeyDefaultMeaning
robotrequiredLeRobot type such as so101_follower or koch_follower
portrequiredMotor bus serial port
robot_idrequiredCalibration id
use_degreestrueDegrees for body joints, or -100 to 100
max_relative_targetnoneLeRobot's clip on one goal's distance from the present position, in degrees
torque_off_on_closetrueTorque off when the hub closes the device
timeout2 sPer call
action_wait8 sTime move allows for arrival before returning started
observation_age50 msObservation reuse window
tolerance2Arrival tolerance for move, in the joint's unit

Known limitations

  • No camera reads, kinematics or Cartesian moves.
  • move uses the action's limits, so match the action limits to the goal channels.
  • Tests use the fake in simulator.py, and the hardware test plan checks the fake's assumptions.

Hazard defaults

high, so the hub holds every change and action until a person approves the request.

Sources