PTENES
MODULE 5.3 · HANDS-ON

🦾 SO-101 arm and LeRobot

O SO-101 is an open arm made from 3D-printed parts and Feetech STS3215 servos. It comes as a pair: one leader that you move by hand and one follower that copies. In this module, you configure the servos, calibrate them, install Hugging Face’s LeRobot and perform your first teleoperation, with cameras and safety rules.

6
Topics
Advanced
Level
Practice
Type
SO-101 pair
Hardware
0%
0 of 0 topics read · Section 1 of 6

Detailed content

⚠️ Before turning on the arm

A servo arm can pinch a finger, knock over a cup, and hit anyone nearby. Work at a clear table with a radius greater than the arm’s reach, keep a switch for the servo power supply within reach, and keep children and animals out of the area. Topic 6 goes into the routine in detail.

1

🤝 The SO-101 arm and the LeRobot project

O LeRobot is an open library from Hugging Face, built with Python and PyTorch. It brings together everything you need to teach a robot by demonstration: control motors, read cameras, record episodes, train policies, and run them on the real arm. The SO-101 is the project’s reference arm: six servos on each arm, parts you can print or buy ready-made, and hobby-level cost. With the leader/follower pair, you demonstrate the task by moving the leader, and the follower repeats it.

🌱 New here?

Each joint that rotates is a degree of freedom: the SO-101 has five joints plus the gripper. The serial bus servo (the STS3215) is a motor with gearing, a position sensor, and a small controller inside; several share the same wires, and each one responds only to its own number (ID). Teleoperation means controlling the robot remotely, here using the leader arm. A policy is the trained program that decides how to move based on the cameras (module 5.4).

LEADERyou move by handFOLLOWERcopies the posecomputer 6 STS3215 servos on each arm, one USB cable each

How to read this map: The circles are the joints (five plus the gripper at the end). The cyan arm is the leader: you hold it, and it only measures positions. The teal arm, shown glowing, is the follower: it has motors and copies the pose. The computer in between reads one and sends commands to the other, dozens of times per second.

🖨️ Parts

Print files are available in the SO-101 repository; kits with the parts ready-made are also available. Standard PLA works.

⚙️ Servos

STS3215 servos on both arms. On the leader, some joints use different gear ratios to make them easier to move: follow the parts list.

🔌 Adapter board

One per arm: it converts the computer’s USB connection to the servos’ serial bus and connects to the power supply.

🔋 Power supply

STS3215 servos come in versions for different voltages. Check your servos’ voltage before connecting the kit’s power supply.

Why learn this

The SO-101 and LeRobot combination is currently the shortest and cheapest path from “I have an arm” to “the arm has learned a task.” Everything you do here (ports, IDs, calibration) is the foundation for modules 5.4, 5.5, and 5.6.

Key concepts

Degrees of freedom
each rotating joint
Leader / follower
you move it, it copies
STS3215
serial servo with sensor
LeRobot
from motor to policy
2

🔧 Assemble, configure IDs, and calibrate the servos

Every STS3215 comes from the factory with the same ID. Since the six servos on an arm share the same wires, each one needs a different ID before final assembly: from 1 at the base to 6 at the gripper. Once assembled, calibration teaches the software where the midpoint and limits of each joint are, so the leader and follower speak the same position “language.”

boardUSB + power supply123 456baseshoulderelbow wristturngrippersame wires for all: each servo only responds to its own IDconfigure one servo at a time, by itself on the cable

How to read this map: The teal line is the bus: one data wire, plus power, that runs through all the servos in a chain. The number in each box is the ID; below it is the corresponding joint. If two servos have the same ID, both respond together and the arm goes haywire. That’s why you configure them one at a time.

🌱 New here?

The commands below use LeRobot, which you’ll install in topic 3. If you haven’t installed it yet, read this topic to understand the order, complete topic 3, then come back. The port is the name the system gives each arm’s USB cable: /dev/ttyACM0 on Linux, /dev/tty.usbmodem... on macOS, COM5 on Windows.

Step by step

1

Find each arm’s port

lerobot-find-port asks you to disconnect the cable and shows which port disappeared. Repeat for the other arm and write down both ports.

2

Set the IDs, one servo at a time

lerobot-setup-motors asks you to connect just one servo to the cable, sets its ID, then moves on to the next, starting with the gripper. Mark each servo with a pen.

3

Assemble the arms

Follow the official SO-101 assembly guide, joint by joint, with the IDs in the right positions. Don’t overtighten screws in printed plastic.

4

Calibrate the follower and leader

lerobot-calibrate asks you to place the arm at the midpoint of its range, then move each joint from one limit to the other. Follow the on-screen instructions; the result is saved under the id you assign to the arm.

Goal: the commands for steps 1, 2, and 4, using the syntax that worked in the INEMA robotica-real2sim guide with LeRobot 0.6.1 (Oct 2026). Flags vary between versions: check --help and the current documentation.

terminal
source ~/lerobot-env/bin/activate        # the environment from topic 3
lerobot-find-port                       # disconnect and reconnect when prompted: this shows the port

