跳到主要内容

自动数据采集


本文档介绍 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_episodeslong_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_gripperright_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 Hubfalse
--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视频编码器,可选 h264autolibsvtav1h264
--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_processesPNG 写入进程数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 动作回放外,标准采集流程如下:

  1. 加载任务 YAML,创建并连接 Walker S2 仿真机器人。
  2. 初始化 LeRobotDataset,等待物理引擎稳定。
  3. 重置场景,获取随机化后的零件位置。
  4. 根据任务选择单臂或双臂策略,自动执行接近、下降、抓取、抬升、移动和放置。
  5. 每个控制周期记录机器人观测与动作;启用视频时,同时记录四路相机图像。
  6. 抓取失败时清空当前 episode 并重试;成功后保存 episode。
  7. 达到目标数量后完成视频编码,并按配置决定是否上传至 Hugging Face Hub。

5. 输出数据

5.1 数据字段

默认数据集包含机器人状态、动作以及以下四路 RGB 相机数据:

  • observation.images.head_left
  • observation.images.head_right
  • observation.images.wrist_left
  • observation.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 扩展新任务

  1. src/lerobot/auto_collect/ 中新增 AutoCollectBase 子类。
  2. 实现 compute_grasp_poses()check_grasp_success()get_place_pose()_execute_sequence()
  3. 双臂任务设置 is_dual_arm = True,并按需实现 get_arm_side()_on_episode_start()
  4. src/lerobot/scripts/auto_collect_main.py_COLLECTOR_REGISTRY 中注册任务名称与采集器类。

新增任务应继续复用基类的 _joint_interpolate_to_pose()_cartesian_interpolate_to_pose()gradually_move_gripper()_record_frame(),以保持控制、录制和失败处理行为一致。