LeRobot documentation

Recopilación de datos con intervención humana

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Recopilación de datos con intervención humana

La recopilación de datos con intervención humana (HIL) permite mejorar una política entrenada desplegándola en un robot real mientras un operador humano la supervisa e interviene cuando es necesario. Los datos de intervención (movimientos de recuperación y correcciones) se registran junto con los segmentos autónomos, lo que genera un conjunto de datos de entrenamiento más rico que enseña a la política cómo manejar los fallos.


¿Por qué Human-In-the-Loop?

El clonado de comportamiento estándar entrena políticas únicamente con demostraciones exitosas. Durante la implementación, pequeños errores pueden acumularse y llevar al robot a estados que nunca se observaron durante el entrenamiento (cambio de distribución). La recopilación de datos HIL aborda esto mediante:

  • Ejecutar la política entrenada en el robot real
  • Que un humano intervenga cuando el robot está a punto de fallar
  • Registrar la recuperación y corrección del humano como datos de entrenamiento
  • Ajuste fino de la política en el conjunto de datos combinado

Esto genera una política que no solo sabe cómo realizar la tarea, sino también cómo recuperarse cuando algo sale mal.


Cómo funciona

Durante una sesión de HIL, el operador humano sigue este bucle dentro de cada episodio:

  1. Ver la ejecución autónoma de la política
  2. Pausa cuando el fallo es inminente, el robot mantiene su posición
  3. Tomar el control y teleoperar el robot para devolverlo a un buen estado (recuperación), y luego corregir el comportamiento
  4. Devolver el control a la política, la política reanuda la ejecución autónoma
  5. Repite los pasos 2–4 tantas veces como sea necesario durante el episodio
  6. Termina el episodio cuando la tarea esté completa, guarda y pasa al siguiente rollout

Por defecto, solo se registran los segmentos controlados por el humano (recuperación y corrección), y cada corrección se convierte en su propio episodio. Con --strategy.record_autonomous=true, también se registran los segmentos autónomos: la política y el humano pueden alternar el control varias veces, y la ejecución autónoma, la recuperación y la corrección se capturan en una única trayectoria continua. En ambos modos, el robot continúa desde su estado actual después de cada transferencia de control (no se requiere un reinicio solo porque haya ocurrido una intervención). Después de la recopilación, el conjunto de datos combinado (demostraciones originales + datos HIL) se utiliza para ajustar la política.

Este proceso se puede repetir de forma iterativa: desplegar, recopilar, ajustar finamente, repetir. Cada ronda se centra en los modos de fallo de la política actual.

┌─────────────────────────────────────────────────────────────────────────┐
│  Policy v0 (trained on demos)                                           │
│       ↓                                                                 │
│  HIL Collection (target current failure modes) → Fine-tune → Policy v1  │
│       ↓                                                                 │
│  HIL Collection (target new failure modes) → Fine-tune → Policy v2      │
│       ↓                                                                 │
│  ... (repeat until satisfactory performance)                            │
└─────────────────────────────────────────────────────────────────────────┘

Requisitos de hardware

Requisitos del teleoperador

El modo lerobot-rollout --strategy.type=dagger requiere teleoperadores con motores activos que puedan:

  • Activar/desactivar el torque programáticamente
  • Mover a las posiciones objetivo (para reflejar el estado del robot al pausar)

Cuando se pausa, el brazo líder se mueve para coincidir con el robot, de modo que el control pasa entre la política y el humano sin saltos. Los saltos terminarían en las correcciones grabadas y enseñarían a la política trayectorias bruscas.

Teleoperadores compatibles:

  • bi_openarm_mini - OpenArm Mini bimanual
  • so100_leader / so101_leader - Brazo líder SO100 / SO101
  • bi_so_leader - Brazos líderes bimanuales SO100 / SO101

Los comandos proporcionados usan bi_openarm_follower + bi_openarm_mini por defecto. Las configuraciones de SO100 / SO101 funcionan de la misma manera, por ejemplo, --robot.type=so101_follower con --teleop.type=so101_leader.


Script

Use lerobot-rollout con --strategy.type=dagger para la recopilación de datos HIL. Seleccione el backend de inferencia con --inference.type=sync|rtc|remote:

ModoFlagModelos
Estándar (predeterminado)(no se necesita ninguna bandera)ACT, Diffusion Policy
Segmentación en tiempo real (RTC)--inference.type=rtcPi0, Pi0.5, SmolVLA
Remoto--inference.type=remoteCheckpoint servido por lerobot-policy-server; consulte requisitos de despliegue remoto

Guía paso a paso

Paso 1: Pre-entrenar una política base

Primero, entrena una política en tu conjunto de datos de demostración. Este ejemplo entrena ACT, que se ejecuta con inferencia estándar en el paso 2:

