La page du tutoriel AY-Robots pour l'enregistrement de votre premier jeu de données LeRobot avec un bras SO-100
LeRobotSO-100Enregistrement de jeux de donnéesTéléopérationApprentissage par imitation

Enregistrer votre premier jeu de données LeRobot avec un SO-100

AY-Robots ResearchAugust 23, 202616 min de lecture

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éristiquetype de donnéesFormeDescription
actionfloat32[6]cibles articulaires du bras leader
observation.statefloat32[6]positions articulaires atteintes par le suiveur
observation.images.topvideo[480, 640, 3]caméra de scène, MP4 (av1 ici)
observation.images.wristvideo[480, 640, 3]caméra de poignet, même fréquence
timestampfloat32[1]secondes depuis le début de l'épisode
frame_index, episode_index, index, task_indexint64[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.

Un étalon issu d'un jeu de données réel

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.

L'entrée du glossaire AY-Robots pour le format de jeu de données LeRobot, montrant l'agencement des répertoires et les fichiers de métadonnées
Ce qui se trouve dans data/, videos/ et meta/, et quelles politiques lisent quelle version.

Ce dont vous avez besoin sur l'établi

ÉlémentDétailRemarque
Bras suiveurSO-100, six Feetech STS3215 servosenviron 110 à 150 EUR en pièces
Bras leaderun second SO-100, engrenages retirésengrenages retirés des six moteurs leaders : encodeur uniquement, moins de friction
Alimentationadaptée à la variante 7.4 V du STS3215 dans la nomenclaturevoir l'avertissement ci-dessous
Camérasdeux caméras USB, 640x480 à 30 ipsune vue de la scène, une sur le poignet
HôtePython 3.12 ou newer, ffmpegrequires-python >= 3.12
Compte HubHugging Face write tokenoptional with --dataset.push_to_hub=false
7.4 V, pas 12 V

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

bash
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-info
lerobot-info affiche un résumé du système, y compris la version de ffmpeg qu'il peut trouver sur PATH.

Les 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.

  1. 1
    Trouver 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.

    bash
    lerobot-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. 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.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    Calibrer les deux bras

    Déplacez chaque articulation au milieu de sa plage, appuyez sur Entrée, puis balayez chacune sur toute sa plage. L'id devient le nom de fichier du profil.

    bash
    lerobot-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
  4. 4
    Té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.

    bash
    lerobot-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
Où la calibration est enregistrée, et pourquoi l'ID est important

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

bash
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.0
Exécutez ceci à chaque session : la documentation avertit que ces identifiants peuvent changer après un redémarrage ou un rebranchement, selon le système d'exploitation.

Deux 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.

L'indice de la caméra n'est pas une identité stable

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

bash
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=2
Le dictionnaire de la caméra est une chaîne entre guillemets shell ; les accolades imbriquées ne sont pas de la syntaxe shell.

Les 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.

OptionPar défautDescription
--dataset.repo_idemptynom ; horodatage ajouté par défaut
--dataset.single_taskemptychaîne de tâche stockée avec chaque épisode
--dataset.root$HF_LEROBOT_HOME/repo_idchemin d'écriture, par défaut ~/.cache/huggingface/lerobot/
--dataset.fps30fréquence de la boucle de contrôle et fréquence d'images du jeu de données
--dataset.episode_time_s60secondes avant qu'un épisode n'avance automatiquement
--dataset.reset_time_s60réinitialisation de la scène ; le bras bouge, rien n'est stocké
--dataset.num_episodes50épisodes enregistrés lors de cette session
--dataset.push_to_hubtruetéléchargement à la fin de la session ; false reste local
--dataset.streaming_encodingfalse in the dataclass, true in the docs tableencodage pendant la capture ; définissez-le explicitement
--dataset.encoder_queue_maxsize30images tamponnées par caméra, ~1 s à 30 ips
--dataset.encoder_threadsnull (codec decides)threads par encodeur ; réduisez si la capture saccade
--dataset.no_stampfalseconserve repo_id exactement tel que saisi
--resumefalseajoute à un jeu de données existant ; nécessite --dataset.root
Deux options qui peuvent faire perdre une heure par surprise

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éesNiveau de GPUCoût par exécution
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 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.

Téléopération maître-esclave comme source de données
Avantages
  • 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
Compromis
  • 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 ressembleD'où cela vientComment le détecter
Vues de caméra inverséesimage du poignet sous la clé supérieureréaffectation d'index après un rebranchementlerobot-find-cameras à chaque session ; chemins par ID
Images figéesla même image pour des dizaines de lignesla caméra cesse de fournir ; la boucle répète la dernière imagevérifiez-le dans lerobot-dataset-viz
Images perduesnombre de lignes inférieur à fps fois secondesla 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 limiteune articulation plate au min ou au maxla plage du leader dépasse celle du suiveur, ou une mauvaise pose médianemin/max par articulation dans ds.meta.stats ; lerobot-find-joint-limits au préalable
Image et action désynchroniséesla politique anticipe ou retardecaméras à un fps différent de la bouclegardez chaque caméra à --dataset.fps
Temps mortlongues séquences de lignes d'action identiquesopérateur en pause avec l'enregistreur en marchepart de lignes d'action identiques consécutives
Chaîne de tâche inutilisabletask1, demo2, testsaisie rapidemeta/tasks.parquet en v3.0 (c'était meta/tasks.jsonl en v2.1) ; corrigez avec lerobot-edit-dataset modify_tasks
Les images abandonnées se cachent

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.

python
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"])
Un épisode dont la durée est très éloignée de `fps` fois la durée est un candidat à la suppression, pas à l'entraînement.

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.

bash
# 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]"
lerobot-edit-dataset effectue également le fractionnement, la fusion, la suppression de fonctionnalités, la modification des tâches et le recalcul des statistiques. Supprimez généreusement : un mauvais épisode coûte un épisode ; le conserver coûte chaque exécution entraînée dessus.
Le répertoire des ensembles de données AY-Robots listant les ensembles de données publics LeRobot avec le nombre d'épisodes et les formats
Comment les ensembles de données comparables sont dimensionnés et annotés.

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.1LeRobot v3.0
Dispositionun fichier parquet et un fichier MP4 par épisodeplusieurs épisodes par fragment
Métadonnées d'épisodeFichiers JSONLparquet fragmenté sous meta/episodes/, via la pile de jeux de données
Streaming depuis le Hubnonoui, via StreamingLeRobotDataset
Écrit par lerobot 0.6.1nonoui, ce que vous obtenez aujourd'hui
Lu par GR00T N1.7 et N1.5ouinon, doit être converti vers le bas
Enregistrement aujourd'hui, entraînement de GR00T demain

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.

bash
# 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=false
Rapide pour 50 épisodes. La mise à l'échelle est un travail différent : le guide de portage de lerobot, pour DROID brut vers v3.0, prévoit plus de 7 jours de traitement local et environ 400 Go.

Deux 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.

Ce que coûte cette approche

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.

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 bureau

Du 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.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started