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 :
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]"
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.
É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.
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
"
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()
Les 3 principaux problèmes courants
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
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()
"
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.