自动数据采集
本文档介绍 Global Humanoid Robot Challenge 2026 Baseline 的自动数据采集功能。系统可在 Walker S2 仿真环境中自动完成抓取、分拣、嵌装或动作回放,并将机器人状态、动作和四路相机图像保存为 LeRobotDataset。
自动采集不需要键盘遥操作。程序入口为 src/lerobot/scripts/auto_collect_main.py,核心实现位于 src/lerobot/auto_collect/。
1. 功能概述
1.1 支持任务
| 任务名称 | 功能说明 | 执行方式 |
|---|---|---|
Part_Sorting | 自动抓取零件,并按类型放入对应箱体 | 右臂单臂执行 |
Conveyor_Sorting | 实时读取传送带零件位置并完成分拣 | 右臂单臂执行 |
Foam_Inlaying | 自动抓取大小工件,并放入对应孔位 | 双臂执行 |
Packing_Box | 回放已有数据集中的动作并重新录制 | 双臂动作回放 |
1.2 采集内容
每个控制周期可同步记录以下数据:
- Walker S2 机器人状态与控制动作
- 头部左、右相机 RGB 图像
- 腕部左、右相机 RGB 图像
- episode、任务描述和时间戳等数据集元信息
2. 快速开始
运行时需要指定任务名称、数据集标识、本地保存目录和采集数量。--auto_collect.repo_id 采用 {用户名或组织}/{数据集名称} 格式;即使仅保存到本地,也需要提供该参数,但数据不会自动上传。
2.1 Task 1:零件分类
/isaac-sim/python.sh -m lerobot.scripts.auto_collect_main \
--robot.type=walker_s2_sim \
--auto_collect.task=Part_Sorting \
--auto_collect.repo_id=your_org/part_sorting_auto \
--auto_collect.root=datasets/Part_Sorting/auto/v0 \
--auto_collect.num_episodes=100 \
--auto_collect.single_task="Part Sorting" \
--auto_collect.record_data=true \
--auto_collect.video=true \
--auto_collect.fps=30
程序使用右臂自动完成接近、抓取、抬升和分类放置,并在每个 episode 成功后保存数据。
2.2 Task 2:传送带分拣
/isaac-sim/python.sh -m lerobot.scripts.auto_collect_main \
--robot.type=walker_s2_sim \
--auto_collect.task=Conveyor_Sorting \
--auto_collect.repo_id=your_org/conveyor_sorting_auto \
--auto_collect.root=datasets/Conveyor_Sorting/auto/v0 \
--auto_collect.num_episodes=250 \
--auto_collect.single_task="Conveyor Sorting" \
--auto_collect.record_data=true \
--auto_collect.video=true \
--auto_collect.fps=30
程序实时读取传送带零件的世界坐标:part_a 放入右侧箱,part_b 放入左侧箱。若执行时间超过 Ubtech_sim/config/Conveyor_Sorting.yaml 中的 timelimit,当前 episode 会按照 max_retries 设置进行重试。
分段采集
需要同时生成“单零件短 episode”和“完整流程长 episode”时,使用分段采集入口:
/isaac-sim/python.sh -m lerobot.scripts.auto_collect_conveyor_segmented \
--robot.type=walker_s2_sim \
--auto_collect.task=Conveyor_Sorting \
--auto_collect.repo_id=your_org/conveyor_sorting_segmented \
--auto_collect.root=datasets/Conveyor_Sorting/auto/segmented_v0 \
--auto_collect.num_episodes=100 \
--auto_collect.single_task="Conveyor Sorting" \
--auto_collect.segmented_failure_mode=loosen
输出目录下会分别生成 short_episodes 和 long_episodes:
| 失败模式 | 处理方式 |
|---|---|
loosen | 跳过失败零件,继续采集当前长 episode |
strict | 将当前长 episode 判定为失败 |
2.3 Task 3:泡沫嵌装
/isaac-sim/python.sh -m lerobot.scripts.auto_collect_main \
--robot.type=walker_s2_sim \
--auto_collect.task=Foam_Inlaying \
--auto_collect.repo_id=your_org/foam_inlaying_auto \
--auto_collect.root=datasets/Foam_Inlaying/auto/v0 \
--auto_collect.num_episodes=100 \
--auto_collect.single_task="Foam Inlaying" \
--auto_collect.record_data=true \
--auto_collect.video=true \
--auto_collect.fps=30 \
--auto_collect.arm_execution_mode=dual
arm_execution_mode 支持以下执行模式:
| 参数值 | 执行方式 |
|---|---|
left_then_right | 先执行左臂动作,再执行右臂动作 |
right_then_left | 先执行右臂动作,再执行左臂动作 |
2.4 Task 4:装箱动作回放
/isaac-sim/python.sh -m lerobot.scripts.auto_collect_main \
--robot.type=walker_s2_sim \
--auto_collect.task=Packing_Box \
--auto_collect.repo_id=your_org/packing_box_auto \
--auto_collect.root=datasets/Packing_Box/auto/v0 \
--auto_collect.num_episodes=100 \
--auto_collect.single_task="Packing Box" \
--auto_collect.record_data=true \
--auto_collect.video=true \
--auto_collect.fps=30 \
--auto_collect.source_repo_id=your_org/packing_box_source \
--auto_collect.source_root=datasets/Packing_Box/source \
--auto_collect.source_episode=0 \
--auto_collect.source_step_interval=1
Packing Box 不使用 IK 规划,而是读取指定源 episode 的 action 并进行回放。每次重置场景后,程序会回放同一个源 episode 并生成一个新的采集 episode,直至达到 num_episodes。
源数据中的 18 维动作会映射为 Walker S2 使用的 20 维动作,并补充 left_gripper 和 right_gripper 控制值。source_step_interval=1 表示逐帧回放,2 表示每两帧取一帧;增大该值会减少回放和录制的帧数。
3. 参数配置
3.1 通用参数
| 参数 | 说明 | 默认值 |
|---|---|---|
--auto_collect.task | 任务名称 | Part_Sorting |
--auto_collect.repo_id | 输出数据集标识 | 空,采集时必填 |
--auto_collect.root | 本地输出目录 | ./outputs/auto_collect |
--auto_collect.num_episodes | 目标 episode 数量 | 1 |
--auto_collect.single_task | 写入数据集的任务描述 | 未指定时使用任务名 |
--auto_collect.fps | 控制与采集频率 | 30 |
--auto_collect.record_data | 是否写入数据集;关闭时仅执行一次流程 | true |
--auto_collect.video | 是否将相机帧编码为视频 | true |
--auto_collect.max_retries | 单个 episode 的最大重试次数 | 20 |
--auto_collect.objects_per_episode | 每个 episode 最多处理的物体数,0 表示全部 | 0 |
--auto_collect.push_to_hub | 完成后是否上传至 Hugging Face Hub | false |
--auto_collect.private | 上传时是否创建私有数据集 | false |
3.2 随机速度
启用随机速度后,每个 episode 会在指定范围内采样速度缩放系数,用于增加数据多样性:
--auto_collect.random_speed=true \
--auto_collect.speed_scale_min=0.5 \
--auto_collect.speed_scale_max=2.0
1.0 为原始速度;小于 1.0 会加快动作,大于 1.0 会减慢动作。上下限相同时即为固定速度。
3.3 视频编码
| 参数 | 说明 | 默认值 |
|---|---|---|
--auto_collect.vcodec | 视频编码器,可选 h264、auto、libsvtav1 | h264 |
--auto_collect.video_encoding_batch_size | 每批编码的 episode 数 | 1 |
--auto_collect.streaming_encoding | 是否在采集时进行流式视频编码 | false |
--auto_collect.encoder_queue_maxsize | 流式编码时每个相机的最大帧缓冲数 | 30 |
--auto_collect.encoder_threads | 每个编码器的线程数 | 自动 |
--auto_collect.num_image_writer_processes | PNG 写入进程数 | 8 |
--auto_collect.num_image_writer_threads_per_camera | 每个相机的 PNG 写入线程数 | 4 |
h264兼容性较好,也是默认选项。auto允许编码器自动选择可用实现,包括硬件编码。libsvtav1压缩率更高,但通常编码更慢。streaming_encoding=true可减少临时 PNG 文件写入,但需要根据内存和编码速度调整队列大小。
4. 采集控制与流程
4.1 运行控制
| 按键 | 行为 |
|---|---|
Esc | 保存当前已录制帧并结束采集 |
← | 清空当前 episode 缓冲,并重新采集该 episode |
Ctrl+C | 中止采集;程序会尝试保存当前已录制帧并释放资源 |
4.2 标准采集流程
除 Packing Box 动作回放外,标准采集流程如下:
- 加载任务 YAML,创建并连接 Walker S2 仿真机器人。
- 初始化 LeRobotDataset,等待物理引擎稳定。
- 重置场景,获取随机化后的零件位置。
- 根据任务选择单臂或双臂策略,自动执行接近、下降、抓取、抬升、移动和放置。
- 每个控制周期记录机器人观测与动作;启用视频时,同时记录四路相机图像。
- 抓取失败时清空当前 episode 并重试;成功后保存 episode。
- 达到目标数量后完成视频编码,并按配置决定是否上传至 Hugging Face Hub。
5. 输出数据
5.1 数据字段
默认数据集包含机器人状态、动作以及以下四路 RGB 相机数据:
observation.images.head_leftobservation.images.head_rightobservation.images.wrist_leftobservation.images.wrist_right
5.2 目录结构
典型输出目录结构如下:
datasets/<task>/auto/v0/
├── data/
│ └── chunk-000/
│ └── file-000.parquet
├── meta/
│ ├── episodes/
│ ├── info.json
│ ├── stats.json
│ └── tasks.parquet
└── videos/
├── observation.images.head_left/
├── observation.images.head_right/
├── observation.images.wrist_left/
└── observation.images.wrist_right/
6. 高级配置与扩展
6.1 覆盖任务配置
各任务的场景、物体数量、抓取参数和超时设置位于 Ubtech_sim/config/<任务名>.yaml。需要临时覆盖 YAML 参数时,可以通过机器人配置传入 JSON:
--robot.task_cfg_overrides='{"part":{"fixed_spawn":{"enabled":false},"num_parts_a":2,"num_parts_b":2}}'
具体字段以对应任务 YAML 为准。命令行覆盖仅对本次运行生效,不会修改配置文件。
6.2 代码结构
src/lerobot/
├── auto_collect/
│ ├── auto_collect_base.py
│ ├── auto_collect_config.py
│ ├── task_part_sorting.py
│ ├── task_conveyor_sorting.py
│ ├── task_conveyor_sorting_segmented.py
│ ├── task_foam_inlaying.py
│ └── task_packing_box.py
└── scripts/
├── auto_collect_main.py
└── auto_collect_conveyor_segmented.py
AutoCollectBase 负责数据集初始化、机器人连接、运动插值、逐帧录制、失败重试和 episode 管理。各任务子类负责计算抓取与放置位姿、判断抓取结果并实现具体执行序列。
6.3 扩展新任务
- 在
src/lerobot/auto_collect/中新增AutoCollectBase子类。 - 实现
compute_grasp_poses()、check_grasp_success()、get_place_pose()和_execute_sequence()。 - 双臂任务设置
is_dual_arm = True,并按需实现get_arm_side()和_on_episode_start()。 - 在
src/lerobot/scripts/auto_collect_main.py的_COLLECTOR_REGISTRY中注册任务名称与采集器类。
新增任务应继续复用基类的 _joint_interpolate_to_pose()、_cartesian_interpolate_to_pose()、gradually_move_gripper() 和 _record_frame(),以保持控制、录制和失败处理行为一致。