Recolección de Datos

El SO-101 es uno de los brazos de recolección de datos más comunes en la comunidad de LeRobot. Esta guía cubre todo, desde conexiones de hardware hasta grabación de episodios y envío de tu conjunto de datos a HuggingFace.

Antes de Grabar

Configuración de hardware para grabación

La configuración de recolección de datos de SO-101 es más simple que la de los brazos CAN-bus: todo funciona a través de USB. Aquí está lo que debes conectar.

📷

Cámara de espacio de trabajo

Webcam USB apuntando al espacio de trabajo desde arriba o desde un lado. Montar en una posición fija — no moverla entre episodios. Verificar: ls /dev/video*

🔒

Cámara de muñeca (opcional)

Pequeña cámara USB montada en el efector final. Añade vista en primera persona. Se requiere un segundo puerto USB. LeRobot soporta sincronización de múltiples cámaras.

🔌

Brazo seguidor (USB serie)

El brazo que ejecuta acciones. Conectar a través de un controlador de servo USB. Verificar puerto con ls /dev/ttyUSB*

👤

Brazo líder (USB serie)

Un segundo SO-101 en modo de cumplimiento — muévelo con tu mano para guiar al seguidor. Conectar en un segundo puerto USB. Ofrece demostraciones de la más alta calidad.

Sin ROS, sin controladores de kernel: A diferencia de las configuraciones CAN-bus, la pila de recolección de datos SO-101 funciona completamente sobre USB serie. Puedes grabar en un MacBook o laptop con Windows — no se requiere Ubuntu.

Flujo de Trabajo de Grabación

Flujo de trabajo de grabación paso a paso

1

Verificar que la calibración esté actual

Ejecutar calibración antes de cada nueva sesión si el brazo fue desensamblado o movido. Ver Software → Calibración.

python -m lerobot.scripts.control_robot \
  --robot.type=so101 --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate
2

Verifique las transmisiones de las cámaras

python -c "
import cv2
for i in range(4):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f'Camera {i}: OK')
    cap.release()
"
3

Mover el brazo a la posición de inicio

Colocar el brazo seguidor en la posición de inicio (totalmente extendido, efector final apuntando hacia adelante). Reiniciar el brazo líder a la misma posición antes de comenzar la teleoperación.

4

Configure la escena de la tarea

Colocar los objetos en sus posiciones iniciales consistentes. Marcar la mesa si es necesario — las condiciones iniciales consistentes son críticas para la generalización de políticas.

5

Inicia la grabación de LeRobot

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB1 \
  --robot.leader_arms.main.type=so101 \
  --robot.leader_arms.main.port=/dev/ttyUSB0 \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=your-username/so101-pick-place-v1 \
  --control.num_episodes=50 \
  --control.single_task="Pick the red block and place it in the bin" \
  --control.warmup_time_s=3 \
  --control.reset_time_s=8

LeRobot solicita antes de cada episodio. Durante el calentamiento puedes ajustar tu agarre en el brazo líder antes de que comience la grabación.

6

Revise y reproduzca episodios

python -m lerobot.scripts.visualize_dataset \
  --repo_id=your-username/so101-pick-place-v1 \
  --episode_index=0

Eliminar episodios de mala calidad inmediatamente. Verificar si hay cuadros de cámara perdidos, velocidades de articulación erráticas o ejecución incompleta de tareas.

7

Empuje al HuggingFace Hub

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/so101-pick-place-v1
Formato del conjunto de datos

Formato de conjunto de datos SO-101

El SO-101 utiliza el formato estándar de conjunto de datos de LeRobot / HuggingFace — esquema idéntico al de OpenArm, Koch y otros brazos de LeRobot. Esto significa que tus conjuntos de datos son directamente compatibles con todo el ecosistema de entrenamiento de LeRobot.

Esquema de datos del episodio

Campos en cada archivo Parquet de episodio
observación.estado float32[6] Posiciones de las juntas en grados (6 DOF — 5 juntas + pinza)
observation.images.* ruta de video Referencia al marco en el archivo de video MP4 por cámara
acción float32[6] Posiciones de las juntas objetivo del brazo líder
marca de tiempo float64 Marca de tiempo Unix en segundos
índice_de_frame int64 Número de fotograma dentro del episodio
índice_de_episodio int64 Número de episodio dentro del conjunto de datos
next.done bool Verdadero en el último marco de cada episodio
índice_tarea int64 Índice en la tabla de búsqueda de descripciones de tareas

Notas específicas del SO-101

El espacio de acción del SO-101 utiliza posiciones de las juntas en grados (unidades de servo Feetech), no en radianes. Al mezclar conjuntos de datos de SO-101 y OpenArm para entrenamiento multiplataforma, normaliza ambos a radianes primero utilizando las estadísticas en meta/stats.json.

Aseguramiento de Calidad

Lista de verificación de calidad para los datos recopilados

Revisa esto después de cada sesión de grabación antes de subirlo al Hub.

  • 1
    Las longitudes de los episodios son consistentes Los episodios de longitud atípica generalmente significan que el operador pausó, la pinza resbaló o la grabación fue interrumpida. Mantente dentro del ±30% de la longitud mediana.
  • 2
    Sin picos de velocidad del servo Los servos STS3215 tienen un ancho de banda limitado — picos de velocidad repentinos en observation.state indican una caída en el bus serie. Elimina esos episodios.
  • 3
    Los fotogramas de la cámara están alineados con los datos de las juntas Verifica que las marcas de tiempo de la cámara y las marcas de tiempo de las juntas estén dentro de 20 ms entre sí. La latencia del USB serie puede causar deriva en grabaciones largas. Re-sincroniza las cámaras cada 100 episodios.
  • 4
    El seguimiento del brazo líder fue suave Si el seguidor se retrasó notablemente durante la grabación (debido a la latencia del USB serie), las etiquetas de acción estarán desfasadas en el tiempo respecto a las observaciones. Reproduce para verificar.
  • 5
    La escena de la tarea fue consistente al inicio de cada episodio Objetos en la misma posición y orientación. La menor repetibilidad del SO-101 (en comparación con los brazos CAN) hace que esto sea especialmente importante — la variación en las condiciones iniciales perjudica el entrenamiento de políticas.
  • 6
    La apertura/cierre de la pinza está claramente registrada El estado de la pinza del SO-101 es la junta 6. Verifica que los eventos de agarre muestren una clara transición de posición de la junta (abierto → cerrado) en los datos, no una deriva gradual.
Siguiente Paso

Entrenando una Política a partir de tu Conjunto de Datos

Una vez que tu conjunto de datos pase las verificaciones de calidad, entrena ACT o Diffusion Policy con LeRobot.

Entrenar ACT

python -m lerobot.scripts.train \
  --policy.type=act \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --policy.chunk_size=100 \
  --training.num_epochs=5000 \
  --output_dir=outputs/act-so101-pick-place

Entrenar Política de Difusión

python -m lerobot.scripts.train \
  --policy.type=diffusion \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --training.num_epochs=8000 \
  --output_dir=outputs/diffusion-so101-pick-place

Conjuntos de datos comunitarios: El SO-101 tiene una de las colecciones de conjuntos de datos comunitarios más grandes en el ecosistema LeRobot. Antes de recopilar tus propios datos, verifica HuggingFace Hub para conjuntos de datos existentes de SO-101 — es posible que puedas ajustar finamente a partir de un conjunto de datos base existente y ahorrar tiempo de grabación.

¿Conjunto de datos listo? Comienza el entrenamiento.

Envía tu conjunto de datos a HuggingFace y entrena ACT o Diffusion Policy.