Le répertoire public de jeux de données AY-Robots montrant les jeux de données LeRobot enregistrés sur des bras de classe SO-100
Jeux de donnéesOpen X-EmbodimentDROIDSO-100LeRobot

Utilisation de DROID, BridgeData V2 et Open X sur un SO-100

AY-Robots ResearchAugust 23, 202618 min de lecture

DROID, BridgeData V2 et Open X-Embodiment se convertissent en actions d'effecteur final 7D sur des bras à 6 et 7 degrés de liberté. Un SO-100 prend 6 positions articulaires. Ce qui est transférable, ce qui ne l'est pas, et que faire à la place.

En bref

  • Les versions LeRobot des trois partagent une convention : une action d'effecteur final 7-D [x, y, z, roll, pitch, yaw, gripper] et un état 8-D avec un emplacement de remplissage. Un SO-100 prend six positions articulaires absolues.
  • Ce vecteur 7-D est l'artefact du convertisseur : le champ d'action RLDS propre à DROID est composé de 6 vitesses articulaires plus une position de préhension, avec la vue cartésienne dans action_dict.
  • Quatre horloges : DROID 15 fps, BridgeData V2 5 fps, la tranche google_robot 3 fps, un enregistrement SO-100 à 30 fps.
  • Vous ne pouvez pas les fusionner avec vos propres données. validate_all_metadata lève une exception dès la première différence de fps, robot_type ou features, et les trois diffèrent.
  • Ce qui est transféré, ce sont les poids pré-entraînés, pas les épisodes. Les données open-source représentent 9.1 percent du mélange de pré-entraînement de pi0.
  • Leur utilisation réelle la moins chère est un banc d'essai : un échantillon DROID de 2 GB et 100 épisodes, dont la qualité est avérée, qui valide votre pipeline avant d'enregistrer pendant un week-end.

Il existe un ensemble de données publiques d'un million de trajectoires sur un bucket Google Cloud et un sur le bureau qui a coûté 110 à 150 EUR en pièces. Pourquoi le premier ne peut-il pas enseigner au second ? Il le peut en partie, mais presque aucun transfert ne se produit là où les gens s'y attendent, et la partie qui semble la plus facile ne fonctionne pas du tout.

Ce qui suit : ce qui se trouve dans , et , où chacun entre en collision avec un bras 5-DoF à faible coût, et ce qu'il faut faire à la place. Chaque chiffre ci-dessous provient du document, de la fiche de données ou du fichier source auquel il appartient.

Ce que contiennent réellement les trois ensembles de données

DROIDBridgeData V2Open X-Embodiment
RobotFranka Panda, 7 DoF, Robotiq 2F-85WidowX 250, 6 DoF, rig d'environ 4 000 USD22 implémentations, 60 jeux de données, 34 laboratoires
Échelle76k trajectoires, 350 heures60 096 trajectoiresPlus d'1M de trajectoires, 527 compétences
Diversité564 scènes, 84 tâches, 50 collecteurs24 environnements, 13 compétences160 266 tâches, 21 institutions
Compositiontout téléopéré50 365 téléopérés, 9 731 scriptéspar laboratoire source
Taux de contrôle15 Hz5 Hzvarie, 3 fps et plus
Caméras2 x ZED 2 extérieures, 1 x ZED Mini au poignetjusqu'à 4, la plupart des épisodes n'utilisent que la fixeselon l'équipement du laboratoire
Téléchargement brut1.7 TB RLDS, 8.7 TB stéréo brutArchives JPEGbuckets TFDS par jeu de données
Le point d'entrée est la conversion LeRobot, pas le bucket original

Peu de gens téléchargent encore 1.7 TB de TFRecords RLDS. L'organisation communautaire IPEC-COMMUNITY a republié la majeure partie d'Open X-Embodiment sous forme de jeu de données LeRobot avec vidéo AV1, où DROID représente 392 GB. C'est la version avec laquelle vous travaillerez, et son meta/info.json est ce qu'il faut lire en premier.

