La página del tutorial de AY-Robots para grabar tu primer conjunto de datos LeRobot con un brazo SO-100
LeRobotSO-100Grabación de conjuntos de datosTeleoperaciónAprendizaje por imitación

Graba tu primer conjunto de datos LeRobot con un SO-100

AY-Robots ResearchAugust 23, 202616 min de lectura

Graba un conjunto de datos LeRobot utilizable con un SO-100: calibración, teleoperación líder-seguidor, los indicadores y valores predeterminados reales de lerobot-record, configuración de la cámara, recuentos de episodios y los defectos que arruinan una ejecución.

Un SO-100 seguidor, un brazo líder del mismo diseño y dos cámaras USB pueden ajustar una política en una tarde. El mismo banco puede producir fácilmente sesenta episodios que se ven saludables en un explorador de archivos y desperdiciar una ejecución de GPU de seis horas. La diferencia rara vez es el modelo; es lo que sucedió entre los servos y el archivo parquet.

Aquí está la ruta manual, luego la más corta. Cada comando es de lerobot 0.6.1, lanzado el 3 de agosto de 2026 y actual en PyPI. Se movió a puntos de entrada de consola, por lo que los tutoriales que ejecutan python lerobot/scripts/control_robot.py describen un archivo que ya no existe.

La versión corta

  • lerobot 0.6.1 graba v3.0; GR00T N1.7 y N1.5 requieren v2.1. Establezca el formato antes de grabar.
  • Cuatro comandos: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Mantenga los mismos --robot.id y --teleop.id desde la calibración hasta la sesión de grabación.
  • Valores predeterminados reales: 30 fps, 60 s por episodio, 60 s de reinicio, 50 episodios, aproximadamente 100 minutos de tiempo real.
  • Episodios mínimos aquí: 30 para SmolVLA, 50 para el resto.
  • La diversidad supera al volumen. Los conjuntos de datos fallan por cuatro cosas: índices de cámara intercambiados, fotogramas caídos o congelados, una articulación estacionada en su límite, una cadena de tarea ilegible.

Lo que captura una sesión de grabación

Un conjunto de datos LeRobot no es una carpeta de videos, sino una tabla indexada por tiempo con video adjunto: cada ciclo de control escribe una fila que contiene la acción comandada, el estado alcanzado por el seguidor, un fotograma por cámara, una marca de tiempo e índices. La política solo ve esas columnas. El esquema de lerobot/svla_so100_pickplace, leído de su meta/info.json.

Característicatipo de datoFormaDescripción
actionfloat32[6]objetivos de las articulaciones del brazo líder
observation.statefloat32[6]posiciones de las articulaciones alcanzadas por el seguidor
observation.images.topvideo[480, 640, 3]cámara de escena, MP4 (av1 aquí)
observation.images.wristvideo[480, 640, 3]cámara de muñeca, misma tasa
timestampfloat32[1]segundos desde el inicio del episodio
frame_index, episode_index, index, task_indexint64[1]contabilidad auto-poblada

Las articulaciones son main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll y main_gripper: los seis grados de libertad. Acción y estado comparten una forma porque teleoperación líder-seguidor registra un objetivo y la posición alcanzada un paso después. Esa brecha es información: dónde el brazo luchó contra la gravedad o un objeto atascado. Esas cadenas son las de ese conjunto de datos. Una sesión grabada con 0.6.1 hoy escribe shoulder_pan.pos hasta gripper.pos, IDs 1 a 6 en el bus: las mismas seis articulaciones, diferentes claves, lo cual importa en el momento en que una configuración se refiere a una característica por su nombre.

Una medida de un conjunto de datos real

Ese conjunto de datos contiene 50 episodios y 19,631 fotogramas a 30 fps: aproximadamente 393 fotogramas, o 13 segundos, por episodio. Si los suyos promedian un minuto, está haciendo algo más difícil o grabando tiempo muerto en ambos extremos.

La entrada del glosario de AY-Robots para el formato de conjunto de datos LeRobot, mostrando la estructura de directorios y los archivos de metadatos
¿Qué reside en data/, videos/ y meta/, y qué políticas leen qué versión?

