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.
🤝 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).
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.
Print files are available in the SO-101 repository; kits with the parts ready-made are also available. Standard PLA works.
STS3215 servos on both arms. On the leader, some joints use different gear ratios to make them easier to move: follow the parts list.
One per arm: it converts the computer’s USB connection to the servos’ serial bus and connects to the 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
🔧 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.”
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
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.
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.
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.
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.
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.
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
🐍 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.
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
🎮 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.
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.
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
📷 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.
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.
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
🛑 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
Clear the area
Keep only task objects within reach; liquids, tools, and the laptop stay off the arm’s table.
Test the power switch
Turn it on, off, and on again before running any command. Tell anyone nearby where it is.
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
✅ Module summary
To go further
- LeRobot documentation — installation, SO-101, current commands
- LeRobot on GitHub — code, versions, and change notes
- SO-ARM100 / SO-101 (TheRobotStudio) — print files and parts list
- See also: robotica-so101 (INEMA) — SO-101 digital twin in simulation
- See also: robotica-real2sim (INEMA) — turn a photo of the table into a simulation that trains the robot
Next module
5.4 · Learning by demonstration: record episodes, train ACT, and watch the arm repeat the task on its own.