Skip to content

SO-101

Feetech STS3215 bus, six joints, the arm the acceptance suite is written against.

python3 -m pip install "strands-robots[sim,feetech]"
from strands_robots import Robot
arm = Robot("so101", mode="sim")
arm.act({"shoulder_pan": 0.3})               # radians
from strands_robots import Robot
arm = Robot("so101", mode="real", port="/dev/tty.usbmodem5AB01818061")
obs = arm.observe()                           # ticks, torque state, voltage in sensors
arm.act({"shoulder_pan": obs.joints["shoulder_pan"] + 50})
arm.close()                                   # torque off
from strands_robots import Robot
arm = Robot("so101", mode="twin")             # the Feetech driver over the MuJoCo model
arm.act({"shoulder_pan": 2100})               # ticks, decoded by the twin
fact value
joints shoulder_pan shoulder_lift elbow_flex wrist_flex wrist_roll gripper
native frame ticks, 0 to 4095, mid 2048
control rate 50 Hz
per-step clamp max_step on the registry row, in ticks
also on this wire so100 (native), lekiwi (through the lerobot driver)
lerobot type so101_follower (the lerobot driver is the fallback)

Calibration: a missing file yields a synthetic, safe-not-metric calibration and arm.calibration says synthetic. The port is ls /dev/tty.usbmodem* /dev/ttyACM*.