Lo que necesitas en el banco de trabajo

ElementoDetalleNota
Brazo seguidorSO-100, seis servos Feetech STS3215aproximadamente 110 a 150 EUR en piezas
Brazo líderun segundo SO-100, engranajes retiradosengranajes retirados de los seis motores líderes: solo codificador, menos fricción
Alimentacióncoincidente con la variante STS3215 de 7.4 V en la lista de materialesver la advertencia a continuación
Cámarasdos cámaras USB, 640x480 a 30 fpsuna vista de la escena, una en la muñeca
AnfitriónPython 3.12 o posterior, ffmpegrequires-python >= 3.12
Cuenta de Hubtoken de escritura de Hugging Faceoptional with --dataset.push_to_hub=false
7.4 V, no 12 V

El STS3215 viene en dos versiones: el README del SO-ARM100 clasifica la versión de 7.4 V con un par de bloqueo de 16.5 kg.cm medido a 6 V y la versión de 12 V con 30 kg.cm, y señala que elegir los motores de 12 V también significa comprar una fuente de alimentación de 12 V 5 A+ en lugar de la de 5 V. La lista de materiales incluye servos de 7.4 V. Alimentar con 12 V a servos clasificados para 7.4 V los destruye, así que lee la etiqueta del motor antes de cablear cualquier cosa. Servo no responde.

Si el brazo aún no está construido, eso es una tarea para otra noche: empieza en Introducción al SO-100 y la guía completa de configuración del SO-100. Si aún no has comprado nada, lee primero la comparación SO-100 vs SO-101 primero: el SO-101 es la revisión más reciente con cableado mejorado y sin el paso de extracción de engranajes, y el flujo de trabajo de grabación es idéntico.

Instalar 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 imprime un resumen del sistema, incluyendo la versión de ffmpeg que puede encontrar en PATH.

Los extras son lo que más confunde a la gente. pip install lerobot instala solo las dependencias principales de ML, nada que se comunique con un robot. Los brazos Koch necesitan dynamixel en lugar de feetech. Si tu shell nunca ha oído hablar de lerobot-record, esta es la razón.

Puertos, IDs de motor y calibración

Tres pasos únicos se interponen entre las piezas y un bucle de teleoperación funcional. permite que una política entrenada en su brazo funcione en el de otra persona, mapeando los conteos brutos del codificador a una convención de articulación compartida.

  1. 1
    Encontrar el puerto USB de cada brazo

    Ejecútelo con ambos brazos conectados, desconecte el que está identificando cuando se le solicite y anote qué puerto desaparece. En Linux, es posible que necesite 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
    Escribir IDs de motor y velocidades de transmisión

    Los IDs se escriben un motor a la vez, y la documentación es estricta sobre cómo: conecte exactamente un motor a la placa controladora, aún no encadenado a ningún otro. El script recorre la cadena hacia atrás, solicitando primero la pinza y asignándole el ID 6, luego el giro de muñeca (wrist_roll) como 5, hasta el giro de hombro (shoulder_pan) como 1. Hágalo antes del ensamblaje.

    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
    Calibrar ambos brazos

    Mueva cada articulación al centro de su rango, presione Enter y luego recorra cada una a través de su rango completo. El id se convierte en el nombre de archivo del perfil.

    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
    Teleoperar antes de grabar cualquier cosa

    La prueba de aceptación para todo lo anterior. Si la teleoperación es irregular, está espejada o una articulación no sigue, la grabación lo conserva en 50 episodios.

    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
Dónde se guarda la calibración y por qué el id es importante

Los perfiles van a $HF_LEROBOT_CALIBRATION, por defecto ~/.cache/huggingface/lerobot/calibration, y el id es la clave de búsqueda. Si le da a lerobot-record un id calibrado, le ofrecerá Enter para reutilizar el perfil o c para rehacerlo. Si le da un id desconocido, no habrá archivo, por lo que entrará en calibración a mitad de sesión.

Las cámaras deciden lo que ve la política

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
Ejecuta esto en cada sesión: la documentación advierte que estos identificadores pueden cambiar después de un reinicio o una reconexión, dependiendo del sistema operativo.