DROID

Le plus standardisé des trois. Un seul équipement partout : un Franka Panda avec une pince Robotiq 2F-85, deux caméras stéréo ZED 2 réglables et une ZED Mini au poignet, téléopéré avec des contrôleurs Meta Quest 2, enregistré via Polymetis à 15 Hz à la fois dans l'espace articulaire et de l'effecteur final. Les étiquettes linguistiques sont venues plus tard via tasq.ai, jusqu'à trois par épisode.

  • 76k trajectoires, 350 heures, 564 scènes, 84 tâches, 50 collecteurs sur trois continents.
  • Le résultat principal est le co-apprentissage, et non l'apprentissage autonome : des lots mélangés à 50/50 avec des démonstrations intra-domaine ont surpassé la meilleure méthode suivante de 22 % de succès absolu en distribution, et de 17 % hors distribution.
  • IPEC-COMMUNITY/droid_lerobot : 92 233 épisodes, 27 044 326 images, franka, 15 ips, codebase_version v2.0, trois flux AV1 à 180x320, 392 Go.
  • Un échantillon de débogage de 2 Go et 100 épisodes se trouve à l'adresse gs://gresearch/robotics/droid_100. Commencez par là.

BridgeData V2

Le plus proche d'une configuration de loisir : un bras WidowX 250 à 6 degrés de liberté, 60 096 trajectoires à travers 24 environnements et 13 compétences à 5 Hz. Notez la composition : 50 365 démonstrations téléopérées par des experts plus 9 731 provenant d'une politique de prise et de placement scriptée et randomisée, donc environ 16 % ne sont pas des démonstrations humaines, ce qui est important pour l'apprentissage par imitation la qualité. Le téléchargement habituel, IPEC-COMMUNITY/bridge_orig_lerobot, rapporte 53 192 épisodes et 1 893 026 images à 5 ips, robot_type widowx : moins que les 60 096 du document, il faut donc lire le compte à partir de meta/info.json plutôt que de citer l'un ou l'autre.

Open X-Embodiment

Pas un jeu de données au sens habituel : 60 jeux de données de robots existants provenant de 34 laboratoires regroupés dans une collection RLDS couvrant 22 implémentations et plus d'un million de trajectoires. BridgeData V2 s'y trouve sous le nom de bridge_orig ; la tranche google_robot, fractal20220817_data, se convertit en 87 212 épisodes à 3 ips.

Le regroupement comporte une mise en garde que l'article énonce clairement. Pour les expériences RT-X, les auteurs convertissent chaque source en une action d'effecteur final à 7 DDL, mais n'alignent pas les systèmes de coordonnées entre les jeux de données, et permettent que les valeurs d'action soient des positions ou des vitesses absolues ou relatives, selon le schéma de contrôle original de chaque robot. Leur conclusion : le même vecteur d'action peut induire des mouvements très différents pour différents robots.

Le répertoire des jeux de données AY-Robots listant les jeux de données publics LeRobot avec le nombre d'épisodes et les descriptions de tâches
Le répertoire public des jeux de données à /directory : jeux de données déjà au format LeRobot, correspondant déjà à un bras pris en charge.

Le décalage, en quatre parties

Le désalignement d'incarnation est généralement traité comme un problème vague. Il y en a quatre, ils échouent différemment, et deux ne peuvent pas être corrigés par script.

1. Degrés de liberté

Un SO-100 possède cinq articulations de bras plus une pince. Compté comme des moteurs, c'est un bras à 6 DDL, et le document SmolVLA l'appelle ainsi ; compté comme un mécanisme de positionnement, c'est un bras à 5 DDL, et LeRobot l'appelle ainsi dans sa docstring de cinématique inverse, qui décrit la CI à orientation douce sur le SO-101 à 5 DDL où le poignet ne suit l'orientation que partiellement. Un Franka possède sept articulations de positionnement. Cet écart détermine les poses possibles : un bras à 5 DDL ne peut généralement pas atteindre une position et une orientation arbitraires simultanément, de sorte que le solveur renvoie la position la plus proche qu'il peut, un mouvement différent de celui démontré. Contexte : degrés de liberté.