# servo IDs (one servo at a time on the cable; follow the on-screen instructions)
lerobot-setup-motors --robot.type=so101_follower --robot.port=/dev/ttyACM0
lerobot-setup-motors --teleop.type=so101_leader  --teleop.port=/dev/ttyACM1

# calibration (arm assembled; id names the calibration file)
lerobot-calibrate --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor
lerobot-calibrate --teleop.type=so101_leader  --teleop.port=/dev/ttyACM1 --teleop.id=lider

How to check

  • ✓lerobot-find-port shows a different port for each arm.
  • ✓Calibration completes without errors and reports where it saved the file for the follower and the leader.
  • ✗“Permission denied” on the port (Linux)? See topic 3: your user needs to be in the dialout.
  • ✗Servo “not found”? Loose cable, power supply off, or a repeated ID.
minimummaximum midpointgray: the servo’s range · teal: the range allowed by the partsrecords:minimummidpointmaximum

How to read this map: The gray arc shows how far the servo can turn; teal shows the range allowed by the assembly before one part hits another. Calibration measures the teal range and the midpoint (cyan line). That way, “50% of the elbow” means the same pose on the leader and follower, even if their servos were assembled at different angles.

Why learn this

Almost every arm problem where it “shakes,” “moves the wrong way,” or “doesn’t copy properly” comes from a swapped ID or poor calibration. Taking your time with this step saves hours of troubleshooting during the training in module 5.4.

Key concepts

Servo ID
1 base … 6 gripper
Power rail
same wires for all
Calibration
minimum, midpoint, maximum
--robot.id
name of the saved file
3

🐍 Install LeRobot (Python)

LeRobot is installed with pip, inside its own virtual environment (it includes PyTorch, which is large and has its own version requirements). The feetech extra installs support for the SO-101 servos; you’ll need additional extras for training in 5.4. The official documentation also covers installation with conda and ffmpeg (used to record video of the episodes). The names of extras and the required Python version can change: check the installation page before you begin.

Goal: create the environment, install LeRobot with Feetech servo support, and grant access to the USB port.

terminal (Linux / Pi / macOS)
python3 -m venv ~/lerobot-env
source ~/lerobot-env/bin/activate
pip install --upgrade pip
pip install "lerobot[feetech]"           # check the current documentation for the version and extras
pip show lerobot                        # shows the installed version
lerobot-find-port --help                # the lerobot-* commands should be available

# Linux: permission to use USB ports without sudo (log out and back in afterward)
sudo usermod -aG dialout $USER

How to check

  • ✓pip show lerobot shows "Name: lerobot" and a version number; write it down with your project.
  • ✓lerobot-find-port --help prints the usage instructions, without "command not found".
  • ✗"command not found"? The environment isn't active: run the source again in each new terminal.

✓ Do

  • ✓A dedicated environment for LeRobot, separate from 5.1 and 5.2.
  • ✓Write down the version that worked and pin it (lerobot==X.Y.Z).
  • ✓Read the --help for each command before copying it from a tutorial.

✗ Don't

  • ✗sudo pip install in the system Python.
  • ✗Updating LeRobot in the middle of a project without testing first.
  • ✗Copying commands from old videos: the flags have already changed names.

💡 See also (INEMA projects)

The guide robotica-so101 builds the SO-101 twin in simulation, and robotica-real2sim turns a photo of the table into a scene for training the robot, with a chapter about the real arm. The commands in this module were checked against these guides.

Why learn this

AI libraries for robots change quickly. Knowing how to isolate the installation, check the version, and read the --help is what makes the difference between a project that runs again six months from now and one that breaks with the first update.

Key concepts

venv
isolated installation
extras [feetech]
servo support
dialout
USB port access
Pin version
reproducible project
4

🎮 Leader/follower teleoperation

During teleoperation, the computer repeats a short loop: it reads the six joint positions of the leader, converts them using the calibration, and sends those same positions as targets to the follower. This is what will happen when recording demonstrations in module 5.4, except nothing is saved. So before recording, practice your movements here: smooth, without jerks, and always within the clear area.

read leader6 positions convertusing the calibrationmove follower6 targetsone cycle takes a few millisecondsrepeats dozens of times per second

How to read this map: follow the teal arrows from left to right and return along the dashed cyan arrow: it's a continuous loop while the command is running. If the follower seems "delayed," the loop is slow (cable, busy computer, or demanding camera); if it moves in the wrong direction, the problem is in the middle box: the calibration.

Goal: your first teleoperation, without cameras. Use the ports and the id from topic 2. Before pressing Enter, put the leader in a pose similar to the follower's: at startup, the follower moves to the leader's pose.

terminal
lerobot-teleoperate \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
  --teleop.type=so101_leader  --teleop.port=/dev/ttyACM1 --teleop.id=lider
# Ctrl+C ends the program (it doesn't replace the hardware stop switch: see topic 6)

How to check

  • ✓Moving the leader slowly, the follower copies each joint, including the gripper, with no visible delay.
  • ✓Five minutes of use without shaking or servos getting hot to the touch.
  • ✗A mirrored joint or one with a lot of play? Recalibrate it before continuing.

