
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ística | tipo de dato | Forma | Descripción |
|---|---|---|---|
| action | float32 | [6] | objetivos de las articulaciones del brazo líder |
| observation.state | float32 | [6] | posiciones de las articulaciones alcanzadas por el seguidor |
| observation.images.top | video | [480, 640, 3] | cámara de escena, MP4 (av1 aquí) |
| observation.images.wrist | video | [480, 640, 3] | cámara de muñeca, misma tasa |
| timestamp | float32 | [1] | segundos desde el inicio del episodio |
| frame_index, episode_index, index, task_index | int64 | [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.
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.

Lo que necesitas en el banco de trabajo
| Elemento | Detalle | Nota |
|---|---|---|
| Brazo seguidor | SO-100, seis servos Feetech STS3215 | aproximadamente 110 a 150 EUR en piezas |
| Brazo líder | un segundo SO-100, engranajes retirados | engranajes retirados de los seis motores líderes: solo codificador, menos fricción |
| Alimentación | coincidente con la variante STS3215 de 7.4 V en la lista de materiales | ver la advertencia a continuación |
| Cámaras | dos cámaras USB, 640x480 a 30 fps | una vista de la escena, una en la muñeca |
| Anfitrión | Python 3.12 o posterior, ffmpeg | requires-python >= 3.12 |
| Cuenta de Hub | token de escritura de Hugging Face | optional with --dataset.push_to_hub=false |
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
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-infoLos 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.
- 1Encontrar 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.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2Escribir 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.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Calibrar 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
idse convierte en el nombre de archivo del perfil.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4Teleoperar 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.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
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
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.0Dos 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.
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
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=2Los 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.
| Flag | Predeterminado | Qué hace |
|---|---|---|
| --dataset.repo_id | empty | nombre; la marca de tiempo se añade por defecto |
| --dataset.single_task | empty | cadena de tarea almacenada con cada episodio |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | ruta de escritura, predeterminado ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | tasa del bucle de control y tasa de fotogramas del conjunto de datos |
| --dataset.episode_time_s | 60 | segundos antes de que un episodio avance automáticamente |
| --dataset.reset_time_s | 60 | reinicio de escena; el brazo se mueve, no se almacena nada |
| --dataset.num_episodes | 50 | episodios grabados en esta sesión |
| --dataset.push_to_hub | true | subir al final de la sesión; false mantiene local |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | codificar durante la captura; configúrelo explícitamente |
| --dataset.encoder_queue_maxsize | 30 | fotogramas almacenados en búfer por cámara, ~1 s a 30 fps |
| --dataset.encoder_threads | null (codec decides) | hilos por codificador; reducir si la captura se entrecorta |
| --dataset.no_stamp | false | mantener repo_id exactamente como se escribió |
| --resume | false | añadir a un conjunto de datos existente; requiere --dataset.root |
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ítica | Episodios mínimos | Formato del conjunto de datos | Nivel de GPU | Costo por ejecución |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 o cualquier tarjeta de 24 GB | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 o cualquier tarjeta de 24 GB | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB o H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB o H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB o H100 80 GB | about 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.
- 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
- 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.
| Defecto | Cómo se ve | De dónde viene | Cómo detectarlo |
|---|---|---|---|
| Vistas de cámara intercambiadas | imagen de la muñeca bajo la clave superior | reasignación de índice después de una reconexión | lerobot-find-cameras cada sesión; rutas por ID |
| Fotogramas congelados | la misma imagen durante docenas de filas | la cámara deja de entregar; el bucle repite el último fotograma | revisarlo en lerobot-dataset-viz |
| Fotogramas perdidos | recuento de filas por debajo de fps por segundos | la 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ímite | una articulación plana en min o max | el rango del líder excede el del seguidor, o una mala pose intermedia | min/max por articulación en ds.meta.stats; lerobot-find-joint-limits de antemano |
| Imagen y acción desincronizadas | la política se anticipa o se retrasa | cámaras a un fps diferente al del bucle | mantener cada cámara a --dataset.fps |
| Tiempo muerto | largas secuencias de filas de acción idénticas | operador pausó con la grabadora funcionando | proporción de filas de acción idénticas consecutivas |
| Cadena de tarea inutilizable | task1, demo2, test | escribir rápido | meta/tasks.parquet en v3.0 (era meta/tasks.jsonl en v2.1); arreglar con lerobot-edit-dataset modify_tasks |
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.
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"])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.
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 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.1 | LeRobot v3.0 | |
|---|---|---|
| Diseño | un parquet y un MP4 por episodio | muchos episodios por fragmento |
| Metadatos del episodio | Archivos JSONL | parquet fragmentado bajo meta/episodes/, a través de la pila de conjuntos de datos |
| Streaming desde el Hub | no | sí, a través de StreamingLeRobotDataset |
| Escrito por lerobot 0.6.1 | no | sí, lo que obtienes hoy |
| Leído por GR00T N1.7 y N1.5 | sí | no, debe ser convertido a una versión anterior |
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.
# 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=falseDos 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.
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.
El cliente de escritorio registra conjuntos de datos, episodios, transmisiones de cámara y estados de articulación en formato LeRobot, directamente desde una sesión de teleoperación. Ese conjunto de datos alimenta el formulario de entrenamiento: selecciona el modelo, el conjunto de datos y los hiperparámetros, y el backend alquila una GPU dimensionada por la VRAM del modelo, ejecuta el entrenador y escribe puntos de control en el almacenamiento de objetos.
- 1Instalar el cliente
En la página de descarga; configuración en la documentación del cliente.
- 2Grabar desde una sesión de teleoperación
Maneja el brazo; el cliente escribe episodios en formato LeRobot. Tutorial: graba tu primer conjunto de datos.
- 3O trae tus propios datos
Un conjunto de datos también puede provenir de un ID de repositorio de Hugging Face o de tu propia máquina: documentación de conjuntos de datos, directorio público.
- 4Entrenar y ejecutarlo de nuevo
Elige la combinación en la matriz de entrenamiento, luego ejecuta la política de nuevo en el brazo. Aproximadamente de 1 a 3 USD en el nivel de 24 GB, de 4 a 12 en el nivel A100 o H100.
No ensambla ni calibra tu brazo, y no repara un episodio defectuoso, por lo que el paso de inspección sigue siendo aplicable. También hay un límite estricto en el otro extremo: para tareas rápidas, la inferencia debe estar junto a los servos. El bucle de control se ejecuta de 20 a 485 ms por paso de acción, y los viajes de ida y vuelta por internet público, además, convierten una política funcional en una vacilante.
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 escritorioDel 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.
Sources
- LeRobot: Aprendizaje por imitación en robots del mundo real
- LeRobot: Ensamblaje, configuración del motor y calibración del SO-100
- LeRobot: Cámaras y lerobot-find-cameras
- LeRobot: Instalación y la matriz de extras
- LeRobotDataset v3.0: diseño y migración de v2.1
- LeRobot: Codificación de vídeo en streaming y fotogramas perdidos
- LeRobot: Portar grandes conjuntos de datos a v3.0 (DROID)
- lerobot v0.6.1 lanzamiento, 3 August 2026
- DatasetRecordConfig: los valores predeterminados de grabación reales
- lerobot_record.py: bucle de grabación y manejo de reanudación
- TheRobotStudio/SO-ARM100: repositorio de construcción y lista de materiales
- Hugging Face: Lista de verificación de conjuntos de datos de la comunidad LeRobot
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Leyes de escalado de datos en el aprendizaje por imitación
- Mandlekar et al. (2021), Lo que importa en el aprendizaje a partir de demostraciones humanas offline
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started