python
# src/lerobot/robots/so_follower/so_follower.py
motors = {
    "shoulder_pan":  Motor(1, "sts3215", norm_mode_body),
    "shoulder_lift": Motor(2, "sts3215", norm_mode_body),
    "elbow_flex":    Motor(3, "sts3215", norm_mode_body),
    "wrist_flex":    Motor(4, "sts3215", norm_mode_body),
    "wrist_roll":    Motor(5, "sts3215", norm_mode_body),
    "gripper":       Motor(6, "sts3215", MotorNormMode.RANGE_0_100),
}
# action keys are "<motor>.pos"; send_action sync_writes them to
# "Goal_Position"  ->  a 6-D ABSOLUTE JOINT POSITION command


# openpi/src/openpi/policies/droid_policy.py
def make_droid_example() -> dict:
    return {
        "observation/exterior_image_1_left": np.random.randint(256, size=(224, 224, 3), dtype=np.uint8),
        "observation/wrist_image_left":      np.random.randint(256, size=(224, 224, 3), dtype=np.uint8),
        "observation/joint_position":        np.random.rand(7),   # seven Franka joints
        "observation/gripper_position":      np.random.rand(1),
        "prompt": "do something",
    }
# state = concat(joint_position, gripper_pos)  ->  8-D
Gauche : Le suiveur SO de LeRobot, de src/lerobot/robots/so_follower/so_follower.py. Droite : Entrée de la politique DROID d'openpi. Six contre huit.

Ainsi, un point de contrôle DROID prêt à l'emploi n'est pas un raccourci. Physical Intelligence livre pi05_droid à gs://openpi-assets/checkpoints/pi05_droid, et le même README qui vante son étendue avertit que ces points de contrôle experts pourraient ne pas se généraliser à votre configuration. Son état est composé de huit nombres d'articulations Franka et ses clés d'image sont exterior_image_1_left et wrist_image_left. Aucun drapeau ne transforme cela en une commande SO-100 à six moteurs.

2. Ce que le vecteur d'action dit réellement

Plus profond que la dimensionnalité. Dans les conversions LeRobot, les trois indiquent où le préhenseur doit aller, dans l'espace cartésien. Un SO-100 indique où six servomoteurs doivent aller. La conversion nécessite un modèle cinématique et un solveur, pas un remodelage.

PropriétéOXE, DROID et Bridge sous forme LeRobotSO-100 dans LeRobot
Vecteur d'action7-D: x, y, z, roll, pitch, yaw, gripper6-D : une position cible par moteur
Vecteur d'état8-D, avec un emplacement de remplissage (google_robot utilise un quaternion)6-D, un par moteur
RéférentielCartésien, non aligné entre les jeux de donnéesespace articulaire, calibration par bras
Absolu ou relatifl'un ou l'autre, décidé par le laboratoire sourcepositions cibles absolues
Unitésnormalisées par jeu de données, puis discrétiséesdegrés par défaut (use_degrees=True), sinon -100 à 100
Échec silencieuxun delta lu comme un absoluun bras non calibré
Le vecteur cartésien 7D est la convention du convertisseur, pas celle de DROID

Le README d'openx2lerobot documente un état unifié à 8 dimensions et une action à 7 dimensions pour chaque jeu de données qu'il convertit, d'où provient l'emplacement pad. Le propre schéma RLDS de DROID diffère : son action de niveau supérieur est un vecteur à 7 éléments composé de 6 vitesses articulaires plus 1 position de préhension, avec cartesian_position, cartesian_velocity, joint_position et joint_velocity sous action_dict. openpi lit la vue de l'espace articulaire, la version LeRobot vous donne la vue cartésienne. Aucun des deux n'est six angles absolus de servo.

