← 返回:仿真 · 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,以及「真机」是什么
- 模仿学习(IL,你现在用的): 给策略看人类示范,它照着模仿。天花板约等于示范质量 —— 学不出比示范更好的做法。
- 强化学习(RL): 策略自己试,每次试完给一个奖励(成功=1、失败=0),它朝「多拿奖励」的方向调整。能自己找到比示范更好的动作。
- 「真机 RL」= 这个试错发生在你那台真机械臂上,不在仿真里。 好处:没有 sim-to-real gap(在哪学就在哪用)。代价:真机一次只能试一次(不能像仿真并行几千个),所以慢 —— 这就是为什么它必须「样本高效」、必须有人帮忙(下面②)。
② HIL-SERL 靠三样东西 + 训练循环
HIL-SERL 全称 = 人在回路(Human-In-the-Loop)+ 样本高效强化学习。Berkeley 的方法,LeRobot 里有现成实现。它靠三样东西让真机 RL 在约 1–2.5 小时收敛:
- 少量人类示范当种子。 不从零瞎试,先用你已有的遥操示范把策略初始化到「大致会点」。
- 奖励分类器。 你不用手写「怎么算成功」。做法:收一批「抓起了」和「没抓起」的相机画面,训一个小图像分类器,它看画面输出「成功/失败」。这就是 RL 的奖励信号来源。
- 人在回路里干预(核心技巧)。 机器人自己练时你在旁看;它快失败或要乱动时,你用遥操接管纠正几下,这些纠正喂回训练。既保证安全,又让它别把时间浪费在纯失败上 —— 这是「样本高效」的关键。
图 · 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 教程
- 真机遥操已就位(你有 VR / 主从遥操)。
- 录几条抓杯示范(你已经在录)。
- 训奖励分类器:抓一批「成功抓起」和「没抓起」的画面,训一个小分类器。
- 跑训练循环:策略在真机上尝试 → 你快失败时接管纠正 → 算法用「尝试+干预+奖励」更新,约 1–2 小时。
- 策略收敛到高成功率。
⑤ cost 与诚实标注
- cost(时间/难度): 一次搭 LeRobot 的 HIL-SERL 环境(有文档,有一定工程量)+ 收一批成功/失败画面训分类器;训练本身约 1–2 小时真机,训练时得有人在场做干预(跟你录遥操差不多)。
- 诚实标注: 论文那 100% 主要在有夹具的插装/装配任务上;迁到「抓杯」合理但没被直接测过。奖励分类器要训得像样才有用。
- 排在哪: 四步里的第 ③ 步(① 修真示范覆盖/精度 → ② 深度几何抓取 → ③ HIL-SERL(本页) → ④ Isaac 合成增强)。当纯模仿学习(BC)见顶、还差那口气时,这是把它顶上去的最实在办法。
⑥ 在我们目标 + 机子上:工作量 + 调试清单
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。
图 · actor(真机尝试 + 收你的干预)必须在本地 Jetson;learner(算梯度)放远程 4090。两者用 Tailscale 上的 gRPC(端口 50051)交换「尝试数据」和「新权重」。端口只在私网,别暴露公网。
⚠️ 安全:这个 gRPC 端口有过一个未授权反序列化远程执行漏洞(CVE-2026-25874)。只在 Tailscale 私网上跑,绝不要把 50051 暴露到公网。
C. 怎么跑测
- 成功怎么判:就用奖励分类器(看相机画面输出成功/失败),
success_threshold 例 0.7。
- 训练时盯:WandB 里的每集奖励 + 干预率 —— 健康的训练里干预率会逐步降到接近 0。
- 正式测:论文用 100 次试验;你可以在不同杯位跑 20–30 次,报成功率。
D. 调试 TODO(照做)
- 选短任务:先「抓起并抬升」,控制在 5–10 秒。
- 设末端边界
end_effector_bounds:RL 在末端(爪子)空间训、不是关节空间;用 lerobot-find-joint-limits 找,收紧=安全 + 学得快。
- 设相机裁剪:
crop_dataset_roi.py,缩到 128×128(或 64×64 省 Jetson/VPN 带宽);紧贴工作区 —— 视觉 RL 对背景很敏感。
- 录 20–30 条种子示范,覆盖不同杯位。
- 采分类器数据(设
terminate_on_success:false 好多攒正样本),约 200 正/1000 负,训 resnet10;先单独测分类器 —— 判成功不准会让整个训练「钻空子」骗奖励。
- 设
fixed_reset_joint_positions + reset_time_s 让臂每集自动回起始位;单臂没法自动摆杯,每集你得手动把杯子摆回去。
- 4090 起 learner、Jetson 起 actor,
learner_host=4090 的 Tailscale IP,确认 gRPC 连上、WandB 有日志。
- 早期多干预、逐步收手(手柄扳机/空格);盯干预率曲线往下走。
E. 坑(诚实标注)
- 奖励分类器是头号失败点。不透明杯好一些,但光照/阴影/背景一变,判成功就飘。紧裁剪 + 多攒难负样本,用前先单独验。
- 复位得你自己做。论文任务有夹具;你单臂要每集手动摆杯,限制吞吐。
- 全程要人在场做干预,不是一键跑完。
- 时间:论文的 1–2.5 小时是有夹具 + 调优过的;你第一次在便宜 SO-101 上大概率更久、要几轮。
- 待实测:配置里
policy_parameters_push_frequency 的单位/含义在不同版本有歧义,VPN 延迟也没官方标准 —— 都按你的 Tailscale 实测调。
← 返回总览:仿真 · RL · 深度 —— 整体学习策略架构