Dos vistas, y su ubicación importa: una cámara de escena fija que cubre el espacio de trabajo y una cámara de muñeca cerca del efector final mostrando lo que el efector final está a punto de tocar. La lista de verificación de conjuntos de datos de la comunidad LeRobot solicita preferiblemente dos vistas a 480x640 / 720p o mejor, un fondo estático, iluminación neutra y estable, y que el brazo líder y las extremidades humanas estén fuera del encuadre. La guía de grabación añade la regla general: deberías poder realizar la tarea tú mismo/a con solo mirar las imágenes de la cámara.

El índice de la cámara no es una identidad estable

Los índices de OpenCV provienen del orden de enumeración, por lo que un reinicio o una reconexión pueden hacer que los índices 0 y 2 intercambien lugares y coloquen la vista de la muñeca en la posición superior durante toda una sesión. lerobot lo dice explícitamente: su clase de cámara acepta una ruta de dispositivo además de un entero, y advierte que los índices son inestables entre reinicios o cambios de puerto, especialmente en Linux. Apunta index_or_path al enlace simbólico de udev bajo /dev/v4l/by-id/, que sigue al dispositivo en lugar del orden de enumeración. Esta es la forma más común en que un conjunto de datos termina siendo internamente inconsistente, y el entrenamiento no puede repararlo. Cámara no detectada.

El comando record y cada flag

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
El diccionario de la cámara es una cadena entrecomillada por el shell; las llaves anidadas no son sintaxis del shell.

Los valores predeterminados a continuación provienen de src/lerobot/configs/dataset.py en la rama principal, no de un tutorial. Varios no son lo que la gente asume.

FlagPredeterminadoQué hace
--dataset.repo_idemptynombre; la marca de tiempo se añade por defecto
--dataset.single_taskemptycadena de tarea almacenada con cada episodio
--dataset.root$HF_LEROBOT_HOME/repo_idruta de escritura, predeterminado ~/.cache/huggingface/lerobot/
--dataset.fps30tasa del bucle de control y tasa de fotogramas del conjunto de datos
--dataset.episode_time_s60segundos antes de que un episodio avance automáticamente
--dataset.reset_time_s60reinicio de escena; el brazo se mueve, no se almacena nada
--dataset.num_episodes50episodios grabados en esta sesión
--dataset.push_to_hubtruesubir al final de la sesión; false mantiene local
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablecodificar durante la captura; configúrelo explícitamente
--dataset.encoder_queue_maxsize30fotogramas almacenados en búfer por cámara, ~1 s a 30 fps
--dataset.encoder_threadsnull (codec decides)hilos por codificador; reducir si la captura se entrecorta
--dataset.no_stampfalsemantener repo_id exactamente como se escribió
--resumefalseañadir a un conjunto de datos existente; requiere --dataset.root
Dos flags que cuestan una hora por sorpresa

Su conjunto de datos no se llama como lo escribió. lerobot añade una etiqueta de fecha y hora, por lo que so100_pick_cube se convierte en so100_pick_cube_20260823_141530. Use --dataset.no_stamp=true para un nombre estable. Resume cuenta adiciones, no totales. Con --resume=true, --dataset.num_episodes cuenta episodios adicionales y --dataset.root se vuelve obligatorio. Pida 50 en un conjunto de datos de 30 episodios y obtendrá 80.

Control por teclado durante una sesión

  • Flecha derecha o n: finaliza el episodio o reinicia la fase antes de tiempo. Es la tecla que más usará, porque un agarre limpio rara vez necesita 25 segundos.
  • Flecha izquierda o r: descarta el episodio y lo rehace. Una mala toma no cuesta nada ahora y mucho después.
  • Escape o q: detiene la sesión, finaliza la codificación, sube.
  • Estos funcionan en X11, Wayland y SSH sin interfaz gráfica: sin un backend de teclado global, lerobot-record lee las mismas teclas desde la terminal de control. Las letras sobreviven a los enlaces SSH lentos, donde las secuencias de flechas se dividen.
  • La teleoperación por teclado es diferente y sí necesita un backend global: X11, Windows o macOS con Accesibilidad.