LeRobot fournit bien la pièce manquante : le suiveur SO dispose d'un processeur cinématique avec les étapes InverseKinematicsEEToJoints et ForwardKinematicsJointsToEE. Ses clés sont ee.x, ee.y, ee.z plus un vecteur de rotation ee.wx, ee.wy, ee.wz et ee.gripper_pos, de sorte que même l'encodage de l'orientation diffère du roulis-tangage-lacet (roll-pitch-yaw) dans les fichiers. L'étape IK prend un orientation_weight, par défaut 0.01, dont la docstring indique de le régler à 0.0 pour une IK basée uniquement sur la position pour les bras sous-actionnés. Vous pouvez construire le pont, mais la moitié de l'orientation de chaque action empruntée reste approximée.

3. Fréquence de contrôle

DROID est à 15 Hz, BridgeData V2 à 5 Hz, la tranche google_robot à 3 ips ; les auteurs de pi0 décrivent la partie open-source de leur mélange comme un contrôle à basse fréquence entre 2 et 10 Hz. Le DatasetRecordConfig de LeRobot utilise par défaut fps 30, episode_time_s 60, reset_time_s 60, num_episodes 50. Une entraînée sur des données à 5 Hz a appris qu'une action couvre 200 ms. Rejouez-la à 30 Hz et le bras rampe ; rééchantillonnez naïvement et vous étalez l'image où le préhenseur se ferme. Cela interagit également mal avec le : un bloc de 100 étapes représente 20 secondes à 5 Hz, 3,3 secondes à 30 Hz.

4. Caméras

BridgeData V2 a randomisé deux poses de caméra toutes les 50 trajectoires, et sa page de projet note que la plupart des données ne contiennent de toute façon que la vue fixe. DROID a utilisé des supports ZED 2 réglables ainsi qu'une ZED Mini au poignet. Vous avez deux webcams USB positionnées à l'œil. La pose de la caméra n'est pas une variable parasite pour un ; c'est en grande partie ce sur quoi l'encodeur visuel s'est basé, et rien dans le format de fichier ne vous indique que les poses diffèrent.

Le piège qui dévore une journée

Les pièces s'assemblent suffisamment bien pour fonctionner. Le jeu de données se charge, l'entraînement commence, la perte diminue, les points de contrôle apparaissent, aucune erreur. Ensuite, la politique ne fait rien de reconnaissable sur le bras et vous passez une journée à chasser un bug dans votre script d'entraînement. Il n'y a pas de bug : le modèle a appris une distribution d'actions cartésiennes pour un robot qui n'existe pas dans votre pièce. Commencez par la perte diminue, la politique ne fait rien, pas par vos hyperparamètres.

Ce qui se passe lorsque vous essayez de fusionner les données malgré tout

