数据收集
OpenArm 被设计为一个数据原生平台。 本指南涵盖了从连接摄像机到以 LeRobot 格式录制剧集的所有内容,并在每个阶段进行质量检查。
用于录音的硬件连接
数据收集需要比基本手臂控制更多的硬件。 本节介绍启动 LeRobot 之前要连接的内容和位置。
腕式相机
将 USB 网络摄像头或英特尔实感 D435i 安装到末端执行器法兰。 通过 USB 3.0 连接,帧率超过 30 fps。 核实: ls /dev/video*
俯视/工作区摄像机
将相机固定在工作区上方以获取全局视图。 安装在桌子上方约 60 厘米处,向下倾斜 30°。 第二个 USB 3.0 端口。
CAN总线(手臂控制)
已从设置连接。 核实: ip link show can0。 启动乐机器人之前,CAN 接口必须已启动。
遥控设备
3D SpaceMouse、第二个 OpenArm 作为引导臂或游戏手柄。 带有两个 OpenArms 的领导者-跟随者提供了最高质量的演示。
相机同步注意事项: 乐机器人在主机 PC 级别为所有流添加时间戳。 对于多相机设置,请使用 USB 3.0 集线器(而不是 USB 2.0 集线器)来最大限度地减少相机帧和联合状态读数之间的延迟偏差。 目标:流之间的偏差 < 5 毫秒。
分步录制工作流程
对于每个录制会话,请执行以下步骤。 每个步骤都建立在最后一个步骤的基础上 - 不要跳过步骤。
会前安全检查
清理工作空间(1 m 半径),验证手臂自由到达起始位置,在记录前测试急停。 看 安全页面.
打开CAN接口和ROS2
sudo ip link set up can0
source /opt/ros/humble/setup.bash
source ~/openarm_ws/install/setup.bash
ros2 launch openarm_ros2 openarm.launch.py use_fake_hardware:=false can_interface:=can0
手臂回家
在每次会话之前运行归位例程以设置参考位置。 手臂必须在末端执行器上没有负载的情况下到达其原始位置。
python3 -m openarm_can.scripts.home --interface can0
验证摄像头信息
在启动 LeRobot 之前检查所有摄像头是否正在直播。 如果 LeRobot 不报告,丢失的摄像头将悄悄损坏您的数据集。
# Quick camera check (press Q to exit)
python3 -c "
import cv2
for i in range(4):
cap = cv2.VideoCapture(i)
if cap.isOpened():
print(f'Camera {i}: OK')
cap.release()
"
设置任务场景
将物体放置在一致的起始位置。 一致的场景初始化对于策略泛化至关重要。 拍摄或标记起始配置。
开始乐机器人录音
source ~/.venvs/openarm/bin/activate
python -m lerobot.scripts.control_robot \
--robot.type=openarm \
--control.type=record \
--control.fps=30 \
--control.repo_id=your-username/openarm-pick-place-v1 \
--control.num_episodes=50 \
--control.single_task="Pick up the red cube and place it in the bin" \
--control.warmup_time_s=5 \
--control.reset_time_s=10
乐机器人会在每集开始前提示您。 在录制开始之前,使用 Warmup_time_s 准备好 Teleop 位置。
回顾并重播剧集
记录后,在最终确定数据集之前重播可疑事件。 立即删除质量差的剧集。
python -m lerobot.scripts.visualize_dataset \
--repo_id=your-username/openarm-pick-place-v1 \
--episode_index=0
推送至 HuggingFace Hub
huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
--repo_id=your-username/openarm-pick-place-v1
乐机器人数据集格式
乐机器人以 HuggingFace 数据集格式存储数据集,使用 Parquet 文件存储表格数据,使用 MP4/PNG 文件存储图像流。 每个情节都是一系列带时间戳的观察和行动。
目录结构
your-username/openarm-pick-place-v1/
├── meta/
│ ├── info.json # Dataset metadata, fps, shapes
│ ├── episodes.jsonl # Per-episode metadata (task, length, outcome)
│ └── stats.json # Min/max/mean/std for all fields
├── data/
│ └── chunk-000/
│ ├── episode_000000.parquet
│ ├── episode_000001.parquet
│ └── ...
└── videos/
└── chunk-000/
├── observation.images.wrist_cam/
│ ├── episode_000000.mp4
│ └── ...
└── observation.images.overhead_cam/
└── ...
剧集数据架构
失败事件作为数据
OpenArm 旨在安全地记录失败的尝试,而不仅仅是成功的记录。 失败轨迹——滑移、误判、碰撞、恢复尝试——是对稳健政策泛化至关重要的一流数据。 不要自动删除故障事件。 相反,用 success 字段元数据并让训练框架决定是否使用它们。
收集数据的质量检查表
在每次录制会话之后和推送到集线器之前,请运行此清单。 低质量的数据比低事件数对政策绩效的影响更大。
-
1剧集长度一致 同一任务的所有剧集应在中位长度的 ±30% 范围内。 异常值通常表明操作员暂停、错过抓握或记录被中断。
-
2没有丢失相机帧 检查每集的每个流的帧数是否达到预期。 跑步
lerobot.scripts.visualize_dataset3-5 集来验证视频质量。 -
3联合位置在安全范围内 核实
observation.state永远不会超过联合限制 规格。 高速尖峰表明 CAN 丢失或控制故障 - 删除这些事件。 -
4任务场景在剧集之间重置 每个情节必须以对象处于相同的初始位置开始。 如果您跳过重置,策略将从不一致的初始条件中学习,并且泛化能力很差。
-
5相机覆盖完成 腕式摄像头应始终显示末端执行器和被操纵的物体。 头顶摄像头应显示完整的工作空间。 如果对象在剧集中离开画面,请重新调整安装座。
-
6演示风格一致 所有操作员应使用相同的接近路径和抓握方式。 混合策略使政策培训变得混乱。 每个任务版本使用单个操作员,或按操作员标记情节。
-
7数据集统计看起来合理 查看
meta/stats.json录制后。 验证动作均值接近零(未卡在关节限制处),并且动作标准差足够大以显示各事件之间的变化。 -
8成功率有记录 记录采集过程中的人工成功率。 对于接触丰富的任务,成功率通常为 60-70%。 成功率较低可能表明任务太艰巨; 较高可能意味着任务太容易而无法提供有用的训练信号。
从您的数据集训练策略
一旦您的数据集通过质量检查表,您就可以直接使用 LeRobot 训练 ACT 或扩散策略。
火车 ACT
python -m lerobot.scripts.train \
--policy.type=act \
--dataset.repo_id=your-username/openarm-pick-place-v1 \
--policy.chunk_size=100 \
--training.num_epochs=5000 \
--output_dir=outputs/act-pick-place
列车扩散政策
python -m lerobot.scripts.train \
--policy.type=diffusion \
--dataset.repo_id=your-username/openarm-pick-place-v1 \
--training.num_epochs=8000 \
--output_dir=outputs/diffusion-pick-place
更深入: 阅读全文 数据收集管道概述 在机器人库中,可对情节结构、数据集版本控制、模拟与真实对齐以及多任务数据集组合进行彻底处理。