人在回路(HIL)数据采集

人在回路(HIL)数据采集让你可以通过在真实机器人上部署已训练的 policy 来改进它,同时由人类操作员进行监控并在需要时进行干预。干预数据(恢复 action 和纠错)会与自主运行片段一起被记录,从而生成更丰富的训练 dataset,教会 policy 如何处理失败。


为什么要用人在回路?

标准的行为克隆只基于成功的 demonstration 训练 policy。在部署过程中,小错误可能会累积,将机器人推入训练时从未见过的 state(分布偏移)。HIL 数据采集通过以下方式解决这一问题:

  • 在真实机器人上运行已训练的 policy
  • 在机器人即将失败时由人类进行干预
  • 将人类的恢复与纠错记录为训练数据
  • 在合并的 dataset 上 fine-tune policy

这会产生一个不仅知道如何执行任务,还知道出错时如何恢复的 policy。


工作原理

在 HIL 会话期间,人类操作员在每个 episode 内遵循以下循环:

  1. 观察policy 自主运行
  2. 当失败即将发生时暂停,机器人保持当前位置
  3. 接管控制并遥操作机器人回到良好 state(恢复),然后纠正行为
  4. 将控制权交还给 policy,policy 恢复自主执行
  5. 在 episode 期间根据需要重复步骤 2–4
  6. 任务完成时结束 episode,保存并进入下一次 rollout

自主运行和人工控制的片段都会被记录。在单个 episode 内,policy 和人类可以多次交替控制,每次交接后 episode 都会从当前 state 继续(不会因为发生过干预而需要重置)。这样可以在一条连续的轨迹中同时捕获自主执行、恢复和纠错。采集完成后,合并的 dataset(原始 demonstration + HIL 数据)将用于 fine-tune policy。

这一过程可以迭代重复:部署、采集、fine-tune、重复。每一轮都针对当前 policy 的失效模式。

┌─────────────────────────────────────────────────────────────────────────┐
│  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)                            │
└─────────────────────────────────────────────────────────────────────────┘

硬件要求

teleoperator 要求

lerobot-rollout --strategy.type=dagger 模式需要带有主动电机的 teleoperator,其必须能够:

  • 以编程方式启用/禁用力矩
  • 移动到目标位置(用于在暂停时镜像机器人 state)

兼容的 teleoperator:

  • bi_openarm_mini - 双臂 OpenArm Mini
  • so_leader - SO100 / SO101 leader arm
  • bi_so_leader - 双臂 SO100 / SO101 leader arm

提供的命令默认使用 bi_openarm_follower + bi_openarm_miniso_follower + so_leader 配置也已注册,可通过 CLI 标志使用。


脚本

使用 lerobot-rollout 搭配 --strategy.type=dagger 进行 HIL 数据采集。通过 --inference.type=sync|rtc 选择 inference backend:

模式标志模型
标准(默认)(无需标志)ACT, Diffusion Policy
实时分块(RTC)--inference.type=rtcPi0, Pi0.5, SmolVLA

分步指南

第 1 步:预训练基础 policy

首先,在 demonstration dataset 上训练一个 policy:

python src/lerobot/scripts/lerobot_train.py \
    --dataset.repo_id=your-username/demo-dataset \
    --policy.type=pi0 \
    --output_dir=outputs/pretrain \
    --batch_size=32 \
    --steps=50000

第 2 步:采集 HIL 数据

