Software-Setup
LeRobot-Installation, SO-101-Roboterkonfiguration, Servokalibrierung, Leader-Follower-Teleop-Einrichtung, Python-API und Fehlerbehebung. Alles von einer frischen Python-Installation bis hin zu einem laufenden Arm.
Zu einem Abschnitt springen:
LeRobot-Installation
LeRobot ist das einzige Softwarepaket, das Sie für den SO-101 benötigen. Es übernimmt die Servokommunikation, Kalibrierung, Teleop und Datenaufzeichnung.
Erstellen Sie eine virtuelle Umgebung
python -m venv ~/.venvs/so101
source ~/.venvs/so101/bin/activate # Windows: .venvs\so101\Scripts\activate
Installieren Sie LeRobot
pip install lerobot
Überprüfen Sie die Installation
python -c "import lerobot; print(lerobot.__version__)"
Von der Quelle installieren (optional – für die neuesten Funktionen)
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[so101]"
SO-101 Roboterkonfiguration
LeRobot enthält eine integrierte SO-101-Roboterkonfiguration. Sie geben den USB-Anschluss für den Folgearm (und den Führungsarm bei Verwendung eines zweiarmigen Teleop) an.
Finden Sie Ihren USB-Anschluss
# Linux / macOS
ls /dev/ttyUSB* # typical: /dev/ttyUSB0, /dev/ttyUSB1
ls /dev/tty.usbserial* # macOS alternative
# Windows — check Device Manager → Ports → COMx
SO-101-Konfigurations-YAML
LeRobot verwendet eine Inline-Konfiguration in der Befehlszeile oder eine YAML-Datei. Für ein einarmiges Setup:
# ~/.lerobot/robots/so101_follower.yaml
robot_type: so101
port: /dev/ttyUSB0 # update to your port
cameras:
wrist_cam:
type: opencv
index_or_path: 0
fps: 30
width: 640
height: 480
Zweiarmige (Anführer-Follower)-Konfiguration
# ~/.lerobot/robots/so101_bimanual.yaml
robot_type: so101
port: /dev/ttyUSB1 # follower arm
leader_arms:
main:
type: so101
port: /dev/ttyUSB0 # leader arm
cameras:
top_cam:
type: opencv
index_or_path: 0
fps: 30
width: 640
height: 480
Testverbindung
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=none # just connects and reads state
Die Messwerte der Gelenkposition sollten ausgedruckt angezeigt werden. Wenn Sie einen Portfehler erhalten, überprüfen Sie dies Fehlerbehebung.
Servokalibrierung
Im Gegensatz zu CAN-Bus-Armen, die Absolutwertgeber verwenden, müssen die Feetech STS3215-Servos kalibriert werden, um ihre Nullpositionen zu definieren. LeRobot erledigt dies automatisch.
Führen Sie die Kalibrierung durch
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=calibrate
Das Skript fordert Sie auf, den Arm in bestimmte Positionen zu bewegen (Ausgangsposition, Min., Max. für jedes Gelenk) und an jeder Position die Eingabetaste zu drücken. Es speichert Kalibrierungsdaten ~/.cache/huggingface/lerobot/calibration/so101/.
Kalibrierpositionen
LeRobot fordert Sie auf, jedes Gelenk in drei Posen zu positionieren:
- Ausgangsposition: Arm vollständig ausgestreckt, Endeffektor zeigt nach vorne
- Null-Drehmoment-Position: Der Arm hängt natürlich unter der Schwerkraft
- 90-Grad-Referenz: jedes Gelenk in seiner Mitte
Kalibrierung überprüfen
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=teleoperate # move arm by hand to verify joint readout
Bewegen Sie den Arm manuell (Compliance-Modus). Die Gelenkpositionen sollten zu Hause nahe Null liegen und sich beim Bewegen jedes Gelenks gleichmäßig erhöhen/verringern.
Tipp zur Neukalibrierung: Führen Sie die Kalibrierung jedes Mal erneut durch, wenn Sie ein Gelenk zerlegen, ein Servo austauschen oder feststellen, dass die Gelenkpositionen abweichen. Kalibrierungsdateien werden pro Armseriennummer gespeichert und automatisch neu geladen.
Leader-Follower-Teleoperation
Der SO-101 ist für die Teleoperation zwischen Anführer und Gefolgsmann konzipiert: Ein Arm (Anführer) erfasst Ihre Handbewegungen und der zweite Arm (Nachfolger) spiegelt sie in Echtzeit wider. Dies führt zu Schulungsdemonstrationen höchster Qualität.
Starten Sie die Leader-Follower-Teleop
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB1 \
--robot.leader_arms.main.type=so101 \
--robot.leader_arms.main.port=/dev/ttyUSB0 \
--control.type=teleoperate
Einarmiges Tastatur-Teleop (kein zweiter Arm)
Wenn Sie nur einen Arm haben, verwenden Sie den Tastatursteuerungsmodus:
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=teleoperate \
--control.teleop_keys=true
Compliance-/Schwerkraftkompensationsmodus
Versetzen Sie den Mäklerarm in den Modus mit niedrigem Drehmoment, damit Sie ihn frei mit der Hand bewegen können:
python -c "
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port='/dev/ttyUSB0')
robot.connect()
robot.set_compliance_mode(True) # arm moves freely under hand guidance
"
Python-API-Schnellstart
Sie können den SO-101 direkt über die LeRobot-Roboter-API ohne die CLI-Skripte steuern.
Grundlegende gemeinsame Kontrolle
from lerobot.common.robot_devices.robots.so101 import SO101Robot
import torch
robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()
# Read current joint positions (6 DOF)
obs = robot.capture_observation()
print("Joint positions:", obs["observation.state"])
# Send joint position command (in degrees, normalized to [-1, 1] range)
action = torch.zeros(6) # all joints to zero position
robot.send_action(action)
robot.disconnect()
Schwerkraftkompensation (rückfahrbarer Modus)
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()
# Enable backdrive — arm can be moved freely by hand
robot.set_compliance_mode(True)
import time
for _ in range(100):
obs = robot.capture_observation()
print(obs["observation.state"]) # prints live joint positions as you move arm
time.sleep(0.02)
robot.disconnect()
Servostatus lesen
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus(port="/dev/ttyUSB0",
motors={"joint1": (1, "sts3215"),
"joint2": (2, "sts3215"),
"joint3": (3, "sts3215"),
"joint4": (4, "sts3215"),
"joint5": (5, "sts3215"),
"gripper": (6, "sts3215")})
bus.connect()
positions = bus.read("Present_Position", ["joint1", "joint2", "joint3"])
print("Positions:", positions)
bus.disconnect()
Die drei häufigsten Probleme
FileNotFoundError: /dev/ttyUSB0
Der USB-Servocontroller wird nicht erkannt. Normalerweise fehlt ein Treiber oder das Kabel ist abgezogen.
Fix:
# Check if the device is listed
ls /dev/ttyUSB* # Linux
ls /dev/tty.usbserial* # macOS
# Linux: add yourself to the dialout group (requires logout)
sudo usermod -aG dialout $USER
# Windows: install CP2102 or CH340 USB driver,
# then check Device Manager for COM port number
Servos sind physisch verbunden, aber LeRobot kann ihre Positionen nicht lesen. Normalerweise liegt es an einem Stromproblem oder einer falschen Baudrate.
Fix:
# 1. Verify 5V power supply is connected and LED on servo board is on
# 2. Check all servo daisy-chain cables are fully seated
# 3. Try scanning for servos directly:
python -c "
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus('/dev/ttyUSB0', motors={})
bus.connect()
ids = bus.find_motor_ids()
print('Found motor IDs:', ids)
bus.disconnect()
"
LeRobot speichert die Kalibrierung pro Armseriennummer. Wenn die Kalibrierungsdatei nicht gefunden werden kann, wird eine Warnung ausgegeben und die Rohwerte des Encoders verwendet.
Fix:
# Check calibration file location
ls ~/.cache/huggingface/lerobot/calibration/so101/
# Re-run calibration if the file is missing
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=calibrate
# Pass explicit calibration path if needed
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--robot.calibration_dir=/path/to/calibration \
--control.type=teleoperate
Stecken Sie immer noch fest? Fragen Sie auf der SO-101 Forum oder überprüfen Sie die Probleme mit LeRobot GitHub.