lerobot-train \
    --dataset.repo_id=${HF_USER}/demo-dataset \
    --policy.type=act \
    --policy.repo_id=${HF_USER}/act_pretrain \
    --output_dir=outputs/pretrain \
    --batch_size=32 \
    --steps=50000

Paso 2: Recopilar datos de HIL

Inferencia estándar (ACT, Diffusion Policy):

lerobot-rollout --strategy.type=dagger \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can1 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can0 \
    --robot.right_arm_config.side=right \
    --robot.cameras='{left_wrist: {type: opencv, index_or_path: "/dev/video0", width: 1280, height: 720, fps: 30}, right_wrist: {type: opencv, index_or_path: "/dev/video4", width: 1280, height: 720, fps: 30}, base: {type: opencv, index_or_path: "/dev/video2", width: 640, height: 480, fps: 30}}' \
    --teleop.type=bi_openarm_mini \
    --teleop.left_arm_config.port=/dev/ttyACM0 \
    --teleop.right_arm_config.port=/dev/ttyACM1 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --dataset.repo_id=${HF_USER}/rollout_hil_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=2

Con --interpolation_multiplier=N, el robot recibe N comandos interpolados por acción de la política (el control se ejecuta a fps × N Hz), mientras que la inferencia de la política y la grabación del conjunto de datos se mantienen en --fps, de modo que el conjunto de datos grabado coincide con su FPS declarado.

Con RTC para modelos grandes (Pi0, Pi0.5, SmolVLA):

Para modelos con alta latencia de inferencia, active RTC para una ejecución fluida. Esto requiere una política base VLA como Pi0, Pi0.5 o SmolVLA en lugar de la política ACT de la etapa 1:

lerobot-rollout --strategy.type=dagger \
    --inference.type=rtc \
    --inference.rtc.execution_horizon=20 \
    --inference.rtc.max_guidance_weight=5.0 \
    --inference.rtc.prefix_attention_schedule=LINEAR \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can1 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can0 \
    --robot.right_arm_config.side=right \
    --robot.cameras='{left_wrist: {type: opencv, index_or_path: "/dev/video0", width: 1280, height: 720, fps: 30}, right_wrist: {type: opencv, index_or_path: "/dev/video4", width: 1280, height: 720, fps: 30}, base: {type: opencv, index_or_path: "/dev/video2", width: 640, height: 480, fps: 30}}' \
    --teleop.type=bi_openarm_mini \
    --teleop.left_arm_config.port=/dev/ttyACM0 \
    --teleop.right_arm_config.port=/dev/ttyACM1 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --dataset.repo_id=${HF_USER}/rollout_hil_rtc_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=3

Controles:

ClaveAcción
SpacePausar la política / reanudar la política
TabIniciar / detener una corrección (solo mientras está en pausa); las correcciones se registran
EnterSubir el conjunto de datos al Hub (modo solo correcciones)
ESCDetener la sesión

Se puede usar un pedal de pie USB en lugar del teclado con --strategy.input_device=pedal. Consulte Policy Deployment para ver todas las banderas de DAgger.

El protocolo HIL:

  1. Observa la ejecución autónoma de la política (teleop está inactivo/libre)
  2. Cuando veas un fallo inminente, pulsa Space para pausar
    • Detención de la política
    • El teleoperador se mueve para igualar la posición del robot (par activado)
    • No se registraron fotogramas durante la pausa
  3. Pulsa Tab para tomar el control
    • Par del teleoperador desactivado, libre de movimiento
    • Recuperación: Teleopere el robot para devolverlo a un buen estado
    • Corrección: Corregir el comportamiento
    • Todos los movimientos se registran
  4. Pulsa Tab de nuevo para finalizar la corrección y luego Space para devolver el control a la política
    • La política reanuda la ejecución autónoma desde el estado actual
    • Puedes intervenir de nuevo en cualquier momento (repite los pasos 2–4)
  5. En el modo predeterminado, cada corrección se guarda como su propio episodio. Con --strategy.record_autonomous=true, todo se registra y se divide en episodios automáticamente.
  6. Pulsa ESC para detener la sesión

Configuración del pedal de pie (Linux):

Si se utiliza un pedal de pie USB (PCsensor FootSwitch), asegúrese de tener acceso:

sudo setfacl -m u:$USER:rw /dev/input/by-id/usb-PCsensor_FootSwitch-event-kbd

Paso 3: Fusionar los conjuntos de datos

lerobot-rollout añade una marca de tiempo al nombre del conjunto de datos, por lo que el conjunto de datos HIL del paso 2 se guarda como your-username/rollout_hil_dataset_YYYYMMDD_HHMMSS. Utilice ese nombre completo a continuación.

