Contenido detallado
🎓 Aprender por demostración (imitación)
En el módulo 5.3 hiciste que el seguidor copiara al líder en tiempo real. Ahora la idea es dar un paso más: grabar estas demostraciones y entrenar una red neuronal que aprende la relación «lo que veo y dónde están mis articulaciones → cuál es el siguiente movimiento». Después de entrenarla, controla al seguidor sin que nadie esté en el líder. Esto se llama aprendizaje por imitación.
🌱 ¿Eres nuevo aquí?
Una política es el programa que decide la siguiente acción a partir de lo que observa el robot. Aquí es una red neuronal, no un código con if. Imitación quiere decir que la red aprende copiando ejemplos de una persona, en vez de descubrir por sí sola mediante prueba y error (eso sería aprendizaje por refuerzo, que casi siempre se hace en simulación; es un tema del 5.5).
Cómo leer: las flechas verdes muestran una vuelta del ciclo; el bloque brillante (entrenar) es el único que necesita GPU. La flecha cian es lo que marca la diferencia entre quienes lo logran y quienes abandonan: la evaluación indica en qué situación falla la política, y la corrección consiste en grabar más ejemplos exactamente de esa situación.
✓ Buena primera tarea
- ✓Tomar un cubo de espuma y ponerlo en una caja poco profunda.
- ✓Objeto liviano, colorido y que contraste con la mesa.
- ✓Es fácil juzgar el éxito: está o no está en la caja.
✗ Déjalo para después
- ✗Doblar tela, abrir una tapa de rosca, hacer un encaje ajustado.
- ✗Objeto transparente, brillante o más pesado de lo que la pinza puede soportar.
- ✗Varias tareas diferentes en el mismo dataset desde el principio.
Por qué aprender
Programar a mano un «agarrar y soltar» funciona hasta que el cubo se mueve 3 cm. La política aprendida observa la cámara en cada instante y corrige la trayectoria. Así es como los laboratorios entrenan brazos robóticos hoy, y el SO-101 con LeRobot pone este método a tu alcance.
Conceptos clave
⏺️ Grabar episodios con lerobot-record
Cada demostración grabada es un episodio. El comando lerobot-record conecta el líder, el seguidor y las cámaras, y en cada cuadro guarda tres cosas: las imágenes, la posición actual de las articulaciones del seguidor (el estado) y la posición que indicó el líder (la acción). Entre un episodio y otro hay un tiempo de reinicio para que puedas ordenar la mesa.
🌱 ¿Eres nuevo aquí?
Cuadro es un instante grabado (a 30 cuadros por segundo, uno cada 33 ms). Estado es dónde está el brazo; acción es adónde le indicaron que fuera. La red aprende a predecir la acción a partir de la imagen y el estado. Los 6 números de cada uno corresponden a las articulaciones del SO-101: base, hombro, codo, flexión y giro de la muñeca, pinza.
Cómo leer: cada columna es un cuadro. La fila de arriba muestra lo que vio la cámara (el cubo se acerca, lo agarran y aparece en la caja). Las filas de abajo son los números que la red aprenderá a relacionar: dada la imagen y el estado, predecir la acción. La instrucción de texto se aplica a todo el episodio.
Paso a paso de la primera grabación
Verifica los puertos, la calibración y la cámara
Usa los mismos puertos y los mismos id de calibración del 5.3. Ejecuta lerobot-find-cameras y anota el índice de la cámara frontal.
Fija la escena
Cámara fija (con cinta o soporte), luz constante y la caja siempre en el mismo lugar. Solo cambia la posición del cubo entre episodios.
Graba 2 episodios de prueba
Ejecuta el siguiente comando con num_episodes=2, sin subir nada a la nube. Si todo sale bien, borra la carpeta de prueba y graba los episodios definitivos (50 episodios es un buen comienzo).
Objetivo: grabar episodios de la tarea «poner el cubo en la caja» con una cámara frontal. Cambia los puertos, los id y tu usuario de Hugging Face (sin los signos < >).
# Grabar demostraciones con el par SO-101 (Linux; en Windows el puerto es COM3, COM4...)
HF_USER=<seu_usuario_hf> # reemplaza con tu usuario de Hugging Face
DATASET=cubo-na-caixa-teste # nombre del dataset
lerobot-record \
--robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
--robot.cameras="{ frente: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=lider \
--dataset.repo_id=${HF_USER}/${DATASET} \
--dataset.single_task="Pon el cubo rojo en la caja gris." \
--dataset.num_episodes=2 \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=10 \
--dataset.push_to_hub=false \
--display_data=true
Cómo verificar
- ✓Se abre una ventana con la imagen de la cámara y gráficos de las articulaciones que cambian cuando mueves el líder.
- ✓La terminal anuncia el inicio de cada episodio y del reinicio; al final aparece la carpeta en ~/.cache/huggingface/lerobot/.
- ✗¿Error de puerto o de calibración? Vuelve al 5.3. Los nombres de las flags cambian entre versiones: verifícalos con lerobot-record --help y en la documentación actual.
✓ Buena demostración
- ✓Movimiento tranquilo y siempre de la misma manera.
- ✓Cubo en distintas posiciones, cubriendo toda el área.
- ✓Empieza y termina con el brazo en reposo.
✗ Arruina el dataset
- ✗Dudar, retroceder, intentarlo de dos maneras diferentes.
- ✗Tu mano o tu brazo aparecen frente a la cámara.
- ✗Mover la cámara o cambiar la luz durante la grabación.
Por qué aprender
La política nunca será mejor que las demostraciones. Quien graba con calma y constancia entrena una vez; quien graba apurado entrena cinco veces y no entiende por qué no funciona.
Conceptos clave
🗂️ Dataset en Hugging Face Hub
LeRobot guarda cada dataset en una carpeta con un formato estándar: tablas con el estado y la acción, videos de las cámaras y un archivo de metadatos. Este mismo formato se puede subir a Hugging Face Hubdonde entrenas en una máquina con GPU (o en Colab) sin copiar archivos manualmente, y donde otras personas pueden usar tus datos, si quieres.
🌱 ¿Eres nuevo aquí?
O Hugging Face Hub es un sitio gratuito que guarda modelos y datasets, parecido a un GitHub para IA. El repo_id es la dirección del dataset: usuario/nombre. Para subirlo, creas una cuenta, generas un token de escritura en la configuración e inicias sesión una vez en la terminal.
Cómo leer: el nombre de arriba es el repo_id. Las tablas (centro) son ligeras; los videos (derecha, en cian) ocupan casi todo el espacio. Si el dataset quedó demasiado pesado, reduce la resolución o el número de cámaras, no el número de episodios.
Objetivo: iniciar sesión, revisar un episodio grabado y subir el dataset al Hub como privado. Ejecútalo en el mismo entorno Python donde instalaste LeRobot.
hf auth login # pega el token de escritura (una vez por máquina)
lerobot-dataset-viz --repo-id <seu_usuario_hf>/<dataset> --episode-index 0
# Abre el dataset local, muestra el tamaño y lo sube al Hub como privado.
import sys
from lerobot.datasets.lerobot_dataset import LeRobotDataset
repo_id = sys.argv[1] # ej.: <tu_usuario_hf>/<dataset>
ds = LeRobotDataset(repo_id) # lee de ~/.cache/huggingface/lerobot/
print("episodios:", ds.num_episodes, "| quadros:", ds.num_frames, "| fps:", ds.fps)
print("colunas:", list(ds.features))
ds.push_to_hub(private=True) # privado: solo tú puedes verlo
print("enviado: https://huggingface.co/datasets/" + repo_id)
Cómo verificar
- ✓El visualizador muestra el video del episodio 0 con las curvas de las 6 articulaciones sincronizadas.
- ✓python subir_dataset.py <tu_usuario_hf>/<dataset> imprime el número de episodios (lo que grabaste) y las columnas, incluidos estado, acción y la cámara "frente".
- ✓La página del dataset se abre en el navegador con sesión iniciada y aparece como privada.
💡 Privacidad
La cámara graba lo que haya al fondo: rostros, la casa, papeles sobre la mesa. En la escuela, deja el dataset privado y encuadra solo la mesa de trabajo. Hazlo público únicamente después de revisar cada episodio.
Por qué aprender
Separar "dónde grabas" de "dónde entrenas" resuelve el problema de quienes no tienen GPU en casa: graban en la laptop junto al brazo y entrenan en Colab o en el laboratorio. Además, un dataset bien documentado se convierte en material de clase para todo el grupo.
Conceptos clave
🏋️ Entrenar ACT con lerobot-train
A ACT (Action Chunking with Transformers) es la política recomendada para empezar: es pequeña, se entrena rápido y funciona bien con 50 episodios de una tarea. Su truco está en el nombre: en vez de predecir un movimiento a la vez, predice un fragmento (chunk) de varios movimientos seguidos, lo que hace que el brazo se mueva con más suavidad y menos vacilación.
Cómo leer: a la izquierda está todo lo que la red ve en un instante. A la derecha, las barras representan movimientos futuros: los segmentos sólidos se ejecutan; los contornos se descartan porque, para entonces, la cámara ya tendrá información nueva. La flecha cian cierra el ciclo, como en el ciclo percibir-pensar-actuar del 1.1.
🌱 ¿Eres nuevo aquí?
Entrenar es ajustar millones de números de la red hasta que se equivoque poco al predecir las acciones grabadas. Cada ajuste usa un lote de cuadros (batch) y cuenta como un paso (step). De vez en cuando, el entrenamiento guarda un checkpoint: una copia de la red en ese punto, que puedes probar o retomar.
Objetivo: entrenar una ACT con tu dataset en una máquina con GPU NVIDIA. En una Mac con chip Apple, cambia cuda por mps; sin GPU, usa Colab (hay un cuaderno listo en la documentación de LeRobot).
# Entrenar la política ACT (consulta las opciones con: lerobot-train --help)
HF_USER=<seu_usuario_hf>
DATASET=<dataset>
lerobot-train \
--dataset.repo_id=${HF_USER}/${DATASET} \
--policy.type=act \
--policy.device=cuda \
--output_dir=outputs/train/act-${DATASET} \
--job_name=act-${DATASET} \
--batch_size=8 \
--steps=20000 \
--wandb.enable=false \
--policy.push_to_hub=false
Cómo verificar
- ✓La terminal muestra líneas con el paso actual y la loss (el error), que debería bajar rápido al principio y luego más despacio.
- ✓Aparecen carpetas en outputs/train/…/checkpoints/; la más reciente queda en last/pretrained_model.
- ✗¿Aparece "CUDA out of memory"? Reduce --batch_size (4 o 2). El tiempo puede ir de unos minutos a muchas horas, según la GPU y el número de pasos.
💡 Una loss baja no significa que tuvo éxito
La loss mide cuánto copia la red las demostraciones grabadas, no cuánto logra la tarea en el mundo real. Una red puede memorizar los 50 episodios y fallar cuando el cubo aparece en un lugar nuevo. El único número que cuenta es la tasa de éxito con el brazo, que medirás en el siguiente tema.
Por qué aprender
Saber interpretar el entrenamiento evita desperdiciar tiempo de GPU: aprendes a detenerlo cuando la loss se estabiliza, a probar checkpoints intermedios y a distinguir entre "faltan datos" y "falta entrenamiento".
Conceptos clave
🧪 Evaluar la política en el brazo real
Evaluar consiste en dejar que la política controle el seguidor, sin el líder, y contar cuántas veces acierta. En la versión actual de LeRobot esto se hace con lerobot-rollout; las versiones anteriores usaban el propio lerobot-record con la política indicada. Comprueba cuál corresponde a tu instalación con --help.
Seguridad antes de la primera prueba
Una política recién entrenada puede hacer movimientos bruscos e inesperados. Los servos del SO-101 son pequeños, pero pueden atrapar un dedo y derribar objetos. Mantén una mano en el interruptor de la fuente del seguidor, despeja la mesa, asegúrate de que nadie esté al alcance del brazo y haz una primera prueba corta.
Objetivo: ejecutar la política entrenada durante 30 segundos en el seguidor, con la misma cámara y la misma instrucción de la grabación.
# Ejecutar la política en el brazo real (consulta las opciones con: lerobot-rollout --help)
POLITICA=outputs/train/act-<dataset>/checkpoints/last/pretrained_model
lerobot-rollout \
--strategy.type=base \
--policy.path=${POLITICA} \
--robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
--robot.cameras="{ frente: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--task="Pon el cubo rojo en la caja gris." \
--duration=30
Cómo verificar
- ✓El seguidor se mueve solo hacia el cubo; el líder puede estar apagado.
- ✓Después de 30 segundos, el comando termina y el brazo se detiene.
- ✗¿El brazo tiembla o se dirige siempre a una esquina? ¿La cámara cambió de lugar desde la grabación o el nombre de la cámara no coincide con el del dataset ("frente")?
Hoja de evaluación (20 intentos)
| Posición del cubo | Intentos | Aciertos | Cómo falló |
|---|---|---|---|
| Cerca del centro (según la grabación) | 10 | anota | falló al agarrar, lo soltó fuera… |
| En los bordes del área grabada | 5 | anota | anota |
| Fuera del área grabada | 5 | anota | anota |
✓ Evaluación honesta
- ✓Define "éxito" antes de empezar y no lo cambies después.
- ✓Sortea las posiciones del cubo; no elijas las fáciles.
- ✓Graba un video y anota el tipo de falla de cada error.
✗ Te engañas
- ✗Contar solo los intentos que grabaste.
- ✗Empujar el cubo "solo un poquito" para ayudar.
- ✗Sacar conclusiones con 3 intentos.
Cuando aparezca el patrón de falla (por ejemplo, "siempre falla cuando el cubo está a la izquierda"), graba 10 a 20 episodios nuevos en esa zona y vuelve a entrenar. LeRobot también tiene un modo en el que tomas el control con el líder cuando la política falla y esa corrección se convierte en un episodio nuevo (--strategy.type=dagger); es la forma más eficiente de mejorar después de la primera versión.
Por qué aprender
Sin una evaluación numérica, todo proyecto de IA "casi funciona". Con la hoja sabes exactamente dónde estás, comparas versiones y tienes algo concreto para mostrar en la presentación del proyecto final.
Conceptos clave
🗣️ SmolVLA y pi0: políticas con lenguaje
ACT aprende una tarea e ignora el texto. Un VLA (modelo Visión-Lenguaje-Acción, presentado en el 5.1) también recibe la instrucción escrita y puede realizar tareas diferentes según lo que le pidas: "pon el cubo en la caja" o "pon la pelota en la caja". Estos modelos ya vienen preentrenados en muchos robots; tú solo haces el ajuste fino con tus episodios.
Cómo leer: la diferencia entre un VLA y ACT es la caja cian. Con el texto, el mismo modelo elige qué objeto agarrar. El texto no se convierte en código ni en una lista de pasos: condiciona directamente los movimientos de las articulaciones.
| Política | Entiende texto | Peso para entrenar | Cuándo usarlo |
|---|---|---|---|
| ACT | no | ligero | una tarea, primer proyecto |
| SmolVLA | sí | medio (GPU con buena memoria) | varias tareas con el mismo brazo |
| pi0 / pi0.5 | sí | pesado (GPU grande o nube) | investigación, tareas variadas |
Objetivo: ajustar SmolVLA a partir del modelo base lerobot/smolvla_base usando tu dataset. Primero graba episodios con instrucciones diferentes (por ejemplo, la mitad "cubo" y la otra mitad "pelota").
# Instalar el extra de SmolVLA en el mismo entorno de LeRobot
pip install "lerobot[smolvla]"
# Ajuste fino a partir del modelo base (consulta las flags en la documentación actual)
lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=<seu_usuario_hf>/<dataset> \
--policy.device=cuda \
--output_dir=outputs/train/smolvla-<dataset> \
--batch_size=16 \
--steps=20000 \
--wandb.enable=false \
--policy.push_to_hub=false
Cómo verificar
- ✓Al inicio, el entrenamiento descarga los pesos del modelo base del Hub (solo la primera vez) y después muestra cómo baja la loss, como en ACT.
- ✓En la evaluación, cambia solo el texto de --task y observa si el brazo cambia de objeto.
- ✗¿Te falta memoria en la GPU? Reduce el batch o entrena en Colab. La familia pi0 / pi0.5 requiere aún más; empieza con ACT o SmolVLA.
💡 Consulta también: datos de simulación
El proyecto INEMA robotica-real2sim genera episodios en una simulación y los exporta en el formato de LeRobot (en la prueba: 50 episodios con cámaras, 4.361 cuadros, 9,7 MB). Combinar unos pocos episodios reales con muchos simulados es el tema del próximo módulo.
Por qué aprender
El proyecto final (5.6) necesita un brazo que obedezca diferentes pedidos. Con ACT entrenas una política por tarea y el modelo de lenguaje elige cuál ejecutar; con un VLA, una sola política recibe el pedido en texto. Conocer ambos métodos te permite elegir según el hardware que tienes.
Conceptos clave
✅ Resumen del módulo
Para profundizar
- Documentación de LeRobot — comandos y flags de la versión actual
- Modelo base de SmolVLA — punto de partida para el ajuste fino
- LeRobot en GitHub — código, ejemplos y debates
- robotica-real2sim (INEMA) — guía paso a paso para quienes tienen un SO-101 y datos simulados
Siguiente módulo
5.5 · Simular antes de pasar a lo real: el gemelo del SO-101 en MuJoCo, real2sim y la brecha entre lo simulado y lo real.