单臂抓取实战:用OpenLET具身智能挑战赛task1_parts_pick数据训练ACT操作策略(附完整代码)
本文将带你用OpenLET 具身智能挑战赛的task1_parts_pick(部件拾取)真实机器人数据,从零训练一个ACT 操作策略。数据集采用 LeRobot v3.0 标准格式,500 条轨迹、23 万+ 帧,开箱即可跑通"下载数据 → 加载校验 → ACT 训练 → 效果验证"全流程,是新手入门具身智能抓取算法的极佳起点。
🎯 为什么选 ACT 作为第一个操作策略
ACT(Action Chunking with Transformers)是当前最易上手的视觉操作策略:它不预测单帧动作,而是一次性预测一段动作序列(action chunk),天然适合抓取、搬运这类需要连续协调的任务。配合本项目提供的真实遥操作数据,即使没有机器人本体,单卡 GPU 就能完成一次完整的模仿学习实验。
📦 获取 task1_parts_pick 数据集
# 1. 安装 Git LFS(数据文件通过 LFS 存储) git lfs install # 2. 克隆挑战赛数据仓库 git clone https://gitcode.com/OpenLET/Embodied-Data-Manipulation-Challenge三个任务的数据都在 sim/ 目录下,本文使用其中的部件拾取任务:
sim/task1_parts_pick/ ├── data/chunk-000/file-000.parquet # 状态 + 动作等数值数据 ├── meta/ │ ├── info.json # 数据集元信息(特征、帧率、路径模板) │ ├── stats.json # 各特征 min/max/mean/std 统计量 │ ├── tasks.parquet # 任务语言描述 │ └── episodes/chunk-000/file-000.parquet # episode 索引 └── videos/{camera}/chunk-000/file-*.mp4 # 三路/两路相机视频⚠️ 克隆完成后若
file-000.parquet只有几百字节,说明 LFS 未拉取,请在仓库根目录执行git lfs pull。
🔍 读懂数据:元信息里藏着训练所需的全部配置
打开 sim/task1_parts_pick/meta/info.json,关键字段如下:
| 字段 | 值 | 说明 |
|---|---|---|
codebase_version | v3.0 | LeRobot 数据集格式版本 |
robot_type | kuavo-5w | 采集平台机器人型号 |
total_episodes | 500 | 500 条完整拾取轨迹 |
total_frames | 237813 | 约 6.6 小时 10fps 数据 |
fps | 10 | 采集/播放帧率,训练时需一致 |
features中定义了每帧的完整结构:
observation.state:18 维 float32,右侧机械臂 7 个关节角(zarm_r1~r7_link)+ 右夹爪 11 维状态(right_sg100_1~11)action:21 维 float32,在 18 维状态基础上追加底盘速度vx / vy / vyaw,即策略需同时学会"动臂 + 动身"observation.images.head_cam_h/wrist_cam_r:头相机与右腕相机,分辨率 480×640、av1 编码、10fps,视频按 sim/task1_parts_pick/videos/observation.images.head_cam_h/chunk-000/file-000.mp4 的路径模板存放
归一化参数无需手动计算,直接读取 sim/task1_parts_pick/meta/stats.json 中的mean/std即可。
💡 目录下还有一个 sim/task1_parts_pick/20261015/meta/info.json 的双臂扩展版本(200 条轨迹、36 维状态、39 维动作、左/右腕双相机)。单臂跑通后,可切换过去做双臂进阶实验。
⚙️ 一键配置训练环境
推荐 Python 3.10+ 与 CUDA 环境:
# 安装 LeRobot(提供 ACT 实现与 LeRobotDataset 数据加载器) pip install "lerobot[act]" pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118验证环境能正确读取数据(关键一步,提前暴露解码问题):
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset ds = LeRobotDataset(repo_id="local/task1_parts_pick", root="./task1_parts_pick") sample = ds[0] print(sample["observation.state"].shape) # torch.Size([18]) print(sample["action"].shape) # torch.Size([21]) print(len(ds)) # 237813🚀 完整训练代码:启动 ACT 策略
训练命令(python -m lerobot.train,参数名以所用 LeRobot 版本为准):
python -m lerobot.train \ --policy.type=act \ --policy.device=cuda \ --dataset.repo_id=local/task1_parts_pick \ --dataset.root=./task1_parts_pick \ --batch_size=8 \ --steps=200000 \ --save_freq=10000 \ --eval_freq=5000 \ --output_dir=./act_task1参数解读:
--policy.type=act:选择 ACT 策略,视觉编码器 + 动作分块预测--batch_size=8:单卡显存吃紧时可降到 4;显存充足可尝试 16 提升收敛速度--steps=200000:500 条轨迹、10fps 数据下,20 万步是兼顾收敛与耗时的常用起点--save_freq/--eval_freq:定期保存 checkpoint 并回放评估,训练过程可中断续训
✅ 验证效果:回放与打榜
训练完成后,checkpoint 位于./act_task1/下,用 LeRobot 自带的回放工具肉眼检验抓取成功率:
python -m lerobot.replay \ --policy.path=./act_task1/checkpoints/last/pretrained_model \ --dataset.repo_id=local/task1_parts_pick \ --dataset.root=./task1_parts_pick \ --episodes=0,5,10回放脚本会在终端渲染头相机与腕相机画面,并叠加预测动作。若机械臂先下探再闭合夹爪、轨迹平滑无抖动,说明动作分块学习到位;若轨迹"飘",优先检查fps是否与info.json中的 10 保持一致。
🧯 新手常见坑清单
- LFS 未拉取:parquet 只有几十字节、视频打不开 →
git lfs pull - av1 解码失败:旧版 PyAV 不支持 av1,升级
av库或更换解码后端 - 帧率不一致:数据 10fps,加载/训练时采样率要统一,否则动作会"慢放"
- 归一化错位:单臂数据集与
20261015双臂版本维度不同,切换数据集时务必重新加载对应的 stats.json - 数据划分:
info.json中splits.train = "0:500"表示全量训练,可自行留出最后 50 条做验证集
📚 下一步:扩展到另外两个任务
跑通 task1 后,同样的流程可平移到 sim/task2_box_move/(箱体搬运,500 条轨迹、约 29.5 万帧)与 sim/task3_loop_feed/(循环上料),对比不同任务间 ACT 策略的迁移与微调策略。更多赛事信息与提交方式见 README.md。
| 任务 | 目录 | 数据规模 | 相机配置 |
|---|---|---|---|
| 部件拾取 | sim/task1_parts_pick/ | 500 ep / 23.8 万帧 | 头 + 右腕 |
| 箱体搬运 | sim/task2_box_move/ | 500 ep / 29.5 万帧 | 三路相机 |
| 循环上料 | sim/task3_loop_feed/ | 见其 meta/info.json | 头 + 右腕 |
从 500 条真实轨迹到可回放的 ACT 模型,整个过程不涉及复杂工程——这正是具身智能挑战赛希望带给每位开发者的体验:数据就绪,专注算法。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考