Pourquoi un format standard est important

L'apprentissage des robots a toujours souffert du fait que chaque laboratoire utilisait un format de données différent, ce qui rendait impossible le partage d'ensembles de données, la combinaison de données de différents robots ou l'utilisation de politiques pré-entraînées entre les systèmes. Le format de jeu de données LeRobot résout ce problème en définissant un schéma unique qui fonctionne sur tout le matériel pris en charge. Un ensemble de données enregistré sur un SO-100 peut être utilisé pour former une politique pour un OpenArm sans aucune conversion, à condition que les dimensions de l'espace d'action correspondent.

Comprendre le format avant d'enregistrer signifie que vous ne découvrirez pas de problème structurel dans vos données pendant la formation. Cela rend également le débogage beaucoup plus facile : lorsque la formation échoue, le premier endroit à consulter est l'ensemble de données.

Structure de l'ensemble de données : Parquet + MP4

Chaque ensemble de données LeRobot réside dans un répertoire avec cette structure :

mon_ensemble de données/ ├── méta/ │ ├── info.json # dataset metadata (robot type, fps, modalities) │ ├── tâches.jsonl # task description per episode │ └── stats.safetensors # mean/std for normalization ├── données/ │ └── morceau-000/ │ ├── épisode_000000.parquet # joint states + actions, one row per timestep │ ├── épisode_000001.parquet │ └── ... └── vidéos/ └── morceau-000/ ├── observation.images.cam_high/ │ ├── épisode_000000.mp4 # camera feed, one file per episode │ └── ... └── observation.images.cam_wrist/ └── ...

La séparation entre Parquet (pour les séries chronologiques numériques) et MP4 (pour la vidéo) est délibérée. Parquet compresse efficacement les états et les actions conjointes et prend en charge un accès aléatoire rapide par index d'épisode. MP4 utilise des codecs vidéo conçus pour les séquences d'images, produisant des fichiers 10 à 30 fois plus petits que le stockage d'images brutes sous forme de tenseurs.

Champs clés dans chaque épisode

Championne Forme Description
observation.état[T, D]Positions communes (et éventuellement vitesses) à chaque pas de temps. D est le nombre de joints (par exemple 7 pour SO-100 : 6 joints + 1 pince).
action[T, D]Ciblez les positions conjointes commandées à chaque pas de temps. Même dimensionnalité que observation.state.
horodatage[T]Temps en secondes depuis le début de l'épisode, à 50Hz par défaut (0,02s par pas).
épisode_indexscalaireIndex entier de cet épisode dans l'ensemble de données. Utilisé par le chargeur de données pour regrouper les pas de temps en épisodes.
cadre_index[T]Numéro d'image dans l'épisode (0 à T-1). Correspond au numéro d'image dans le MP4 correspondant.
suivant.fait[T]Drapeau booléen — Vrai au dernier pas de temps d'un épisode. Utilisé pour signaler les limites des épisodes pendant l'entraînement.
index_tâchescalaireIndexez dans task.jsonl. Permet des ensembles de données multitâches dans lesquels différents épisodes correspondent à différentes instructions.
Champs de la caméra : Les images de la caméra sont stockées sous forme de fichiers MP4, pas dans le Parquet. Le Parquet contient observation.images.cam_high comme référence de chemin (index de trame + index d'épisode) plutôt que comme données de pixels brutes. Le chargeur de données LeRobot gère le décodage et la synchronisation de manière transparente.

Charger et visualiser un ensemble de données existant

Chargez le lerobot-raw/aloha_sim_insertion_scripted ensemble de données de HuggingFace Hub et visualisez 3 épisodes. Cet ensemble de données contient des démonstrations scriptées d'un robot bimanuel insérant une cheville – un exemple clair de ce à quoi ressemble un ensemble de données bien structuré.

source ~/lerobot-env/bin/activate # Visualize 3 episodes from a public dataset python -m lerobot.scripts.visualize_dataset \ --repo-id lerobot-raw/aloha_sim_insertion_scripted \ --épisode-indices 0 1 2 \ --output-dir ~/dataset-viz/ # Open the generated HTML in your browser # File path printed to terminal, e.g. ~/dataset-viz/index.html

Le visualiseur génère une page HTML avec lecture vidéo de chaque épisode ainsi que des tracés d'état conjoints synchronisés. Rechercher:

  • Trajectoires articulaires fluides — des pointes pointues indiquent des artefacts d'enregistrement ou des accidents de bras
  • Durée d'épisode cohérente — les épisodes dont la durée varie énormément (par exemple, 50 contre 400 images) indiquent souvent que certaines démonstrations ont capturé des mouvements partiels ou interrompus
  • Changements d’état de la pince — la dernière dimension commune doit montrer des transitions binaires claires (ouvrir → fermer → ouvrir) pour les tâches de manipulation
# Inspect the dataset programmatically à partir de lerobot.common.datasets.lerobot_dataset importer LeRobotDataset jeu de données = LeRobotDataset("lerobot-raw/aloha_sim_insertion_scripted") print(f"Épisodes : {dataset.num_episodes}") print(f"Total d'images : {len(dataset)}") print(f"FPS : {dataset.fps}") print(f"Fonctionnalités : {list(dataset.features.keys())}") # Inspect a single frame cadre = ensemble de données[0] print(f"Forme d'état : {frame['observation.state'].shape}") print(f"Forme d'action : {frame['action'].shape}")
Facultatif – Ensembles de données de référence

Explorez la collection d'ensembles de données SVRC

La bibliothèque d'ensembles de données SVRC comprend des ensembles de données d'apprentissage de robots au format LeRobot. Parcourez-les pour comprendre à quoi ressemblent les différentes tâches et le matériel avant d'enregistrer les vôtres. Parcourir les ensembles de données →

Unité 2 terminée quand...

Vous avez visualisé avec succès 3 épisodes de lerobot-raw/aloha_sim_insertion_scripted et la sortie HTML s'ouvre dans votre navigateur. Vous pouvez identifier les champs observation.state, action et timestamp dans un fichier Parquet chargé avec Python. Vous comprenez la différence entre ce qui est stocké dans Parquet et MP4. Vous êtes prêt à enregistrer votre propre ensemble de données dans l'unité 3.