El conjunto de datos HIL tiene una columna adicional intervention que marca los fotogramas controlados por humanos, y los conjuntos de datos solo pueden combinarse si tienen las mismas características. Elimina la columna primero y luego combina los datos de HIL con tus demostraciones:

lerobot-edit-dataset \
    --repo_id ${HF_USER}/rollout_hil_dataset_YYYYMMDD_HHMMSS \
    --new_repo_id ${HF_USER}/hil_dataset_no_intervention \
    --operation.type remove_feature \
    --operation.feature_names "['intervention']"

lerobot-edit-dataset \
    --new_repo_id ${HF_USER}/demo_plus_hil \
    --operation.type merge \
    --operation.repo_ids "['${HF_USER}/demo-dataset', '${HF_USER}/hil_dataset_no_intervention']"

Ambos conjuntos de datos también deben utilizar el mismo robot, cámaras y fps. Consulte Using Dataset Tools para más opciones de fusión.

Paso 4: Ajuste fino de la Policy

Ajusta finamente la política del paso 1 en el conjunto de datos fusionado:

lerobot-train \
    --dataset.repo_id=${HF_USER}/demo_plus_hil \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --policy.repo_id=${HF_USER}/act_hil_finetune \
    --output_dir=outputs/hil_finetune \
    --steps=20000

Luego, despliega la política ajustada y repite desde el Paso 2 para abordar sus modos de fallo restantes.


Consejos para una recopilación efectiva de HIL

Cuándo intervenir

Interviene cuando vea:

  • Robot a punto de cometer un error irreversible
  • Robot dudando o mostrando un comportamiento incierto
  • Robot desviándose de la trayectoria esperada

Recuperación: Teleoperar de vuelta a un buen estado

Durante la recuperación, teleopere el robot hasta un estado en el que:

  • El robot se encuentra en una configuración familiar, dentro de la distribución
  • La subtarea actual aún puede completarse
  • La trayectoria de recuperación en sí misma es un dato de entrenamiento informativo

Calidad de las correcciones

Durante la corrección:

  • Proporcionar trayectorias confiables y limpias
  • Completa por completo la subtarea actual
  • No sobrecompense ni añada movimientos innecesarios

Trabajo relacionado

Este enfoque de recopilación de datos HIL se basa en ideas del aprendizaje por imitación interactivo:

  • DAgger (Ross et al., 2011) introdujo la idea central: en lugar de entrenar únicamente con demostraciones de expertos, consultar al experto para obtener correcciones en los estados que visita el learner. Esto rompe el ciclo de error compuesto del clonado de comportamiento estándar al recopilar datos on-policy de forma iterativa.

  • HG-DAgger (Kelly et al., 2019) hizo esto práctico para la robótica: un experto humano supervisa al robot y solo interviene cuando es necesario, en lugar de etiquetar cada estado. La transición entre el control autónomo y el control humano es exactamente el bucle de pausa → toma de control → retorno a la política utilizado en los scripts de aquí.

  • RaC (Hu et al., 2025) escala este buque a tareas de largo horizonte mediante la descomposición explícita de las intervenciones en recuperación (teleoperar de vuelta a un buen estado) y corrección (demostrar el comportamiento correcto desde ahí). Esta descomposición es el protocolo seguido por la estrategia DAgger en lerobot-rollout.

  • π0.6/RECAP (Physical Intelligence, 2025) aplica el mismo bucle iterativo de recopilación y ajuste fino a gran escala con modelos VLA, demostrando que incluso las políticas preentrenadas de gran tamaño se benefician sustancialmente de correcciones humanas dirigidas a sus propios modos de fallo. π0.6 se entrena utilizando RECAP.

@article{ross2011dagger,
  title={A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning},
  author={Ross, Stéphane and Gordon, Geoffrey and Bagnell, Drew},
  journal={Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics},
  year={2011}
}

@article{kelly2019hgdagger,
  title={HG-DAgger: Interactive Imitation Learning with Human Experts},
  author={Kelly, Michael and Sidrane, Chelsea and Driggs-Campbell, Katherine and Kochenderfer, Mykel J},
  journal={arXiv preprint arXiv:1810.02890},
  year={2019}
}

@article{hu2025rac,
  title={RaC: Robot Learning for Long-Horizon Tasks by Scaling Recovery and Correction},
  author={Hu, Zheyuan and Wu, Robyn and Enock, Naveen and Li, Jasmine and Kadakia, Riya and Erickson, Zackory and Kumar, Aviral},
  journal={arXiv preprint arXiv:2509.07953},
  year={2025}
}

@article{pi2025recap,
  title={π0.6: a VLA That Learns From Experience},
  author={Physical Intelligence},
  year={2025}
}
Update on GitHub