← 返回:仿真 · RL · 深度 总览
XLeRobot · 深度研讨 / C 段展开 · 2026-08-28

HIL-SERL:直接在真机上做强化学习
(BC 见顶后的下一步)

real-robot RL奖励分类器人在回路LeRobot 内置

总览页把 HIL-SERL 列成「BC 见顶后期望值最高的下一步」,但没讲清它是什么、真机是什么意思、具体怎么做。这一页补齐。

HIL-SERL:真臂上自己练+你偶尔接管纠正,约 1–2.5h 把约 50% 顶到接近 100%;不用仿真,复用现有示范。

① 先分清:IL vs RL,以及「真机」是什么

② HIL-SERL 靠三样东西 + 训练循环

HIL-SERL 全称 = 人在回路(Human-In-the-Loop)+ 样本高效强化学习。Berkeley 的方法,LeRobot 里有现成实现。它靠三样东西让真机 RL 在约 1–2.5 小时收敛:

  1. 少量人类示范当种子。 不从零瞎试,先用你已有的遥操示范把策略初始化到「大致会点」。
  2. 奖励分类器。 你不用手写「怎么算成功」。做法:收一批「抓起了」和「没抓起」的相机画面,训一个小图像分类器,它看画面输出「成功/失败」。这就是 RL 的奖励信号来源。
  3. 人在回路里干预(核心技巧)。 机器人自己练时你在旁看;它快失败或要乱动时,你用遥操接管纠正几下,这些纠正喂回训练。既保证安全,又让它别把时间浪费在纯失败上 —— 这是「样本高效」的关键。
种子:少量人类示范 (你已有的遥操) ① 策略在真机上尝试抓 试错,不照抄示范 ② 奖励分类器判 成功/失败 + 人快失败就接管纠正 ③ RL 更新策略 吃 示范+尝试+纠正 ↻ 重复约 1–2 小时,策略逐步变好 约 1–2 小时后 → 接近 100% 成功
图 · HIL-SERL 训练循环。示范初始化策略;策略在真机上尝试 → 奖励分类器判成功/失败、你在快失败时接管纠正 → RL 用「示范+尝试+纠正」更新策略 → 重复约 1–2 小时,绿色框是收敛到接近 100%。

背后是能同时吃「示范+自己尝试+人的干预」的 off-policy RL 算法(RLPD)。

③ 结果(论文报的数字)

Science Robotics · hil-serl.github.io

在一批任务(内存条插槽、USB 抓取插入、线夹、装配)上,约 1–2.5 小时真机训练达到约 100% 成功;而用同样的数据只做行为克隆(BC,即普通模仿学习)基线约 49.7%。

④ 在你的 setup 上怎么做

LeRobot HIL-SERL 教程

  1. 真机遥操已就位(你有 VR / 主从遥操)。
  2. 录几条抓杯示范(你已经在录)。
  3. 训奖励分类器:抓一批「成功抓起」和「没抓起」的画面,训一个小分类器。
  4. 跑训练循环:策略在真机上尝试 → 你快失败时接管纠正 → 算法用「尝试+干预+奖励」更新,约 1–2 小时。
  5. 策略收敛到高成功率。

⑤ cost 与诚实标注

⑥ 在我们目标 + 机子上:工作量 + 调试清单

LeRobot HIL-SERL 文档 · 论文 2410.21845 · train_config 示例

A. 要准备多少数据

项数量说明
种子人类示范(遥操)20–30 条覆盖不同杯位;你已有遥操,直接录
奖励分类器样本约 200 张「抓起了」+ 约 1000 张「没抓起」遥操时顺手采;第一轮也可用手柄/键盘手动标成功
分类器模型resnet10,训 5000 步,batch 16一条 lerobot-train 命令,可放远程 4090

200/1000 是论文里(有夹具任务)的数量级,抓杯按你实际校准。

B. 哪些本地、哪些能远程(核心)

先解释:HIL-SERL 把训练拆成两个进程 —— learner(算梯度、更新网络,吃 GPU)和 actor(在真机上跑、收你的干预)。两者用 gRPC(一种进程间网络通信)对话。好消息:learner 能放远程 4090,actor 放本地 Jetson,两台通过 Tailscale 连。

步骤本地(Jetson+真臂+人)远程(4090)
录种子示范✅ 必须本地—
训奖励分类器可✅ 最好远程(纯 GPU)
RL learner(算梯度)慢✅ 放 4090
RL actor(真机跑+人干预)✅ 必须本地—
eval 测试✅ 必须本地(真臂)—

命令:4090 上跑 python -m lerobot.rl.learner --config_path train_config.json,Jetson 上跑 python -m lerobot.rl.actor --config_path train_config.json;把配置里 learner_host 设成 4090 的 Tailscale IP(100.x.x.x)、learner_port 用 50051。

本地 · Jetson + 真臂 + 你 actor 真机上尝试抓杯 收你的接管纠正 远程 · RTX 4090 learner 算梯度、更新网络 (吃 GPU) 尝试数据 → ← 新权重 Tailscale gRPC :50051 私网,别暴露公网
图 · actor(真机尝试 + 收你的干预)必须在本地 Jetson;learner(算梯度)放远程 4090。两者用 Tailscale 上的 gRPC(端口 50051)交换「尝试数据」和「新权重」。端口只在私网,别暴露公网。

⚠️ 安全:这个 gRPC 端口有过一个未授权反序列化远程执行漏洞(CVE-2026-25874)。只在 Tailscale 私网上跑,绝不要把 50051 暴露到公网。

C. 怎么跑测

D. 调试 TODO(照做)

  1. 选短任务:先「抓起并抬升」,控制在 5–10 秒。
  2. 设末端边界 end_effector_bounds:RL 在末端(爪子)空间训、不是关节空间;用 lerobot-find-joint-limits 找,收紧=安全 + 学得快。
  3. 设相机裁剪:crop_dataset_roi.py,缩到 128×128(或 64×64 省 Jetson/VPN 带宽);紧贴工作区 —— 视觉 RL 对背景很敏感。
  4. 录 20–30 条种子示范,覆盖不同杯位。
  5. 采分类器数据(设 terminate_on_success:false 好多攒正样本),约 200 正/1000 负,训 resnet10;先单独测分类器 —— 判成功不准会让整个训练「钻空子」骗奖励。
  6. 设 fixed_reset_joint_positions + reset_time_s 让臂每集自动回起始位;单臂没法自动摆杯,每集你得手动把杯子摆回去。
  7. 4090 起 learner、Jetson 起 actor,learner_host=4090 的 Tailscale IP,确认 gRPC 连上、WandB 有日志。
  8. 早期多干预、逐步收手(手柄扳机/空格);盯干预率曲线往下走。

E. 坑(诚实标注)

← 返回总览:仿真 · RL · 深度 —— 整体学习策略架构