¿Cuántos episodios, y cómo es uno bueno?

La guía de grabación sugiere al menos 50 episodios para una primera tarea, aproximadamente 10 por ubicación de objeto. Las páginas de políticas enumeran un mínimo por modelo, por debajo del cual una ejecución no vale el tiempo de GPU.

PolíticaEpisodios mínimosFormato del conjunto de datosNivel de GPUCosto por ejecución
SmolVLA30LeRobot v3.0RTX 4090 o cualquier tarjeta de 24 GBabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 o cualquier tarjeta de 24 GBabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB o H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB o H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB o H100 80 GBabout 4 to 12 USD

La mejor pregunta es cuántos de qué. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) recopilaron más de 40.000 demostraciones y realizaron más de 15.000 ejecuciones en el mundo real. La generalización siguió una relación aproximadamente de ley de potencia con el número de entornos y objetos, y superado un umbral por entorno u objeto, las demostraciones adicionales tuvieron un efecto mínimo. En un banco: mover el objeto, cambiar la iluminación, intercambiar el cubo, en lugar de repetir una toma.

Teleoperación líder-seguidor como fuente de datos
Ventajas
  • Trayectorias de articulaciones continuas que un servo puede reproducir, a diferencia de un teclado o gamepad
  • La acción y el estado comparten una convención de coordenadas, por lo que la política aprende un objetivo que puede comandar directamente
  • Un episodio de 25 segundos más un reinicio de 10 segundos son aproximadamente 100 episodios por hora
  • El operador siente que el seguidor se detiene o se atasca, por lo que los fallos salen a la luz antes de que se registren los datos
Desventajas
  • Un segundo brazo duplica aproximadamente el costo de las piezas
  • Las demostraciones heredan los hábitos del operador; Mandlekar et al. encontraron que la calidad de la política depende en gran medida de la calidad de la demostración
  • El líder se muestrea a la velocidad del bucle, por lo que las pausas se convierten en filas casi idénticas que enseñan a la política a esperar
  • Nada garantiza la consistencia entre sesiones: una cámara movida 5 cm es un cambio de distribución oculto

Un buen episodio es aburrido: pose inicial repetible, una cosa hecha, terminado una vez que el objeto está en el contenedor, cadena de tarea de 25 a 50 caracteres como recomienda la lista de verificación. Recoge el cubo rojo y déjalo en la caja es una cadena de tarea; task1 es el antipatrón que la lista de verificación nombra explícitamente. Las anotaciones vagas encabezan su lista de problemas, y son las más importantes para , donde la cadena es una entrada del modelo, no un nombre de archivo.

Defectos que arruinan silenciosamente un conjunto de datos

Ninguno lanza una excepción. Todos sobreviven al entrenamiento, apareciendo como una curva de pérdida que parece correcta y un robot que no hace nada. Verifique mientras la escena está configurada.

DefectoCómo se veDe dónde vieneCómo detectarlo
Vistas de cámara intercambiadasimagen de la muñeca bajo la clave superiorreasignación de índice después de una reconexiónlerobot-find-cameras cada sesión; rutas por ID
Fotogramas congeladosla misma imagen durante docenas de filasla cámara deja de entregar; el bucle repite el último fotogramarevisarlo en lerobot-dataset-viz
Fotogramas perdidosrecuento de filas por debajo de fps por segundosla cola se desborda, descarta en lugar de bloquear'Encoder queue full' en el registro; filas vs fps por duración
Articulación en su límiteuna articulación plana en min o maxel rango del líder excede el del seguidor, o una mala pose intermediamin/max por articulación en ds.meta.stats; lerobot-find-joint-limits de antemano
Imagen y acción desincronizadasla política se anticipa o se retrasacámaras a un fps diferente al del buclemantener cada cámara a --dataset.fps
Tiempo muertolargas secuencias de filas de acción idénticasoperador pausó con la grabadora funcionandoproporción de filas de acción idénticas consecutivas
Cadena de tarea inutilizabletask1, demo2, testescribir rápidometa/tasks.parquet en v3.0 (era meta/tasks.jsonl en v2.1); arreglar con lerobot-edit-dataset modify_tasks
Los fotogramas descartados se ocultan

