HIL-SERL 从零跑通:HIL-SERL 安装、入口脚本与配置一篇讲清
【免费下载链接】hil-serl项目地址: https://gitcode.com/gh_mirrors/hi/hil-serl
HIL-SERL(基于人机协作强化学习的精确与灵巧机器人操纵项目)提供了一套完整工具链,让你把"人类演示 + 人在环纠正"与强化学习训练结合,在 Franka 机械臂上训练成功率接近 100% 的操纵策略。本文带你走完"定位 → 装环境 → 找入口 → 拆模块 → 落配置"的完整上手路径。
🎯 HIL-SERL 定位与能力边界:它解决什么问题
先说清楚它是什么、不是什么。纯 SERL 类方法完全依赖奖励信号和自主探索,遇到"精确对插"这类任务时,机械臂要在巨大动作空间里盲目摸索很久,成功率爬升非常慢。HIL-SERL 的关键差异在于允许操作者在训练过程中直接接管:训练初期,你用手柄(空间鼠标)把机械臂拉到正确位置附近,再放开让策略接管;同时用少量人类演示数据做预训练。论文中的 RAM 插入、USB 拾取插入任务,配合间歇性人工干预,分别约 1.5 小时、2.5 小时收敛到 100% 成功率。
它的能力边界大致是:需要 Franka 机械臂 + RealSense 相机的真机环境,任务覆盖单臂对插、多阶段抓取插入、双臂交接(object handover)和动力学任务(egg flip,用一套专门的力控控制器实现)。没有 Franka 硬件可以阅读代码和示例配置来学习设计,但训练闭环跑不起来。
🛠️ 环境搭建与依赖安装:conda 环境与硬件侧准备
仓库没有一键的setup_conda.sh,README 把安装拆成了四步,按顺序执行即可:
- 创建环境:
conda create -n hilserl python=3.10 - 安装 JAX:这是项目底层的数组计算库,训练速度几乎完全取决于 GPU 版 JAX。有 NVIDIA 显卡装
jax[cuda12_pip]==0.4.35并附加官方 CUDA 源参数;纯 CPU 可用jax[cpu],但训练会慢到不可用 - 安装算法侧主包:进入
serl_launcher目录执行pip install -e .,再装pip install -r requirements.txt - 安装机器人侧基础包:进入
serl_robot_infra目录执行pip install -e .
硬件侧还有两件事容易漏:libfranka/franka_ros官方驱动,以及基于阻抗控制的serl_franka_controllers控制器包(按 serl_robot_infra/ 的 README 安装并编入 catkin 工作空间)。上电后务必在 Franka Desk 网页界面里录入腕部相机质量做末端载荷标定,否则阻抗控制精度会明显下降。
常见报错集中在 JAX 与 GPU 驱动版本不匹配(表现为jax.devices()只能看到 CPU),按 JAX 官方要求对齐 CUDA 版本即可;装完可用python -c "import jax; print(jax.devices())"验证。
🚀 三个入口脚本与调用链:先奖励分类器,再演示,最后训练
真正的入口在 examples/ 目录,围绕"实验文件夹"组织:每个任务(如 ram_insertion)有自己的配置和启动脚本。执行顺序有严格依赖:
1. 训练奖励分类器:python record_success_fail.py --exp_name ram_insertion --successes_needed 200
机器人任务的"奖励"往往无法从传感器直接读出(RAM 到底插进插槽没有),HIL-SERL 的做法是训练一个看相机图像的"成功/失败"图像分类器来发奖励。这个脚本负责收集它的训练数据:默认全部记为负样本,按住空格键的那一步记为正样本,直到凑够指定数量。建议负样本收 2~3 倍于正样本,覆盖各种"看似成功其实没成功"的失败形态,能显著降低误报。然后python train_reward_classifier.py --exp_name ram_insertion训练,模型存入classifier_ckpt/。
2. 录制人类演示:python record_demos.py --exp_name ram_insertion --successes_needed 20
用空间鼠标手把手教机械臂完成 20 次成功轨迹。这里奖励分类器已经在工作——它判断你这条演示是否成功,失败的会丢弃重来。数据存入demo_data/。
3. 策略训练:主训练循环是train_hgdagger.py,每个实验文件夹里的run_actor.sh/run_learner.sh是对它的封装。actor 节点在环境里跑策略、采数据,learner 节点在 GPU 上训练、定期同步参数,两者异步运行;另有train_bc.py(行为克隆基线)和train_rlpd.py(在线模仿学习基线)可作对照。训练时用空间鼠标在策略反复犯错时介入纠正。
| 顺序 | 脚本 | 输入 | 输出 |
|---|---|---|---|
| 1 | record_success_fail.py→train_reward_classifier.py | 相机图像(成功/失败标注) | classifier_ckpt/ |
| 2 | record_demos.py | 空间鼠标演示轨迹 | demo_data/ |
| 3 | run_actor.sh+run_learner.sh | 演示数据 + 奖励分类器 | checkpoint_path/ |
评估训练好的策略:在run_actor.sh中加--eval_checkpoint_step与--eval_n_trajs两个参数,只启动 actor 即可。
📦 核心模块速览:四个子目录各司其职
仓库顶层就三块:examples/、serl_launcher/(算法侧)、serl_robot_infra/(硬件侧)。
| 模块路径 | 职责 |
|---|---|
| examples/ | 入口脚本与四个任务实验配置 |
| serl_launcher/serl_launcher/agents/ | SAC、BC 等策略实现 |
| serl_launcher/serl_launcher/wrappers/ | 环境包装:动作归一化、分块执行 |
| serl_launcher/serl_launcher/data/ | 重放缓冲区与网络传输数据存储 |
| serl_launcher/serl_launcher/vision/ | ResNet 视觉骨干与数据增强 |
| serl_robot_infra/robot_servers/ | Flask 服务,经 ROS 下发指令 |
| serl_robot_infra/franka_env/ | Franka 的 gym 环境 |
整体训练拓扑是 actor-learner 异步结构:
actor 与 learner 通过 agentlace 走网络通信、周期性同步策略,好处是推理(机械臂实时动作)和训练(GPU 迭代)互不阻塞。
⚙️ 配置体系与硬件对接:三个必须改的配置维度
HIL-SERL 没有统一的config.yaml,而是"一个任务一个 Python 配置文件",全部位于examples/experiments/<任务名>/下:
config.py:环境与训练参数,其中必改的三块——①EnvConfig里的SERVER_URL(机器人服务器地址)、REALSENSE_CAMERAS与IMAGE_CROP(相机序列号与裁剪区域,序列号在 RealSense Viewer 里查);② 关键位姿TARGET_POSE/GRASP_POSE/RESET_POSE,用curl -X POST http://<服务器>:5000/getpos_euler抓取当前末端位姿填入;③ 安全动作边界ABS_POSE_LIMIT_HIGH/LOW,限定策略探索范围,必须保证边界内没有碰撞风险wrapper.py:该任务的 gym 环境封装,相机初始化、任务特有逻辑在这里,一般只在换任务时参考run_actor.sh/run_learner.sh:启动封装,训练前要改checkpoint_path和demo_path两个路径
硬件链路一句话讲完:gym 环境发 HTTP POST 请求 → Flask 机器人服务 → ROS 驱动阻抗控制器 → 机械臂;空间鼠标的人工干预走同一条链路。
接下来可以做什么
- 通读 docs/franka_walkthrough.md,RAM 插入任务的逐步骤说明最完整,建议第一个任务从它开始
- 对照 examples/experiments/ram_insertion/ 把三个必改配置项过一遍,先跑通奖励分类器数据采集确认相机画面正常
- 训练初期多干预、后期少干预是收敛的关键经验,文档"Additional Tips"一节有详细的节奏建议
【免费下载链接】hil-serl项目地址: https://gitcode.com/gh_mirrors/hi/hil-serl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考