Configuration du logiciel

Installation de LeRobot, configuration du robot SO-101, calibrage des servos, configuration téléop leader-suiveur, API Python et dépannage. Tout, d'une nouvelle installation de Python à un bras en cours d'exécution.

Accéder à une section :

Étape 1 — Installation du Robot

Installation de votre robot

LeRobot est le seul logiciel dont vous avez besoin pour le SO-101. Il gère la communication des servos, l'étalonnage, la téléopération et l'enregistrement des données.

Créer un environnement virtuel

python -m venv ~/.venvs/so101
source ~/.venvs/so101/bin/activate   # Windows: .venvs\so101\Scripts\activate

Installer LeRobot

pip install lerobot

Vérifier l'installation

python -c "import lerobot; print(lerobot.__version__)"

Installer à partir des sources (facultatif — pour les dernières fonctionnalités)

git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[so101]"
Étape 2 — Configuration du robot

Configuration du robot SO-101

LeRobot comprend une configuration de robot SO-101 intégrée. Vous spécifiez le port USB pour le bras suiveur (et le bras leader si vous utilisez un téléop à deux bras).

Trouvez votre port USB

# Linux / macOS
ls /dev/ttyUSB*    # typical: /dev/ttyUSB0, /dev/ttyUSB1
ls /dev/tty.usbserial*   # macOS alternative

# Windows — check Device Manager → Ports → COMx

ConfigurationYAML SO-101

LeRobot utilise une configuration en ligne sur la ligne de commande ou un fichier YAML. Pour une configuration à un seul bras :

# ~/.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

Configuration à deux bras (leader-suiveur)

# ~/.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

Tester la connexion

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=none   # just connects and reads state

Vous devriez voir les lectures de position commune imprimées. Si vous obtenez une erreur de port, vérifiez Dépannage.

Étape 3 — Étalonnage du servo

Étalonnage des servos

Contrairement aux bras CAN-bus qui utilisent des encodeurs absolus, les servos Feetech STS3215 nécessitent un étalonnage pour définir leurs positions zéro. LeRobot gère cela automatiquement.

Exécuter l'étalonnage

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate

Le script vous invitera à déplacer le bras vers des positions spécifiques (origine, min, max pour chaque articulation) et à appuyer sur Entrée à chaque position. Il enregistre les données d'étalonnage dans ~/.cache/huggingface/lerobot/calibration/so101/.

Positions d'étalonnage

LeRobot vous demandera de positionner chaque articulation selon trois poses :

  • Poste d'origine : bras complètement étendu, effecteur terminal pointé vers l'avant
  • Position couple zéro : bras suspendu naturellement sous l'effet de la gravité
  • Référence à 90 degrés : chaque articulation en son milieu

Vérifier l'étalonnage

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate   # move arm by hand to verify joint readout

Déplacez le bras manuellement (mode conformité). Les positions des articulations doivent être proches de zéro à la maison et augmenter/diminuer en douceur à mesure que vous déplacez chaque articulation.

Conseil de recalibrage : Exécutez à nouveau l'étalonnage chaque fois que vous démontez un joint, remplacez un servo ou constatez que les positions des joints dérivent. Les fichiers d'étalonnage sont stockés par numéro de série par bras et rechargés automatiquement.

Étape 4 — Téléopération leader-suiveur

Téléopération leader-suiveur

Le SO-101 est conçu pour la téléopération leader-suiveur : un bras (leader) capture les mouvements de votre main et le deuxième bras (suiveur) les reflète en temps réel. Cela produit des démonstrations de formation de la plus haute qualité.

Démarrer la téléopération leader-suiveur

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

Clavier téléop à un seul bras (pas de deuxième bras)

Si vous n'avez qu'un seul bras, utilisez le mode de contrôle du clavier :

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate \
  --control.teleop_keys=true

Mode de compensation de conformité/gravité

Mettez le bras de guidage en mode faible couple pour pouvoir le déplacer librement avec votre main :

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
"
Étape 5 — API Python

Démarrage rapide de l'API Python

Vous pouvez contrôler le SO-101 directement via l'API du robot LeRobot sans les scripts CLI.

Contrôle conjoint de base

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

Compensation de gravité (mode rétroconduite)

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

Lecture de l'état des servos

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()
Dépannage

Les 3 principaux problèmes courants

Erreur 1 Port série introuvable : FileNotFoundError: /dev/ttyUSB0

Le servocontrôleur USB n'est pas détecté. Habituellement, un pilote manque ou le câble est débranché.

Réparer:

# 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
Erreur 2 Les servos ne répondent pas après la connexion

Les servos sont physiquement connectés mais LeRobot ne peut pas lire leurs positions. Il s'agit généralement d'un problème d'alimentation ou d'un mauvais débit en bauds.

Réparer:

# 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()
"
Erreur 3 Données d'étalonnage introuvables lors de la prochaine exécution

LeRobot enregistre l'étalonnage par numéro de série du bras. S'il ne trouve pas le fichier d'étalonnage, il avertira et utilisera les valeurs brutes de l'encodeur.

Réparer:

# 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

Toujours bloqué ? Demandez sur le Forum SO-101 ou vérifiez le Problèmes avec LeRobot GitHub.

Le logiciel fonctionne ? Commencez à collecter des données.

Une fois le bras en mouvement, l'étape suivante consiste à enregistrer votre premier ensemble de données LeRobot.