Ce guide couvre l'ensemble du processus d'installation, configuration et utilisation du système de teleopération avec le robot SO-101.
- Installation des dépendances
- Configuration du matériel
- Calibration des moteurs
- Test de connexion
- Teleopération
- Enregistrement de données
- Entraînement d'un modèle
- Exécution d'une policy
- Dépannage
Miniforge est une distribution légère de conda optimisée pour les environnements de conda-forge.
- Téléchargez le dernier installateur depuis ici
- Exécutez l'installateur et suivez les instructions
- Acceptez d'ajouter Miniforge à votre PATH lors de l'installation
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).shOuvrez un terminal (PowerShell ou Command Prompt sur Windows, Terminal sur Linux) et exécutez :
conda create -y -n lerobot python=3.12
conda activate lerobotVous devriez voir (lerobot) au début de votre ligne de commande, indiquant que l'environnement est activé.
conda install ffmpeg -c conda-forge
pip install lerobotSi vous avez une GPU Nvidia et souhaitez accélérer l'inférence, installez le support CUDA :
- Téléchargez et installez CUDA Toolkit 12.4
- Téléchargez et installez cuDNN
- Installez PyTorch avec support CUDA :
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124Sur Windows, le robot communique via des ports COM (COM3, COM4, COM5, COM6, etc.). Vous avez besoin de deux ports : un pour le leader et un pour le follower.
lerobot-find-robotNotez les numéros de port. Par exemple :
- Leader (téléopérateur) :
COM5 - Follower (robot à contrôler) :
COM6
Si vous utilisez une caméra USB pour le feedback vidéo :
lerobot-find-cameraNotez l'index ou le chemin de la caméra. Exemple : index 1 pour une caméra USB.
Les fichiers de calibration actuels sont situés dans le dossier calibration_files/ :
leader-1.json: Configuration du robot leader (téléopérateur)follower-1.json: Configuration du robot follower (robot contrôlé)
Avant de calibrer, assurez-vous que tous les moteurs sont bien connectés et alimentés. Connectez le robot et exécutez :
lerobot-setup-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1Remplacez COM6 par le vrai port de votre follower.
Vérifiez que :
- Tous les 6 moteurs sont détectés (shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper)
- Les LEDs ne clignotent pas (sinon, problème de connexion)
- Le statut de chaque moteur est "OK"
Si vous n'avez pas encore les fichiers de calibration ou si le robot a changé :
lerobot-calibrate-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1 --robot.calibration_dir=.Cela créera un fichier follower-1.json avec les paramètres de calibration pour chaque moteur.
Répétez pour le leader si nécessaire :
lerobot-calibrate-motors --robot.type=so101_leader --robot.port=COM5 --robot.id=leader-1 --robot.calibration_dir=.Ouvrez les fichiers JSON de calibration (exemple calibration_files/follower-1.json) et vérifiez que chaque moteur a :
id: Identifiant du moteur (1-6)homing_offset: Position de référencerange_minetrange_max: Limites de mouvement
Exemple de structure :
{
"shoulder_pan": {
"id": 1,
"drive_mode": 0,
"homing_offset": 1618,
"range_min": 769,
"range_max": 3156
},
...
}Pour vérifier que la calibration est correcte, testez une connexion simple (voir section Test de connexion).
Si le robot est bloqué ou en position bizarre, réinitialisez-le avec le script fourni :
python scripts/reset.pyEntrez le port du robot quand demandé (ex: COM6). Cela désactivera le couple et ramènera le robot à une position neutre.
python -c "
from lerobot.robots.so_follower import SO101Follower, SO101FollowerConfig
robot = SO101Follower(config=SO101FollowerConfig(
port='COM6',
id='follower-1'
))
robot.connect()
print('Robot follower connecté avec succès !')
print(f'État du robot: {robot}')
robot.disconnect()
"Remplacez COM6 par votre port réel.
python -c "
from lerobot.robots.so_leader import SO101Leader, SO101LeaderConfig
robot = SO101Leader(config=SO101LeaderConfig(
port='COM5',
id='leader-1'
))
robot.connect()
print('Robot leader connecté avec succès !')
print(f'État du robot: {robot}')
robot.disconnect()
"Assurez-vous que :
- L'environnement conda
lerobotest activé - Les deux robots (leader et follower) sont alimentés
- Les deux ports COM sont identifiés
- Les fichiers de calibration existent dans
calibration_files/
lerobot-teleoperate ^
--robot.type=so101_follower ^
--robot.port=COM6 ^
--robot.id=follower-1 ^
--teleop.id=leader-1 ^
--teleop.type=so101_leader ^
--teleop.port=COM5 ^
--robot.calibration_dir="." ^
--teleop.calibration_dir="."lerobot-teleoperate ^
--robot.type=so101_follower ^
--robot.port=COM6 ^
--robot.id=follower-1 ^
--teleop.id=leader-1 ^
--teleop.type=so101_leader ^
--teleop.port=COM5 ^
--robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}" ^
--display_data=true- Manipulez le robot leader pour contrôler le robot follower
- L'écran affichera le flux vidéo (s'il y a une caméra)
- Appuyez sur
Ctrl+Cpour arrêter
Créez un dossier pour votre dataset :
mkdir datasets/votre_tacheEnregistrez 50 épisodes pour la tâche "Sort cubes" :
lerobot-record ^
--robot.type=so101_follower ^
--robot.port=COM6 ^
--robot.id=follower-1 ^
--robot.calibration_dir=. ^
--teleop.port=COM5 ^
--teleop.type=so101_leader ^
--teleop.calibration_dir="." ^
--teleop.id=leader-1 ^
--dataset.repo_id="local/dataset" ^
--dataset.num_episodes=50 ^
--dataset.push_to_hub=false ^
--dataset.single_task="Sort cubes" ^
--display_data=true ^
--robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}"Paramètres clés :
--dataset.num_episodes: Nombre d'épisodes à enregistrer--dataset.single_task: Nom de la tâche--dataset.repo_id: Chemin du dataset local ou ID Hugging Face
Le dataset est sauvegardé dans datasets/. Vous pouvez le visualiser avec :
python -c "
from lerobot.datasets import load_dataset
dataset = load_dataset('local/dataset')
print(f'Nombre d\'épisodes: {len(dataset)}')
print(f'Informations: {dataset.info}')
"python -c "
from lerobot.datasets import load_dataset
dataset = load_dataset('local/dataset')
print(f'Dataset: {dataset}')
"Le modèle ACT (Action Chunking with Transformers) est efficace pour ce type de tâche :
lerobot-train ^
--dataset.repo_id="local/dataset" ^
--policy.type=act ^
--output_dir=outputs/train/act_cubes ^
--job_name=act_cubes ^
--policy.device=cuda ^
--policy.repo_id=<VOTRE_USERNAME>/act_cubesParamètres clés :
--policy.type: Type de policy (act,diffusion, etc.)--policy.device:cudapour GPU,cpupour CPU--output_dir: Dossier de sauvegarde des checkpoints--job_name: Nom du travail d'entraînement
Les checkpoints sont sauvegardés dans outputs/train/act_cubes/. Vous pouvez suivre la perte d'entraînement en utilisant TensorBoard :
tensorboard --logdir=outputs/train/act_cubespython -c "
from lerobot.policy import load_policy
policy = load_policy(
policy_name_or_path='outputs/train/act_cubes/checkpoints/000000',
map_location='cuda' # ou 'cpu'
)
print(f'Policy chargée avec succès !')
print(f'Type: {policy}')
"python -c "
from lerobot.robots.so_follower import SO101Follower, SO101FollowerConfig
from lerobot.policy import load_policy
# Charger la policy
policy = load_policy(
policy_name_or_path='outputs/train/act_cubes/checkpoints/000000',
map_location='cuda'
)
# Connecter le robot
robot = SO101Follower(config=SO101FollowerConfig(
port='COM6',
id='follower-1'
))
robot.connect()
# Exécuter la policy
for step in range(100): # 100 étapes
# Obtenir l'observation (état du robot + images)
observation = robot.get_observation()
# Prédire l'action
with torch.no_grad():
action = policy(observation)
# Exécuter l'action
robot.send_action(action)
print(f'Étape {step}: action envoyée')
robot.disconnect()
print('Exécution terminée !')
"Pour une exécution avec feedback vidéo en temps réel :
python scripts/run_policy.py \
--policy_name_or_path=outputs/train/act_cubes/checkpoints/000000 \
--robot.port=COM6 \
--robot.id=follower-1 \
--robot.calibration_dir=. \
--num_episodes=5 \
--display_data=truePour tester la policy ACT entraînée en mode évaluation lors de l'enregistrement :
lerobot-record ^
--robot.type=so101_follower ^
--robot.port=COM6 ^
--robot.id=follower-1 ^
--robot.calibration_dir=. ^
--teleop.port=COM5 ^
--teleop.type=so101_leader ^
--teleop.calibration_dir="." ^
--teleop.id=leader-1 ^
--dataset.repo_id="local/eval" ^
--dataset.num_episodes=5 ^
--dataset.push_to_hub=false ^
--dataset.single_task="Sort cubes" ^
--display_data=true ^
--policy.repo_id=outputs/train/act_cubes/checkpoints/000000 ^
--robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}"Paramètres clés :
--dataset.repo_id="local/eval": Active le mode évaluation (teste la policy au lieu de faire juste de la teleopération)--policy.repo_id: Chemin vers le checkpoint du modèle ACT entraîné--dataset.num_episodes: Nombre d'épisodes de test--display_data=true: Affiche les prédictions de la policy en temps réel
Cela permettra de voir comment la policy se comporte sur le robot réel pendant l'enregistrement.
Symptômes : LED clignotante, moteurs manquants dans la config
Solutions :
- Vérifiez les connexions USB et les câbles du robot
- Essayez le commande setup moteurs :
lerobot-setup-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1
- Réinitialisez le robot :
python scripts/reset.py
Symptômes : Erreur "Port not found" ou "No robot detected"
Solutions :
lerobot-find-robotVérifiez aussi dans le Gestionnaire de périphériques Windows (Ports COM).
Symptômes : Erreur "Camera not found"
Solutions :
lerobot-find-cameraEssayez différents index (0, 1, 2, etc.) dans la configuration.
Symptômes : Moteurs en dehors de la plage de mouvement
Solutions :
- Vérifiez les paramètres dans le fichier JSON (homing_offset, range_min, range_max)
- Recalibrez les moteurs :
lerobot-calibrate-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1 --robot.calibration_dir=.
Solutions :
- Assurez-vous que CUDA est activé :
--policy.device=cuda - Réduisez la taille du batch :
--training.batch_size=16 - Utilisez une GPU plus puissante
Causes possibles :
- Dataset trop petit (besoin de plus d'épisodes)
- Calibration incorrecte
- Hyperparamètres d'entraînement mal ajustés
Solutions :
- Enregistrez plus d'épisodes
- Vérifiez la calibration
- Expérimentez avec les hyperparamètres
python scripts/reset.pylerobot-find-robotlerobot-find-cameralerobot-setup-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1lerobot-calibrate-motors --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1 --robot.calibration_dir=.lerobot-teleoperate --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1 --teleop.id=leader-1 --teleop.type=so101_leader --teleop.port=COM5 --robot.calibration_dir="." --teleop.calibration_dir="."lerobot-record --robot.type=so101_follower --robot.port=COM6 --robot.id=follower-1 --robot.calibration_dir=. --teleop.port=COM5 --teleop.type=so101_leader --teleop.calibration_dir="." --teleop.id=leader-1 --dataset.repo_id="local/dataset" --dataset.num_episodes=10 --dataset.push_to_hub=false --dataset.single_task="Ma tâche" --display_data=true --robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}"lerobot-train --dataset.repo_id="local/dataset" --policy.type=act --output_dir=outputs/train/act_dataset --job_name=act_dataset --policy.device=cuda --policy.repo_id=<USERNAME>/act_dataset- Miniforge installé
- Environnement conda créé et activé
- LeRobot et dépendances installés
- Ports COM identifiés (leader et follower)
- Moteurs détectés et configurés
- Fichiers de calibration présents
- Connexion des robots testée
- Teleopération fonctionnelle
- Dataset enregistré
- Model entraîné
- Policy exécutée avec succès
- Documentation LeRobot
- Consultez TROUBLESHOOTING.md pour des problèmes spécifiques
- Consultez README.md pour les commandes rapides