El codificador mantiene una cola limitada por cámara, 30 fotogramas por defecto. Cuando no puede seguir el ritmo, los fotogramas se descartan en lugar de bloquearse: la captura continúa y nada falla. Recibirá Encoder queue full for {camera}, dropped N frame(s) y un total por cámara al final del episodio. El umbral de lerobot: aproximadamente un 5 por ciento de pérdida significa un sistema sobrecargado, un 2 por ciento es la carga de inicio esperada. Soluciones en orden: --display_data=false, reducir --dataset.encoder_threads, vcodec=h264, streaming desactivado.

Una advertencia: la tabla de la guía de codificación de streaming lista el valor predeterminado como True, mientras que la dataclass en main lee streaming_encoding: bool = False. La documentación y el código no concuerdan, así que configúrelo explícitamente; lerobot registra una sugerencia recomendándolo cada vez que se inicia con la bandera desactivada.

Verifique el conjunto de datos antes de alquilar una GPU

La prueba de aceptación de la documentación: compare la duración del video con la duración del episodio reportada por la CLI, y confirme que el número de filas es igual a los fps por la duración. Por episodio, no en el 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 episodio cuya duración difiere mucho de los fps es candidato para ser eliminado, no para entrenamiento.

Luego, obsérvalo. lerobot-dataset-viz reproduce un episodio fotograma a fotograma con trazas de articulaciones junto a las vistas de la cámara, en Rerun o Foxglove. Cámaras intercambiadas y fotogramas congelados aparecen en diez segundos. La gente se salta este paso.

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 también realiza división, fusión, eliminación de características, modificación de tareas y recálculo de estadísticas. Elimina generosamente: un episodio malo cuesta un episodio; mantenerlo cuesta cada ejecución entrenada con él.
El directorio de conjuntos de datos de AY-Robots que lista los conjuntos de datos públicos de LeRobot con recuentos de episodios y formatos
Cómo se dimensionan y anotan los conjuntos de datos comparables.

v2.1 o v3.0: decide antes de grabar

v2.1 escribía un parquet y un MP4 por episodio. v3.0 concatena muchos episodios en fragmentos compartidos y reconstruye los límites a partir de los metadatos, por lo que info.json contiene plantillas de ruta como data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet en lugar de un número de episodio. La justificación principal es tener menos archivos y más grandes: inicialización más rápida y menos presión sobre el sistema de archivos a escala.

LeRobot v2.1LeRobot v3.0
Diseñoun parquet y un MP4 por episodiomuchos episodios por fragmento
Metadatos del episodioArchivos JSONLparquet fragmentado bajo meta/episodes/, a través de la pila de conjuntos de datos
Streaming desde el Hubnosí, a través de StreamingLeRobotDataset
Escrito por lerobot 0.6.1nosí, lo que obtienes hoy
Leído por GR00T N1.7 y N1.5no, debe ser convertido a una versión anterior
Grabando hoy, entrenando GR00T mañana

lerobot 0.6.1 escribe v3.0, pero GR00T N1.7 y N1.5 leen v2.0 o v2.1 y fallan con él. Observa la dirección del cambio: src/lerobot/scripts/ contiene convert_dataset_v21_to_v30.py y nada que vaya en la dirección opuesta. Resuelve esto antes de la sesión. Solución: conjunto de datos rechazado como 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
Rápido para 50 episodios. La escala es un trabajo diferente: la guía de portabilidad de lerobot, para DROID sin procesar a v3.0, presupuesta más de 7 días de procesamiento local y aproximadamente 400 GB.

Dos rutas al mismo conjunto de datos

Todo lo anterior, en tu propia máquina: tú te encargas de la enumeración USB, la compilación de ffmpeg, el ajuste del codificador y los archivos de calibración. La ruta correcta para entender el pipeline, ejecutar una configuración de cámara inusual o mantener los datos localmente.

Lo que cuesta esta ruta

Tiempo: una tarde por brazo para ensamblar, una primera calibración complicada y una primera sesión que desecharás porque una cámara estaba en la ranura equivocada.

Graba conjuntos de datos LeRobot sin cablear el pipeline tú mismo