Le plan évident est de concaténer : quelques milliers d'épisodes DROID plus vos 50. LeRobot refuse, et le refus nomme les trois choses qui diffèrent.

  1. 1
    Télécharger l'échantillon de 100 épisodes, pas les 1,7 To complets

    2 Go suffisent pour voir la structure.

    bash
    pip install gsutil tensorflow tensorflow-datasets
    gsutil -m cp -r gs://gresearch/robotics/droid_100 ~/tensorflow_datasets/
  2. 2
    Convertir RLDS au format LeRobot

    openx2lerobot encapsule les transformations standard OXE et annote le type de robot ainsi que la fréquence de contrôle. Le README place ceci dans convert.sh.

    bash
    git clone https://github.com/Tavish9/any4lerobot.git
    cd any4lerobot/openx2lerobot
    
    python openx_rlds.py \
        --raw-dir ~/tensorflow_datasets/droid_100/1.0.0 \
        --local-dir ~/lerobot_droid100 \
        --repo-id you/droid100_lerobot \
        --use-videos
  3. 3
    Lire meta/info.json avant toute autre chose

    Ce fichier détermine si le reste de votre journée se déroulera sans accroc.

    bash
    python -c "import json;d=json.load(open('meta/info.json'));\
    print(d['codebase_version'], d['robot_type'], d['fps']);\
    print(d['features']['action']['shape'], d['features']['observation.state']['shape'])"
  4. 4
    Tenter la fusion et lire l'erreur

    merge charge chaque jeu de données, puis validate_all_metadata vérifie les fps, le robot_type et les features par rapport au premier de la liste, levant une erreur à la première incompatibilité.

    bash
    lerobot-edit-dataset \
        --new_repo_id you/mixed \
        --operation.type merge \
        --operation.repo_ids "['you/droid100_lerobot', 'you/my_so100_task']"
    
    # ValueError: Same fps is expected, but got fps=30 instead of 15.

Les valeurs de référence proviennent du jeu de données que vous avez listé en premier, c'est pourquoi le message se plaint de vos 30 fps plutôt que des 15 de DROID. Corrigez les fps et vous rencontrerez la vérification du robot_type ; corrigez cela et vous rencontrerez la vérification des features, 7 contre 6 pour l'action. Aucun ordre ne permet de passer, et la même protection s'exécute au moment de l'enregistrement via sanity_check_dataset_robot_compatibility.

Ne pas coder en dur le robot_type pour contourner la vérification

Sur la branche principale actuelle de LeRobot, so100_follower et so101_follower sont tous deux enregistrés sur une seule SOFollowerRobotConfig partagée, donc la chaîne de caractères d'un enregistrement réel n'est pas nécessairement celle que vous attendez. Lisez-la depuis votre propre meta/info.json, et considérez une vérification que vous avez dû désactiver comme une vérification qui vous signalait quelque chose.

Alors, qu'est-ce qui est réellement transféré ?

Les poids, pas les épisodes. Chaque politique généraliste moderne en a absorbé une partie lors du pré-entraînement, et lorsque vous à partir d'un publié, vous l'héritez déjà réconcilié par des personnes disposant de la puissance de calcul nécessaire pour le faire correctement. L'article de pi0 est franc sur la proportion : 9,1 % de son mélange de pré-entraînement, compté en pas de temps, est constitué de données open-source incluant OXE, Bridge v2 et DROID. Ce chiffre est celui de pi0 ; le mélange de chaque fournisseur diffère.

Données publiques inter-incarnations sur un projet SO-100
Avantages
  • Priors visuels et linguistiques : l'encodeur a vu des milliers de cuisines et de tasses et sait à quoi "le bloc rouge" fait référence.
  • Un prior sur la structure de manipulation : approche, fermeture, levage, transport, relâchement, indépendant de l'incarnation même lorsque les chiffres ne le sont pas.
  • Un ensemble de données éprouvé pour les tests. Si votre tâche ne peut pas sur-apprendre 100 épisodes DROID, le problème vient de votre configuration.
  • Points de référence : sur les domaines d'ensembles de données à petite échelle, RT-1-X a atteint un taux de succès moyen 50 % plus élevé que la méthode originale ou RT-1, et RT-2-X a battu RT-2 d'environ 3x sur les compétences émergentes.
Compromis
  • Pas de supervision d'action utilisable. Une cible cartésienne 7D n'est pas une commande articulaire 6D.
  • Pas de transfert de pose de caméra, et rien dans les données n'indique que les poses diffèrent.
  • Pas de transfert de synchronisation : sources à 3, 5 et 15 ips contre un enregistreur à 30 ips.
  • Pas de transfert de préhenseur. Un Robotiq 2F-85 et une mâchoire imprimée sur un STS3215 diffèrent en termes de force, de course et de dynamique.
  • L'échelle seule n'a pas suffi, même pour ses auteurs : dans les domaines de grands ensembles de données, RT-1-X n'a pas surpassé un RT-1 entraîné uniquement sur cet ensemble de données.
  • Pas de réduction du nombre d'épisodes dont vous avez besoin.
