
Enregistrez un jeu de données LeRobot utilisable avec un SO-100 : calibration, téléopération leader-follower, les vrais drapeaux et valeurs par défaut de lerobot-record, configuration de la caméra, nombre d'épisodes, et les défauts qui gâchent une exécution.
Un SO-100 suiveur, un bras leader de même conception et deux caméras USB peuvent affiner une politique en un après-midi. Le même banc peut tout aussi facilement produire soixante épisodes qui semblent sains dans un explorateur de fichiers et gaspiller une exécution GPU de six heures. La différence est rarement le modèle ; c'est ce qui s'est passé entre les servomoteurs et le fichier parquet.
Voici la voie manuelle, puis la plus courte. Chaque commande provient de lerobot 0.6.1, publié le 3 août 2026 et actuel sur PyPI. Il est passé aux points d'entrée de la console, donc les tutoriels qui exécutent python lerobot/scripts/control_robot.py décrivent un fichier qui n'existe plus.
La version courte
- •lerobot 0.6.1 enregistre en v3.0 ; GR00T N1.7 et N1.5 veulent la v2.1. Définissez le format avant d'appuyer sur enregistrer.
- •Quatre commandes : lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Utilisez les mêmes --robot.id et --teleop.id de la calibration pour la session d'enregistrement.
- •Paramètres par défaut réels : 30 ips, 60 s par épisode, 60 s de réinitialisation, 50 épisodes, environ 100 minutes de temps réel.
- •Nombre minimum d'épisodes ici : 30 pour SmolVLA, 50 pour les autres.
- •La diversité l'emporte sur le volume. Les jeux de données échouent pour quatre raisons : indices de caméra inversés, images perdues ou figées, une articulation bloquée à sa limite, une chaîne de tâche illisible.
Ce qu'une session d'enregistrement capture
Un jeu de données LeRobot n'est pas un dossier de vidéos mais une table indexée par le temps avec des vidéos jointes : chaque tic de boucle de contrôle écrit une ligne contenant l'action commandée, l'état atteint par le suiveur, une image par caméra, un horodatage et des indices. La politique ne voit que ces colonnes. Le schéma de lerobot/svla_so100_pickplace, lu depuis son meta/info.json.
| Caractéristique | type de données | Forme | Description |
|---|---|---|---|
| action | float32 | [6] | cibles articulaires du bras leader |
| observation.state | float32 | [6] | positions articulaires atteintes par le suiveur |
| observation.images.top | video | [480, 640, 3] | caméra de scène, MP4 (av1 ici) |
| observation.images.wrist | video | [480, 640, 3] | caméra de poignet, même fréquence |
| timestamp | float32 | [1] | secondes depuis le début de l'épisode |
| frame_index, episode_index, index, task_index | int64 | [1] | informations de suivi auto-remplies |
Les articulations sont main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll et main_gripper : les six degrés de liberté du SO-100. L'action et l'état partagent une forme car la téléopération leader-suiveur enregistre une cible et la position atteinte un pas plus tard. Cet écart est une information : là où le bras a lutté contre la gravité ou un objet coincé. Ces chaînes de caractères sont celles de ce jeu de données. Une session enregistrée avec la version 0.6.1 aujourd'hui écrit shoulder_pan.pos jusqu'à gripper.pos, IDs 1 à 6 sur le bus : les mêmes six articulations, des clés différentes, ce qui est important dès qu'une configuration adresse une caractéristique par son nom.
Ce jeu de données contient 50 épisodes et 19 631 images à 30 ips : environ 393 images, soit 13 secondes, par épisode. Si les vôtres durent en moyenne une minute, vous faites quelque chose de plus difficile ou vous enregistrez du temps mort aux deux extrémités.

