The SO-100 is a compact 6-DOF robotic arm that shares the same software interface as the SO-101. It uses Feetech STS3215 servo motors and is designed for teleoperation and imitation learning.
The SO-100 is functionally identical to the SO-101 from a software perspective, sharing the same codebase and configuration options. The main differences are in the physical form factor and assembly.
From a software perspective, the SO-100 and SO-101 are identical. Both:
Use the same SOFollower class implementation
Share motor configurations
Support the same features
Use identical calibration procedures
Have the same API
The only difference in the code is the robot type identifier:
SO-100: robot_type="so100_follower"
SO-101: robot_type="so101_follower"
Both so100_follower and so101_follower are registered as subclasses of SOFollowerRobotConfig and use the same underlying implementation (see /home/daytona/workspace/source/src/lerobot/robots/so_follower/config_so_follower.py:45).
from lerobot.robots.so_follower import SOFollower, SOFollowerRobotConfigconfig = SOFollowerRobotConfig( robot_type="so100_follower", id="so100_main", port="/dev/ttyUSB0")robot = SOFollower(config)robot.connect(calibrate=True)# Follow the calibration prompts:# 1. Move to middle position# 2. Move through full range of motion# 3. Calibration saved automatically
Calibration files are stored separately for each robot ID, so you can have both SO-100 and SO-101 robots with different calibrations.
# Connectionrobot.connect(calibrate=True)robot.disconnect()# Observationobs = robot.get_observation()# Returns: dict with motor positions and camera images# Actionaction = {"shoulder_pan.pos": 0.0, ...}sent_action = robot.send_action(action)# Returns: actual action sent (may be clipped for safety)# Calibrationrobot.calibrate()# Configurationrobot.configure() # Apply PID settings, operating modes
from lerobot.robots.so_follower import SOFollower, SOFollowerRobotConfigleader = SOFollower(SOFollowerRobotConfig( robot_type="so100_follower", id="leader", port="/dev/ttyUSB0"))follower = SOFollower(SOFollowerRobotConfig( robot_type="so100_follower", id="follower", port="/dev/ttyUSB1", max_relative_target=15.0))with leader, follower: while True: obs = leader.get_observation() action = {k: v for k, v in obs.items() if k.endswith(".pos")} follower.send_action(action)