Couche du modèleTransfert ?Pourquoi
Encodeur de visionOui, fortementLes objets et les scènes sont indépendants de l'incarnation
Ancrage linguistiqueOuiLes instructions sont du texte, pas de la géométrie
Fusion intermodalePrincipalementSe concentre sur l'objet nommé dans l'invite
Encodeur de proprioceptionNonLa dimension d'entrée et la sémantique articulaire diffèrent
Tête d'actionNonEntraîné sur un espace cartésien 7D dans lequel vous ne vous trouvez pas
Statistiques de normalisationNon, et dangereuxLes statistiques étrangères décalent chaque commande

C'est pourquoi SmolVLA se comporte différemment sur un bras à faible coût. Son article sélectionne 481 ensembles de données communautaires de Hugging Face, filtrés par type d'incarnation, nombre d'épisodes, qualité des données et couverture d'images : 22.9K épisodes, 10.6M images, évalués sur de vrais bras SO-100 et SO-101. Petit et adapté l'emporte sur grand et inadapté. Comparez sur ACT against SmolVLA.

Trois voies à suivre

Voie A : affiner à partir d'un point de contrôle qui a déjà absorbé les données

La plupart des gens devraient choisir celle-ci. Vous ne touchez jamais à DROID ou Open X-Embodiment : choisissez une politique dont le pré-entraînement a déjà absorbé les données inter-incarnations, enregistrez vos propres épisodes, affinez.

PolitiqueParamètresÉpisodes min.Format du jeu de donnéesNiveau de GPUInférencePoint de contrôle de base
GR00T N1.7~3 B, ~40 M entraînés en fine-tuning50LeRobot v2.0 or v2.1A100 or H100 80 GB152 ms par étapenvidia/GR00T-N1.7-3B
GR00T N1.5~3 B50LeRobot v2.0 or v2.1A100 or H100 80 GB165 msnvidia/GR00T-N1.5-3B
Pi0.5~3 B, architecture PaliGemma50LeRobot v3.0A100 or H100 80 GB485 mslerobot/pi05_base
SmolVLA~450 M30LeRobot v3.0RTX 4090 ou toute carte 24 Go245 mslerobot/smolvla_base
ACT~80 M50LeRobot v3.0RTX 4090 ou toute carte 24 Go20 msaucun, à partir de zéro

ACT est le cas limite honnête : pas de modèle de base, donc aucune des données publiques ne l'atteint. Ce n'est pas automatiquement un désavantage, car à 20 ms par étape d'action, c'est le seul des cinq qui peut boucler une boucle rapide, comme la page ACT l'explique. Choisissez par tâche en utilisant les cinq comparés, GR00T N1.7 contre Pi0.5, et les 332 résultats de benchmark sur 85 modèles dans l'arène.

Chemin B : utiliser DROID comme banc d'essai

L'échantillon de 100 épisodes est le meilleur 2 Go que vous téléchargerez ce mois-ci, et non pour l'entraînement. C'est un jeu de données dont vous savez qu'il est correct. Exécutez votre convertisseur, votre chargeur et une courte tâche GPU dessus ; tout ce qui échoue est un bug d'infrastructure trouvé alors que c'était bon marché. NVIDIA fait de même à grande échelle : la carte GR00T N1.7 répertorie quatre variantes post-entraînées, pour Bridge et Fractal dans SimplerEnv, DROID et LIBERO.

Chemin C : enregistrez les vôtres, délibérément

Trente à cinquante semble peu à côté de 76 000 jusqu'à ce que vous vous souveniez que les vôtres sont les seuls avec votre bras, vos caméras et votre table. Avec les paramètres par défaut de LeRobot, 50 épisodes représentent 100 minutes de temps réel. Voir , et .