Ce dont vous avez besoin sur l'établi
| Élément | Détail | Remarque |
|---|---|---|
| Bras suiveur | SO-100, six Feetech STS3215 servos | environ 110 à 150 EUR en pièces |
| Bras leader | un second SO-100, engrenages retirés | engrenages retirés des six moteurs leaders : encodeur uniquement, moins de friction |
| Alimentation | adaptée à la variante 7.4 V du STS3215 dans la nomenclature | voir l'avertissement ci-dessous |
| Caméras | deux caméras USB, 640x480 à 30 ips | une vue de la scène, une sur le poignet |
| Hôte | Python 3.12 ou newer, ffmpeg | requires-python >= 3.12 |
| Compte Hub | Hugging Face write token | optional with --dataset.push_to_hub=false |
Le STS3215 existe en deux versions : le SO-ARM100 README évalue la version 7.4 V à 16.5 kg.cm de couple de blocage mesuré à 6 V et la version 12 V à 30 kg.cm, et note que choisir les moteurs 12 V signifie également acheter une alimentation 12 V 5 A+ au lieu de celle de 5 V. La nomenclature liste des servos 7.4 V. Alimenter des servos évalués à 7.4 V avec 12 V les détruit, alors lisez l'étiquette du moteur avant de câbler quoi que ce soit. Servo ne répond pas.
Si le bras n'est pas encore construit, c'est une tâche pour une autre soirée : commencez par et le . Si vous n'avez encore rien acheté, lisez d'abord la : le SO-101 est la révision plus récente avec un câblage amélioré et sans étape de retrait d'engrenage, et le flux de travail d'enregistrement est identique.
Installer lerobot 0.6.1
conda create -y -n lerobot python=3.12
conda activate lerobot
# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge
# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'
lerobot-infoLes extras sont ce qui pose le plus de problèmes. pip install lerobot installe uniquement les dépendances ML de base, rien qui ne communique avec un robot. Les bras Koch nécessitent dynamixel au lieu de feetech. Si votre shell n'a jamais entendu parler de lerobot-record, c'est la raison.
Ports, identifiants de moteur et calibration
Trois étapes uniques séparent les composants d'une boucle de téléopération fonctionnelle. permet à une politique entraînée sur votre bras de fonctionner sur celui de quelqu'un d'autre, en mappant les comptes bruts de l'encodeur sur une convention d'articulation partagée.
- 1Trouver le port USB de chaque bras
Exécutez-le avec les deux bras branchés, débranchez celui que vous identifiez lorsque vous y êtes invité, et notez quel port disparaît. Sous Linux, vous pourriez avoir besoin de
sudo chmod 666 /dev/ttyACM0.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2Écrire les identifiants de moteur et les débits en bauds
Les identifiants sont écrits un moteur à la fois, et la documentation est stricte sur la manière de procéder : connectez exactement un moteur à la carte de contrôle, pas encore en série avec un autre. Le script parcourt la chaîne à l'envers, demandant d'abord la pince et lui attribuant l'ID 6, puis le poignet (wrist_roll) comme 5, jusqu'à l'épaule (shoulder_pan) comme 1. Faites-le avant l'assemblage.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Calibrer les deux bras
Déplacez chaque articulation au milieu de sa plage, appuyez sur Entrée, puis balayez chacune sur toute sa plage. L'
iddevient le nom de fichier du profil.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4Téléopérer avant d'enregistrer quoi que ce soit
Le test d'acceptation pour tout ce qui précède. Si la téléopération est saccadée, inversée, ou si une articulation ne suit pas, l'enregistrement le conserve en 50 épisodes.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
Les profils sont enregistrés dans $HF_LEROBOT_CALIBRATION, par défaut ~/.cache/huggingface/lerobot/calibration, et l'ID est la clé de recherche. Donnez à lerobot-record un ID calibré et il proposera d'appuyer sur Entrée pour réutiliser le profil ou sur c pour le refaire. Donnez-lui un ID inconnu et il n'y aura pas de fichier, il lancera donc la calibration en pleine session.
Les caméras décident ce que la politique perçoit
lerobot-find-cameras opencv # or: lerobot-find-cameras realsense
# --- Detected Cameras ---
# Camera #0:
# Name: OpenCV Camera @ 0
# Type: OpenCV
# Id: 0
# Backend api: AVFOUNDATION
# Default stream profile:
# Format: 16.0
# Width: 1920
# Height: 1080
# Fps: 15.0Deux vues, et leur positionnement est important : une caméra de scène fixe couvrant l'espace de travail, et une caméra de poignet près de l'effecteur terminal montrant ce que le préhenseur est sur le point de toucher. La liste de contrôle des jeux de données communautaires LeRobot demande de préférence deux vues à 480x640 / 720p ou mieux, un arrière-plan statique, un éclairage neutre et stable, et le bras du leader et les membres humains hors champ. Le guide d'enregistrement ajoute la règle empirique : vous devriez être capable d'effectuer la tâche vous-même en ne regardant que les images de la caméra.
Les indices OpenCV proviennent de l'ordre d'énumération, de sorte qu'un redémarrage ou un rebranchement peut faire échanger les places des indices 0 et 2 et placer la vue du poignet dans l'emplacement principal pour toute une session. lerobot le dit lui-même : sa classe de caméra prend un chemin de périphérique ainsi qu'un entier, et avertit que les indices sont instables lors des redémarrages ou des changements de port, en particulier sous Linux. Pointez index_or_path vers le lien symbolique udev sous /dev/v4l/by-id/, qui suit le périphérique plutôt que l'ordre d'énumération. C'est la manière la plus courante pour qu'un jeu de données devienne incohérent en interne, et l'entraînement ne peut pas le réparer. Caméra non détectée.
La commande record et toutes les options
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_so100_follower \
--robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so100_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_so100_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so100_pick_cube \
--dataset.single_task="Pick the red cube and drop it in the box" \
--dataset.num_episodes=50 \
--dataset.fps=30 \
--dataset.episode_time_s=25 \
--dataset.reset_time_s=10 \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2Les valeurs par défaut ci-dessous proviennent de src/lerobot/configs/dataset.py sur la branche main, pas d'un tutoriel. Plusieurs ne sont pas ce que les gens supposent.
| Option | Par défaut | Description |
|---|---|---|
| --dataset.repo_id | empty | nom ; horodatage ajouté par défaut |
| --dataset.single_task | empty | chaîne de tâche stockée avec chaque épisode |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | chemin d'écriture, par défaut ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | fréquence de la boucle de contrôle et fréquence d'images du jeu de données |
| --dataset.episode_time_s | 60 | secondes avant qu'un épisode n'avance automatiquement |
| --dataset.reset_time_s | 60 | réinitialisation de la scène ; le bras bouge, rien n'est stocké |
| --dataset.num_episodes | 50 | épisodes enregistrés lors de cette session |
| --dataset.push_to_hub | true | téléchargement à la fin de la session ; false reste local |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | encodage pendant la capture ; définissez-le explicitement |
| --dataset.encoder_queue_maxsize | 30 | images tamponnées par caméra, ~1 s à 30 ips |
| --dataset.encoder_threads | null (codec decides) | threads par encodeur ; réduisez si la capture saccade |
| --dataset.no_stamp | false | conserve repo_id exactement tel que saisi |
| --resume | false | ajoute à un jeu de données existant ; nécessite --dataset.root |
Votre jeu de données n'est pas nommé comme vous l'avez tapé. lerobot ajoute une balise date-heure, donc so100_pick_cube devient so100_pick_cube_20260823_141530. Utilisez --dataset.no_stamp=true pour un nom stable. La reprise compte les ajouts, pas les totaux. Avec --resume=true, --dataset.num_episodes compte les épisodes supplémentaires et --dataset.root devient obligatoire. Demandez 50 sur un jeu de données de 30 épisodes et vous en obtenez 80.
Contrôle clavier pendant une session
- Flèche droite ou
n: terminer l'épisode ou la phase de réinitialisation plus tôt. C'est la touche que vous utilisez le plus, car une prise propre nécessite rarement 25 secondes. - Flèche gauche ou
r: annuler l'épisode et le refaire. Une mauvaise prise ne coûte rien maintenant et beaucoup plus tard. - Échap ou
q: arrêter la session, terminer l'encodage, télécharger. - Ces commandes fonctionnent sur X11, Wayland et SSH sans interface graphique : sans backend de touches global, lerobot-record lit les mêmes touches depuis le terminal de contrôle. Les lettres survivent aux liaisons SSH lentes, où les séquences de flèches se divisent.
- La téléopération au clavier est différente et nécessite un backend global : X11, Windows ou macOS avec Accessibilité.
Combien d'épisodes, et à quoi ressemble un bon épisode
Le guide d'enregistrement suggère au moins 50 épisodes pour une première tâche, soit environ 10 par emplacement d'objet. Les pages de politiques listent un minimum par modèle, en dessous duquel une exécution ne vaut pas le temps GPU.
| Politique | Épisodes min. | Format du jeu de données | Niveau de GPU | Coût par exécution |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
La meilleure question est de savoir combien de quoi. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) ont collecté plus de 40 000 démonstrations et effectué plus de 15 000 déploiements réels. La généralisation a suivi une relation approximativement en loi de puissance avec le nombre d' environnements et d'objets, et au-delà d'un seuil par environnement ou objet, les démonstrations supplémentaires ont eu un effet minimal. Sur un banc d'essai : déplacez l'objet, changez l'éclairage, échangez le cube, plutôt que de répéter une seule prise.
- Des trajectoires articulaires continues qu'un servo peut reproduire, contrairement au clavier ou à la manette de jeu
- L'action et l'état partagent une convention de coordonnées, de sorte que la politique apprend une cible qu'elle peut commander directement
- Un épisode de 25 secondes plus une réinitialisation de 10 secondes représente environ 100 épisodes par heure
- L'opérateur sent le suiveur caler ou se bloquer, de sorte que les défauts apparaissent avant que les données ne soient validées
- Un deuxième bras double approximativement le coût des pièces
- Les démonstrations héritent des habitudes de l'opérateur ; Mandlekar et al. ont constaté que la qualité de la politique dépend fortement de la qualité de la démonstration
- Le leader est échantillonné à la fréquence de la boucle, de sorte que les pauses deviennent des lignes quasi identiques qui apprennent à la politique à attendre
- Rien n'impose la cohérence entre les sessions : une caméra déplacée de 5 cm est un décalage de distribution caché
Un bon épisode est ennuyeux : pose initiale reproductible, une seule chose faite, terminée une fois l'objet dans la poubelle, chaîne de tâche de 25 à 50 caractères comme recommandé par la liste de contrôle. Prendre le cube rouge et le déposer dans la boîte est une chaîne de tâche ; task1 est l'anti-modèle que la liste de contrôle nomme explicitement. Les annotations vagues figurent en tête de sa liste de problèmes, et elles sont les plus importantes pour modèles vision-langage-action, où la chaîne est une entrée de modèle, pas un nom de fichier.
Défauts qui ruinent discrètement un jeu de données
Aucun ne lève d'exception. Tous survivent à l'entraînement, se manifestant par une courbe de perte qui semble correcte et un robot qui ne fait rien. Vérifiez pendant que la scène est configurée.
| Défaut | À quoi cela ressemble | D'où cela vient | Comment le détecter |
|---|---|---|---|
| Vues de caméra inversées | image du poignet sous la clé supérieure | réaffectation d'index après un rebranchement | lerobot-find-cameras à chaque session ; chemins par ID |
| Images figées | la même image pour des dizaines de lignes | la caméra cesse de fournir ; la boucle répète la dernière image | vérifiez-le dans lerobot-dataset-viz |
| Images perdues | nombre de lignes inférieur à fps fois secondes | la file d'attente déborde, supprime plutôt que de bloquer | 'Encoder queue full' dans le journal ; lignes vs fps fois durée |
| Articulation à sa limite | une articulation plate au min ou au max | la plage du leader dépasse celle du suiveur, ou une mauvaise pose médiane | min/max par articulation dans ds.meta.stats ; lerobot-find-joint-limits au préalable |
| Image et action désynchronisées | la politique anticipe ou retarde | caméras à un fps différent de la boucle | gardez chaque caméra à --dataset.fps |
| Temps mort | longues séquences de lignes d'action identiques | opérateur en pause avec l'enregistreur en marche | part de lignes d'action identiques consécutives |
| Chaîne de tâche inutilisable | task1, demo2, test | saisie rapide | meta/tasks.parquet en v3.0 (c'était meta/tasks.jsonl en v2.1) ; corrigez avec lerobot-edit-dataset modify_tasks |
L'encodeur maintient une file d'attente bornée par caméra, 30 images par défaut. Lorsqu'il ne peut pas suivre, les images sont abandonnées plutôt que bloquées : la capture continue et rien ne plante. Vous obtenez Encoder queue full for {camera}, dropped N frame(s) et un total par caméra à la fin de l'épisode. Le seuil lerobot : environ 5 pour cent d'images manquantes signifie un système surchargé, 2 pour cent est une charge de démarrage attendue. Solutions dans l'ordre : --display_data=false, réduire --dataset.encoder_threads, vcodec=h264, streaming désactivé.
Une mise en garde : le tableau du guide de streaming-encoding liste la valeur par défaut comme True, tandis que la dataclass sur main indique streaming_encoding: bool = False. La documentation et le code ne concordent pas, il est donc préférable de le définir explicitement ; lerobot enregistre une suggestion le recommandant chaque fois qu'il démarre avec le flag désactivé.
Vérifier le jeu de données avant de louer un GPU
Le test d'acceptation de la documentation : comparer la durée de la vidéo à la durée de l'épisode rapportée par la CLI, et confirmer que le nombre de lignes est égal au nombre d'images par seconde (fps) multiplié par la durée. Par épisode, pas sur le total.
from lerobot.datasets import LeRobotDataset
ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)
# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])
# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])Ensuite, examinez-le. lerobot-dataset-viz rejoue un épisode image par image avec les tracés des articulations à côté des vues de la caméra, dans Rerun ou Foxglove. Les caméras inversées et les images figées apparaissent en dix secondes. Les gens sautent cette étape.
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 ou v3.0 : décidez avant d'enregistrer
La v2.1 écrivait un fichier parquet et un fichier MP4 par épisode. La v3.0 concatène de nombreux épisodes en des fragments partagés et reconstruit les limites à partir des métadonnées, de sorte que info.json contient des modèles de chemin comme data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet au lieu d'un numéro d'épisode. La justification en amont est un nombre réduit de fichiers plus volumineux : une initialisation plus rapide et moins de pression sur le système de fichiers à grande échelle.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Disposition | un fichier parquet et un fichier MP4 par épisode | plusieurs épisodes par fragment |
| Métadonnées d'épisode | Fichiers JSONL | parquet fragmenté sous meta/episodes/, via la pile de jeux de données |
| Streaming depuis le Hub | non | oui, via StreamingLeRobotDataset |
| Écrit par lerobot 0.6.1 | non | oui, ce que vous obtenez aujourd'hui |
| Lu par GR00T N1.7 et N1.5 | oui | non, doit être converti vers le bas |
lerobot 0.6.1 écrit en v3.0, mais GR00T N1.7 et N1.5 lisent la v2.0 ou la v2.1 et plantent dessus. Notez le sens de la marche : src/lerobot/scripts/ contient convert_dataset_v21_to_v30.py et rien dans l'autre sens. Réglez cela avant la session. Correctif : jeu de données rejeté en tant que v3.
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube
# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube \
--root=/path/to/dataset/directory \
--push-to-hub=falseDeux chemins vers le même jeu de données
Tout ce qui précède, sur votre propre machine : vous maîtrisez l'énumération USB, la compilation ffmpeg, le réglage de l'encodeur et les fichiers de calibration. C'est la bonne approche pour comprendre le pipeline, utiliser une configuration de caméra inhabituelle ou conserver les données localement.
Temps : une soirée par bras pour l'assemblage, une première calibration délicate, et une première session que vous jetterez parce qu'une caméra était dans le mauvais emplacement.
Le client de bureau enregistre des jeux de données au format LeRobot, des épisodes, des flux de caméra et des états articulaires, directement à partir d'une session de téléopération . Ce jeu de données alimente le formulaire d'entraînement : choisissez le modèle, le jeu de données et les hyperparamètres, et le backend loue un GPU dimensionné par la VRAM du modèle, exécute l'entraîneur et écrit des points de contrôle dans le stockage d'objets.
- 1Installer le client
Sur la page de téléchargement ; configuration dans la documentation client.
- 2Enregistrer depuis une session de téléopération
Pilotez le bras ; le client écrit les épisodes au format LeRobot. Guide pas à pas : enregistrez votre premier jeu de données.
- 3Ou apportez vos propres données
Un jeu de données peut également provenir d'un identifiant de dépôt Hugging Face ou de votre propre machine : documentation des jeux de données, répertoire public.
- 4Entraîner et réexécuter
Choisissez la combinaison sur la matrice d'entraînement, puis exécutez la politique sur le bras. Environ 1 à 3 USD sur le niveau 24 Go, 4 à 12 sur le niveau A100 ou H100.
Il n'assemble ni ne calibre votre bras, et il ne répare pas un épisode défectueux, l'étape d'inspection reste donc applicable. Il y a aussi une limite stricte à l'autre extrémité : pour les tâches rapides, l'inférence doit se trouver à proximité des servomoteurs. La boucle de contrôle s'exécute en 20 à 485 ms par étape d'action, et les allers-retours sur l'internet public transforment une politique fonctionnelle en une politique hésitante.
Enregistrez des jeux de données LeRobot sans câbler le pipeline vous-même
Le client de bureau AY-Robots enregistre les épisodes, les flux de caméra et les états articulaires au format LeRobot à partir d'une session de téléopération, puis transmet le jeu de données à l'entraîneur.
Obtenir le client de bureauDu jeu de données à la politique
Cinquante épisodes propres alimentent chaque exécuté ici. s'entraîne à partir de zéro sur votre tâche seule, environ 80 millions de paramètres à environ 20 ms par étape d'action, le seul des cinq à l'aise avec les mouvements rapides. est d'environ 450 millions de paramètres sur une carte de 24 Go. est un modèle de fondation d'environ 3 milliards de paramètres où touche environ 40 millions de paramètres, nécessite un A100 ou un H100, et demande ce jeu de données v2.1.
Ensuite, le guide pour votre combinaison : , ou ; pour une première exécution, est plus court. Lorsque la politique fonctionne sur le banc mais s'effondre dès que vous déplacez la table, c'est un problème de données : et approfondissent la question de la diversité.
De combien d'épisodes ai-je réellement besoin pour une première politique fonctionnelle ?▾
Trente pour SmolVLA, cinquante pour ACT, Pi0.5, GR00T N1.5 et N1.7, les minimums imposés par les entraîneurs AY-Robots. Le guide LeRobot recommande indépendamment au moins 50 pour une première tâche, environ 10 par emplacement d'objet. Les travaux sur la mise à l'échelle des données ont montré que la généralisation évolue avec les environnements et les objets plutôt qu'avec le nombre de démonstrations, donc cent prises d'une scène sont moins efficaces que cinquante réparties sur cinq placements.
Ai-je besoin d'un bras leader, ou puis-je téléopérer avec un clavier ?▾
lerobot fournit des téléopérateurs clavier et manette, donc un bras leader n'est pas strictement nécessaire, mais il est fortement préférable : le mode leader-follower donne des trajectoires articulaires continues dans la convention de coordonnées de l'action enregistrée, tandis que l'entrée clavier produit un mouvement par étapes qu'une politique apprend comme des à-coups. La téléopération au clavier nécessite également un backend de touches global, elle échoue donc sur Wayland et en mode sans tête.
Puis-je enregistrer sur un Raspberry Pi ou un petit mini PC ?▾
Oui, avec un réglage fin. Le guide d'encodage en streaming propose une catégorie de ressources faibles couvrant les machines modernes à 4 cœurs et le Raspberry Pi 5, et place deux caméras à 640x480 et 30 ips dans sa colonne « nécessite un certain réglage ». Son conseil : empêcher l'encodeur de concurrencer la boucle de capture, via --dataset.rgb_encoder.vcodec=h264 et --dataset.streaming_encoding=false. Il estime que deux caméras à 640x480 représentent environ 55 millions de pixels par seconde et deux à 1920x1080 environ 373 millions.
Comment savoir si le jeu de données que je viens d'enregistrer est réellement sain ?▾
Trois vérifications simples. Comparez la durée vidéo de chaque épisode à la durée rapportée par la CLI et confirmez que le nombre de lignes est égal aux ips multipliées par cette durée, par épisode plutôt que sur le total ; c'est le test d'acceptation fourni par le guide d'encodage de lerobot. Lisez ds.meta.stats, où une articulation dont le min est égal à son max n'a jamais bougé. Ensuite, rejouez deux ou trois épisodes dans lerobot-dataset-viz, la seule façon de détecter les vues inversées et les images figées. Pour les images perdues, le guide fixe la limite à environ 5 pour cent manquants ; environ 2 pour cent est une charge transitoire normale, souvent juste au démarrage.
Mon travail d'entraînement a rejeté le jeu de données comme étant v3.0. Que faire ?▾
GR00T N1.7 et N1.5 lisent LeRobot v2.0 ou v2.1 et plantent sur v3.0, ce que lerobot 0.6.1 enregistre. Soit vous définissez le format avant l'entraînement, soit vous utilisez une politique qui lit v3.0 nativement : Pi0.5, SmolVLA ou ACT. lerobot fournit un convertisseur de v2.1 vers v3.0 et rien en sens inverse.
Sources
- LeRobot: Apprentissage par imitation sur des robots réels
- LeRobot: Assemblage, configuration des moteurs et calibration du SO-100
- LeRobot: Caméras et lerobot-find-cameras
- LeRobot: Installation et la matrice des extras
- LeRobotDataset v3.0: structure et migration v2.1
- LeRobot: Encodage vidéo en streaming et images perdues
- LeRobot: Portage de grands ensembles de données vers v3.0 (DROID)
- lerobot v0.6.1 version, 3 août 2026
- DatasetRecordConfig: les paramètres d'enregistrement par défaut réels
- lerobot_record.py: boucle d'enregistrement et gestion de la reprise
- TheRobotStudio/SO-ARM100: dépôt de construction et nomenclature
- Hugging Face: Liste de contrôle des ensembles de données communautaires LeRobot
- lerobot/svla_so100_pickplace: 50 épisodes, 19 631 images
- Lin et al. (2024), Lois d'échelle des données en apprentissage par imitation
- Mandlekar et al. (2021), Ce qui compte dans l'apprentissage à partir de démonstrations humaines hors ligne
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started