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:

Schritt 1 – LeRobot-Installation

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]"
Schritt 2 – Roboterkonfiguration

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.

Schritt 3 – Servokalibrierung

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.

Schritt 4 – Leader-Follower-Teleop

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
"
Schritt 5 – Python-API

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()
Fehlerbehebung

Die drei häufigsten Probleme

Fehler 1 Serieller Port nicht gefunden: 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
Fehler 2 Servos reagieren nach dem Anschließen nicht

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()
"
Fehler 3 Kalibrierungsdaten wurden beim nächsten Durchlauf nicht gefunden

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.

Funktioniert die Software? Beginnen Sie mit der Datenerfassung.

Sobald sich der Arm bewegt, besteht der nächste Schritt darin, Ihren ersten LeRobot-Datensatz aufzuzeichnen.