Skip to main content
The SO-101 is an affordable 6-DOF robotic arm that uses Feetech STS3215 servo motors. It’s part of the SO follower series and is well-suited for teleoperation and imitation learning tasks.

Overview

The SO-101 features:
  • 6 degrees of freedom (5 arm joints + gripper)
  • Feetech STS3215 servo motors
  • USB serial communication
  • Position control mode
  • Optional camera integration
  • Affordable hardware components

Hardware Specifications

Motors

The SO-101 uses the following motor configuration:
By default, SO-101 uses degree normalization (use_degrees=True) for backward compatibility with existing datasets and policies.

Installation

Hardware Setup

  1. Connect the SO-101 arm to your computer via USB
  2. Identify the serial port (usually /dev/ttyUSB0 on Linux or /dev/tty.usbserial-* on macOS)
  3. Ensure you have proper permissions to access the serial port:

Software Requirements

The SO-101 robot is included in the LeRobot installation:

Configuration

Basic Configuration

Create a configuration for your SO-101:

Configuration Parameters

str
required
Serial port to connect to the arm (e.g., /dev/ttyUSB0)
str
Robot identifier for calibration file management
bool
default:"true"
Whether to disable motor torque when disconnecting
float | dict[str, float]
Limit the magnitude of relative position changes for safety. Can be a single value for all motors or a dictionary mapping motor names to individual limits.
dict[str, CameraConfig]
Dictionary of camera configurations
bool
default:"true"
Use degree normalization instead of range[-100, 100]. Set to True for backward compatibility with existing datasets.
Path
Directory to store calibration files (defaults to ~/.cache/lerobot/calibration/robots/so_follower)

Usage

Basic Connection

Calibration

The SO-101 requires calibration before first use:
Calibration data is saved per robot ID. If you have multiple SO-101 arms, use different IDs for each.

Observation Format

The get_observation() method returns a dictionary:

Action Format

Actions follow the same structure as observations:

Safety Features

Maximum Relative Target

Limit how much motors can move in a single action:

PID Tuning

The SO-101 configures motors with conservative PID values to prevent shakiness:
  • P Coefficient: 16 (default is 32)
  • I Coefficient: 0
  • D Coefficient: 32
For the gripper specifically:
  • Max Torque Limit: 500 (50% to prevent burnout)
  • Protection Current: 250 (50% to prevent burnout)
  • Overload Torque: 25 (25% when overloaded)
These are set automatically in robot.configure() at /home/daytona/workspace/source/src/lerobot/robots/so_follower/so_follower.py:155.

Motor Setup

If you need to assign motor IDs (for a new arm or replacement motors):

Teleoperation

The SO-101 is commonly used in leader-follower setups:

Troubleshooting

Port Permission Denied

Robot Not Responding

  1. Check cable connections
  2. Verify the correct port is specified
  3. Try reconnecting the USB cable
  4. Check motor power supply

Calibration Issues

Motor Shaking

If motors are shaking or oscillating, the PID values may need adjustment. See the source code at /home/daytona/workspace/source/src/lerobot/robots/so_follower/so_follower.py:155 for the configuration method.

SO-100

Compact version of the SO series

Recording Data

Record demonstrations with SO-101

Teleoperation

Set up leader-follower control

Feetech Motors

Motor bus API reference