El cliente de escritorio de AY-Robots registra episodios, transmisiones de cámara y estados de articulación en formato LeRobot desde una sesión de teleoperación, y luego entrega el conjunto de datos al entrenador.

Obtener el cliente de escritorio

Del conjunto de datos a la política

Cincuenta episodios limpios alimentan cada ejecutado aquí. se entrena desde cero solo en su tarea, con aproximadamente 80 millones de parámetros a unos 20 ms por paso de acción, siendo el único de los cinco que se siente cómodo con movimientos rápidos. tiene aproximadamente 450 millones de parámetros en una tarjeta de 24 GB. es un modelo fundacional de aproximadamente 3 mil millones de parámetros donde el toca unos 40 millones de parámetros, necesita una A100 o H100, y requiere ese conjunto de datos v2.1.

A continuación, la guía para su combinación: , o ; para una primera ejecución, es más corta. Cuando la política funciona en el banco de pruebas pero colapsa en el momento en que mueve la mesa, eso es un problema de datos: y profundizan en la diversidad.

¿Cuántos episodios necesito realmente para una primera política funcional?

Treinta para SmolVLA, cincuenta para ACT, Pi0.5, GR00T N1.5 y N1.7, los mínimos que exigen los entrenadores de AY-Robots. La guía de LeRobot recomienda de forma independiente al menos 50 para una primera tarea, alrededor de 10 por ubicación de objeto. El trabajo de escalado de datos encontró que la generalización escala con los entornos y objetos en lugar de con el número de demostraciones, por lo que cien tomas de una escena son peores que cincuenta en cinco ubicaciones.

¿Necesito un brazo líder, o puedo teleoperar con un teclado?

lerobot incluye teleoperadores de teclado y gamepad, por lo que un brazo líder no es estrictamente necesario, pero es muy preferible: el líder-seguidor proporciona trayectorias articulares continuas en la convención de coordenadas de la acción registrada, mientras que la entrada de teclado produce un movimiento escalonado que una política aprende como sacudida. La teleoperación por teclado también necesita un backend de teclas global, por lo que falla en Wayland y en entornos sin interfaz gráfica.

¿Puedo grabar en una Raspberry Pi o en un mini PC pequeño?

Sí, con ajustes. La guía de codificación de streaming tiene un apartado de bajos recursos que cubre máquinas modernas de 4 núcleos y la Raspberry Pi 5, y sitúa dos cámaras a 640x480 y 30 fps en su columna de 'requiere algunos ajustes'. Su consejo: evite que el codificador compita con el bucle de captura, mediante --dataset.rgb_encoder.vcodec=h264 y --dataset.streaming_encoding=false. Clasifica dos cámaras a 640x480 como aproximadamente 55 millones de píxeles por segundo y dos a 1920x1080 como aproximadamente 373 millones.

¿Cómo sé si el conjunto de datos que acabo de grabar está realmente sano?

Tres comprobaciones sencillas. Compare la duración del video de cada episodio con la duración informada por la CLI y confirme que el recuento de filas es igual a los fps multiplicados por esa duración, por episodio en lugar de en el total; esa es la prueba de aceptación que proporciona la guía de codificación de lerobot. Lea ds.meta.stats, donde una articulación cuyo mínimo es igual a su máximo nunca se movió. Luego, reproduzca dos o tres episodios en lerobot-dataset-viz, la única forma en que se muestran las vistas intercambiadas y los fotogramas congelados. En cuanto a los fotogramas perdidos, la guía establece el límite en aproximadamente un 5 por ciento de pérdida; alrededor del 2 por ciento es una carga transitoria normal, a menudo solo al inicio.

Mi trabajo de entrenamiento rechazó el conjunto de datos como v3.0. ¿Qué hago ahora?

GR00T N1.7 y N1.5 leen LeRobot v2.0 o v2.1 y fallan con v3.0, que es lo que graba lerobot 0.6.1. O bien establezca el formato antes del entrenamiento, o use una política que lea v3.0 de forma nativa: Pi0.5, SmolVLA o ACT. lerobot incluye un convertidor de v2.1 a v3.0 y nada en sentido inverso.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started