✓ Good teleoperation

  • ✓Move the leader slowly, as if the follower were fragile.
  • ✓Watch the follower, not the leader.
  • ✓Repeat the same task several times in the same way.

✗ Poor teleoperation

  • ✗Quick jerks: the follower knocks into things and the servo heats up.
  • ✗Hold the gripper closed against a hard object for a long time.
  • ✗Keep moving the arm to its limits.

Why learn this

The policy in module 5.4 learns to imitate exactly what you do during teleoperation, including jerks and hesitations. A calm, consistent hand here is worth more than a larger model later.

Key concepts

Control loop
read, convert, move
Target position
where the servo moves to
Starting pose
leader similar to follower
Demonstration
what the policy imitates
5

📷 Cameras and workspace

The policies in module 5.4 see through the cameras, so the setup needs to stay stable: fixed cameras, consistent lighting e simple background. A common setup uses two USB cameras: one in front (or overhead), which sees the whole table, and another on the wrist or nearby, which gets a close-up of the gripper. Anything that changes between recording and use (the lamp, the tablecloth, the camera angle) can confuse the policy.

front camera camerasidearm's reachindustrialclear area(no people) hardware stop switch

How to read this map: Seen from above, the arm (highlighted) sits at the edge of the table; the semicircle shows how far it can reach, and the task objects sit within it. The two cyan cameras face this area. The dashed red outline marks the clear area, and the hardware stop switch sits outside it, near you.

Goal: find the index of each camera and teleoperate while viewing its image alongside the joint positions.

terminal
lerobot-find-cameras opencv           # lists the cameras and saves a photo from each (check the index)

lerobot-teleoperate \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
  --robot.cameras="{ frente: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
  --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=lider \
  --display_data=true

How to check: opens a window showing the "front" camera image and the joint positions in real time while you teleoperate. For the second camera, add another entry to the dictionary (for example lateral: {type: opencv, index_or_path: 2, ...}) with the index that find-cameras showed. Syntax checked against LeRobot 0.6.1; check your version.

💡 Mark everything with tape

Put tape on the table to mark the arm's base, each camera's base, and the objects' starting positions. Take a photo of the setup. When you record in module 5.4 (or someone moves things on the workbench), you can put everything back in the same place in a minute.

Why learn this

In learning by demonstration, the camera is the main sensor. A repeatable workspace makes the difference between a policy that gets it right almost every time and one that only works on the afternoon it was recorded.

Key concepts

Fixed camera
same angle every time
index_or_path
which camera to use
Reach
where the arm can reach
Consistent lighting
same scene for the AI
6

🛑 Safety with a moving arm

The SO-101 is small, but strong enough to pinch a finger in its gripper, knock a glass of water onto a laptop, or hit someone in the face if they lean over the table. The risks increase when a trained policy, rather than your hand, is in control (module 5.4): it may make a move you did not expect. The rule is the one from module 5.1: the stop does not depend on software. A switch in series with the servos’ power supply, within reach, cuts power immediately. When power is cut, the arm loses its support and falls onto the table, so keep anything fragile out from underneath it.

Before each session

1

Clear the area

Keep only task objects within reach; liquids, tools, and the laptop stay off the arm’s table.

2

Test the power switch

Turn it on, off, and on again before running any command. Tell anyone nearby where it is.

3

Start slowly

For the first few seconds of each run, keep your hand near the switch and watch the follower. Run a new policy first with no objects on the table.

✓ Do

  • ✓Secure the arm’s base to the table (clamp or screw).
  • ✓Wear safety glasses when the gripper handles rigid objects.
  • ✓Turn off the power supply when you finish and when handling cables.
  • ✓In class, allow one student at a time inside the area; everyone else stays behind the line.

✗ Don't

  • ✗Rely on Ctrl+C as an emergency stop.
  • ✗Put your hand between the parts while the power supply is on.
  • ✗Leave the arm on without anyone watching it.
  • ✗Use a power supply with a voltage different from your servos’ rated voltage.

🌱 New here?

Torque is the servo’s turning force. With torque on, the joint holds its position and resists being pushed; with torque off, it moves freely. A pinch point is any place where two parts move closer together (the gripper, the bending elbow): that is where fingers can get hurt.

Why learn this

The safety habits you build with a small arm are the same ones used in industry with large arms: marked areas, a physical stop, and a test before operation. Anyone taking the arm to a school or fair needs these habits from day one.

Key concepts

Power switch
physical stop
Torque
force that holds the joint
Pinch point
where a finger can get caught
Clear area
beyond the reach

✅ Module summary

✓
SO-101 + LeRobot: leader/follower pair with STS3215 servos and Hugging Face’s open-source library.
✓
IDs and calibration: one servo at a time, 1 at the base through 6 at the gripper; minimum, midpoint, and maximum for each joint.
✓
Isolated installation: venv, feetech extra, version recorded, flags checked with --help.
✓
Teleoperation and cameras: smooth movements, fixed cameras, consistent lighting, and marked positions.
✓
Physical stop: power switch within reach, clear area, nothing fragile under the arm.

To go further

Next module

5.4 · Learning by demonstration: record episodes, train ACT, and watch the arm repeat the task on its own.