标准 inference(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=your-username/rollout_hil_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=2

使用 --interpolation_multiplier=N 时,机器人对每个 policy action 接收 N 个插值命令(控制以 fps × N Hz 运行),而 policy inference 和 dataset 录制保持在 --fps,因此录制的 dataset 与其声明的 FPS 相符。

对大型模型使用 RTC(Pi0、Pi0.5、SmolVLA):

对于 inference latency 较高的模型,启用 RTC 以获得流畅执行:

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=your-username/rollout_hil_rtc_dataset \
    --dataset.single_task="Fold the T-shirt properly" \
    --dataset.fps=30 \
    --strategy.num_episodes=50 \
    --interpolation_multiplier=3

控制方式(概念性描述):

交互模型如下:

  • 暂停输入:暂停 policy 的自主执行
  • 接管输入:将控制权移交给人类操作员并记录干预数据
  • 交还 policy 输入:将控制权交还给 policy 并继续同一个 episode
  • episode 控制输入:根据需要保存/重新录制/停止/重置

不同的脚本和硬件集成中,具体的按键/踏板绑定可能有所不同。请以各个脚本打印出来的控制说明为准,来确定你的环境中的具体映射。

HIL 协议:

  1. 观察 policy 自主运行(teleoperator 处于空闲/自由 state)
  2. 当看到即将发生失败时,触发暂停输入
    • policy 停止
    • teleoperator 移动到与机器人位置一致(力矩已启用)
    • 暂停期间不记录任何帧
  3. 触发接管输入以接管控制
    • teleoperator 力矩被禁用,可自由移动
    • 恢复:遥操作机器人回到良好 state
    • 纠错:纠正行为
    • 所有 action 都会被记录
  4. 触发交还 policy 输入
    • policy 从当前 state 恢复自主执行
    • 你可以随时再次干预(重复步骤 2–4)
  5. 任务完成(或达到 episode 时间限制)时结束并保存 episode
  6. 重置:teleoperator 移动到机器人位置,你可以将机器人移动到起始位置
  7. 开始下一个 episode

脚踏板设置(Linux):

如果使用 USB 脚踏板(PCsensor FootSwitch),请确保其访问权限:

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

第 3 步:fine-tune policy

合并的 dataset 上 fine-tune(将 demo-datasethil-dataset 合并在一起):

python src/lerobot/scripts/lerobot_train.py \
    --dataset.repo_id=your-username/hil-dataset \
    --policy.type=pi0 \
    --policy.pretrained_path=outputs/pretrain/checkpoints/last/pretrained_model \
    --output_dir=outputs/hil_finetune \
    --steps=20000

然后部署 fine-tune 后的 policy,并从第 2 步开始重复,以针对其剩余的失效模式。


高效 HIL 采集的技巧

何时干预

在出现以下情况时进行干预:

  • 机器人即将犯下不可挽回的错误
  • 机器人犹豫不决或表现出不确定的行为
  • 机器人偏离预期轨迹

恢复:teleoperation 回到良好 state

在恢复期间,将机器人 teleoperation 回满足以下条件的 state:

  • 机器人处于熟悉且在分布内的位形
  • 当前的子任务仍然可以完成
  • 恢复轨迹本身就是有信息量的训练数据

纠错的质量

在纠错过程中:

  • 提供自信、干净的轨迹
  • 完整地完成当前子任务
  • 不要过度纠正或添加不必要的 action

相关工作

这种 HIL 数据采集方法建立在交互式模仿学习的思想之上:

  • DAgger(Ross 等人,2011)引入了核心思想:不仅仅在专家 demonstration 上训练,还在学习者访问过的 state 上向专家请求纠错。通过迭代采集在 policy 数据,打破了标准行为克隆的误差累积循环。

  • HG-DAgger(Kelly 等人,2019)将其应用于机器人领域:由人类专家监控机器人,仅在需要时干预,而不是对每个 state 进行标注。自主控制与人工控制之间的切换,正是这里脚本所使用的暂停 → 接管 → 交还 policy 的循环。

  • RaC(Hu 等人,2025)通过将干预明确分解为恢复(teleoperation 回到良好 state)和纠错(从中 demonstration 正确的行为),将此循环扩展到长时程任务。这种分解正是 lerobot-rollout 中 DAgger policy 遵循的协议。

  • π0.6/RECAP(Physical Intelligence,2025)使用 VLA 模型大规模应用同样的迭代采集-fine-tune 循环,表明即使是大型预训练 policy,也能从针对其自身失效模式的人工纠错中显著受益。π0.6 就是使用 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}
}
在 GitHub 上更新