La page du tutoriel d'enregistrement AY-Robots montrant les étapes pour capturer un jeu de données LeRobot à partir d'une session de téléopération
Le guide d'enregistrement à /learn/record-your-first-dataset : l'étape que les données publiques ne peuvent pas remplacer.

Deux façons de passer des données publiques à une politique fonctionnelle

All of this runs on your own machine plus a rented GPU. Knowing the manual path matters because when something breaks you will know which layer broke.

  1. 1
    Install LeRobot with the extras the scripts need

    The record and train entry points each declare their own extra.

    bash
    pip install 'lerobot[core_scripts]'   # lerobot-record
    pip install 'lerobot[training]'      # lerobot-train
    pip install gsutil tensorflow tensorflow-datasets
  2. 2
    Get a small, known-good slice

    100 DROID episodes, 2 GB.

    bash
    gsutil -m cp -r gs://gresearch/robotics/droid_100 ~/tensorflow_datasets/
  3. 3
    Convert to LeRobot form

    Writes the unified 8-D state and 7-D action, annotating robot type and control frequency.

    bash
    python openx_rlds.py \
        --raw-dir ~/tensorflow_datasets/droid_100/1.0.0 \
        --local-dir ~/lerobot_droid100 \
        --repo-id you/droid100_lerobot \
        --use-videos
  4. 4
    Check the version against your trainer

    The converter README documents v3.0 output; the published IPEC-COMMUNITY datasets report v2.0. GR00T wants v2.0 or v2.1 and crashes on v3.0; Pi0.5, SmolVLA and ACT want v3.0. Mind the gap: the only conversion script on LeRobot main goes 2.1 to 3.0.

    bash
    python src/lerobot/scripts/convert_dataset_v21_to_v30.py \
        --repo-id=you/droid100_lerobot
  5. 5
    Record your own episodes

    Defaults: 30 fps, 60 s per episode, 60 s reset, 50 episodes. The teleoperator type is so100_leader.

    bash
    lerobot-record \
      --robot.type=so100_follower \
      --robot.port=/dev/ttyACM0 \
      --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
      --teleop.type=so100_leader \
      --teleop.port=/dev/ttyACM1 \
      --dataset.repo_id=you/so100_pick_block \
      --dataset.num_episodes=50 \
      --dataset.single_task="Pick up the red block and put it in the bowl"
  6. 6
    Fine-tune on your data only

    Weights from public data, actions from your own. Do not mix the datasets.

    bash
    lerobot-train \
      --policy.path=lerobot/smolvla_base \
      --dataset.repo_id=you/so100_pick_block \
      --policy.device=cuda \
      --batch_size=4 \
      --steps=20000
Where the time actually goes

Not in training; the GPU job is hours. The conversion, the version mismatch and the moment you find your dataset is v2.0 and your trainer wants v3.0 are days. Read dataset rejected as v3 first.

La page de téléchargement du client de bureau AY-Robots, le client qui enregistre les jeux de données au format LeRobot à partir d'une session de téléopération.
Le client de bureau à /download écrit les jeux de données LeRobot directement depuis une session de téléopération, évitant la conversion RLDS.

Ce que coûte chaque chemin

CheminStockageTemps humainCoût GPUProbabilité qu'il bouge votre bras
DROID converti seul392 GBjours de conversion4 to 12 USDtrès faible, espace d'action incorrect
DROID fusionné avec vos épisodesles deuxbloqué par validate_all_metadatan/aaucun, il ne s'exécute pas
SmolVLA, 30 à 50 épisodes propresquelques Go100 min d'enregistrement1 to 3 USDélevée
GR00T N1.7, 50 épisodes propresquelques Go100 min d'enregistrement4 to 12 USDélevée
ACT à partir de zéro, 50 épisodes propresquelques Go100 min d'enregistrement1 to 3 USDélevée, 20 ms d'inférence
Échantillon DROID comme banc d'essai2 GBun après-midiune courte exécutionélevée, comme validation

L'asymétrie est le point clé : le chemin qui emprunte le plus de données est le plus coûteux et le moins susceptible de faire bouger votre bras. Moins de deux heures de votre propre téléopération valent mieux qu'un téraoctet de données Franka de quelqu'un d'autre. Pas de bras encore ? /live diffuse un SO-100 physique sans inscription. Ensuite, entraînez votre première politique, et SmolVLA sur SO-100 pour le guide spécifique.

Un plan par défaut raisonnable

Téléchargez l'échantillon DROID de 2 Go et utilisez-le pour valider votre pipeline. Ignorez les 1,7 To restants. Enregistrez 50 épisodes d'une tâche avec des caméras fixes. Affinez SmolVLA d'abord, car avec un minimum de 30 épisodes sur une carte de 24 Go, c'est le moins cher pour itérer, puis essayez GR00T N1.7 sur les mêmes données. Comparez sur votre tâche, pas sur un benchmark.

Enregistrez des ensembles de données qui correspondent déjà à votre bras

Le client de bureau écrit des ensembles de données au format LeRobot directement à partir d'une session de téléopération : bon bras, bonne fréquence d'images, bon espace d'action. Pas de conversion RLDS, pas de remappage.

Obtenez le client de bureau
Puis-je entraîner une politique sur DROID et l'exécuter sur mon SO-100 ?

Pas directement. Dans la version LeRobot, les actions DROID sont des commandes d'effecteur final 7D sur un Franka Panda à 15 ips ; dans le RLDS brut, ce sont 6 vitesses articulaires plus une position de préhension. Un SO-100 prend 6 positions articulaires absolues. Vous auriez besoin d'une couche de cinématique inverse, et même alors, un poignet à 5 DDL ne peut pas reproduire des poses 6 DDL arbitraires.

Puis-je mélanger des épisodes DROID ou Bridge avec mes propres épisodes SO-100 ?

Non. validate_all_metadata nécessite des fps, robot_type et feature schema identiques et lève une ValueError à la première non-concordance. Les trois diffèrent : 15 ou 5 ips contre 30, franka ou widowx contre votre bras, formes d'action de 7 contre 6. Réécrire les métadonnées pour passer la vérification ne corrige pas la sémantique.

L'Open X-Embodiment est-il alors inutile pour un bras à faible coût ?

Non, mais sa valeur vous parvient via des poids pré-entraînés, pas des épisodes. Les ensembles de données open-source, y compris OXE, Bridge v2 et DROID, représentent 9,1 % du mélange de pré-entraînement de pi0, et NVIDIA livre des variantes de GR00T N1.7 post-entraînées sur Bridge, Fractal, DROID et LIBERO. Ce que vous ne pouvez pas faire, c'est ajouter ces épisodes à votre propre enregistrement.

Quelle politique bénéficie le plus des données publiques inter-corps ?

Pi0.5 et les modèles GR00T bénéficient du plus grand pré-entraînement inter-corps, mais SmolVLA se comporte souvent le mieux sur un bras à faible coût : son ensemble de pré-entraînement comprend 481 ensembles de données communautaires, 22,9K épisodes et 10,6M images, évalués sur de vrais bras SO-100 et SO-101. ACT est l'opposé : pas de modèle de base, 20 ms par étape d'action.

De combien de mes propres épisodes ai-je réellement besoin ?

30 pour SmolVLA, 50 pour GR00T N1.7, GR00T N1.5, Pi0.5 et ACT. Avec les paramètres par défaut de LeRobot de 60 s par épisode et 60 s de réinitialisation, 50 épisodes représentent 100 minutes de temps réel. Les données inter-corps empruntées ne réduisent pas ces chiffres.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started