数据收集

SO-101 是乐机器人社区中最常见的数据收集设备之一。 本指南涵盖了从硬件连接到录制剧集以及将数据集推送到 HuggingFace 的所有内容。

录音前

录音的硬件设置

SO-101 数据收集设置比 CAN 总线臂更简单 — 一切都通过 USB 运行。 这是要连接的内容。

📷

工作区相机

USB 网络摄像头从上方或侧面指向工作空间。 安装在固定位置 - 不要在剧集之间移动它。 核实: ls /dev/video*

🔒

腕式摄像头(可选)

安装在末端执行器上的小型 USB 摄像头。 添加第一人称视角。 需要第二个 USB 端口。 乐机器人支持多摄像头同步。

🔌

从动臂(USB串口)

执行动作的手臂。 通过USB伺服控制器连接。 验证端口 ls /dev/ttyUSB*

👤

引导臂(USB 串行)

第二个 SO-101 处于顺从模式 - 用手移动它来驱动从动件。 连接到第二个 USB 端口。 提供最高质量的演示。

没有 ROS,没有内核驱动程序: 与 CAN 总线设置不同,SO-101 数据收集堆栈完全通过 USB 串行运行。 您可以在 MacBook 或 Windows 笔记本电脑上进行录制 - 无需 Ubuntu。

录音工作流程

分步录制工作流程

1

验证校准是否有效

如果手臂被拆卸或移动,请在每次新训练之前运行校准。 看 软件 → 校准.

python -m lerobot.scripts.control_robot \
  --robot.type=so101 --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate
2

验证摄像头信息

python -c "
import cv2
for i in range(4):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f'Camera {i}: OK')
    cap.release()
"
3

将手臂移至起始位置

将从动臂置于原始位置(完全伸展,末端执行器指向前方)。 在开始遥摄之前将引导臂重置到相同位置。

4

设置任务场景

将对象放置在一致的起始位置。 如果需要,请在表格中标记——一致的初始条件对于政策泛化至关重要。

5

开始乐机器人录音

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB1 \
  --robot.leader_arms.main.type=so101 \
  --robot.leader_arms.main.port=/dev/ttyUSB0 \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=your-username/so101-pick-place-v1 \
  --control.num_episodes=50 \
  --control.single_task="Pick the red block and place it in the bin" \
  --control.warmup_time_s=3 \
  --control.reset_time_s=8

乐机器人在每集之前都会进行提示。 在热身期间,您可以在录制开始之前调整对引导臂的握力。

6

回顾并重播剧集

python -m lerobot.scripts.visualize_dataset \
  --repo_id=your-username/so101-pick-place-v1 \
  --episode_index=0

立即删除质量差的剧集。 检查相机帧是否丢失、关节速度不稳定或任务执行不完整。

7

推送至 HuggingFace Hub

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/so101-pick-place-v1
数据集格式

SO-101 数据集格式

SO-101 使用标准 LeRobot / HuggingFace 数据集格式 — 与 OpenArm、Koch 和其他 LeRobot 手臂相同的架构。 这意味着您的数据集与完整的乐机器人训练生态系统直接兼容。

剧集数据架构

每集 Parquet 文件中的字段
观察状态 浮点数32[6] 以度为单位的关节位置(6 DOF — 5 个关节 + 夹具)
观察.图像.* 视频路径 参考每个摄像机 MP4 视频文件中的帧
行动 浮点数32[6] 引导臂的目标关节位置
时间戳 浮动64 Unix 时间戳(以秒为单位)
帧索引 整型64 剧集内的帧数
剧集索引 整型64 数据集中的集数
下一步完成 布尔值 每集最后一帧为真
任务索引 整型64 任务描述查找表的索引

SO-101具体说明

SO-101 动作空间使用度数(Feetech 伺服单元)而不是弧度的关节位置。 当混合 SO-101 和 OpenArm 数据集进行跨平台训练时,首先使用中的统计数据将两者归一化为弧度 meta/stats.json.

品质保证

收集数据的质量检查表

每次录制会话后,在推送到集线器之前运行此操作。

  • 1
    剧集长度一致 异常长度的事件通常意味着操作员暂停、夹具滑动或记录中断。 保持在中值长度的 ±30% 范围内。
  • 2
    无伺服速度尖峰 STS3215 伺服系统的带宽有限 - 突然的速度峰值 observation.state 指示串行总线丢失。 删除那些情节。
  • 3
    相机帧与关节数据对齐 检查相机时间戳和联合时间戳是否彼此相差在 20 毫秒内。 USB 串行延迟可能会导致长时间录音出现漂移。 每 100 集重新同步摄像机。
  • 4
    引导臂跟踪顺利 如果跟随者在记录过程中明显滞后(由于 USB 串行延迟),则操作标签将与观察结果发生时移。 重播以检查。
  • 5
    每集开始时的任务场景都是一致的 处于相同位置和方向的物体。 SO-101 较低的重复性(与 CAN 臂相比)使得这一点变得尤为重要——初始条件的变化会损害政策培训。
  • 6
    清晰记录夹爪的打开/关闭 SO-101 夹具状态为关节 6。 验证抓取事件在数据中显示清晰的关节位置转换(打开 → 关闭),而不是逐渐漂移。
下一步

从您的数据集训练策略

一旦您的数据集通过质量检查,就可以使用 LeRobot 训练 ACT 或扩散策略。

火车 ACT

python -m lerobot.scripts.train \
  --policy.type=act \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --policy.chunk_size=100 \
  --training.num_epochs=5000 \
  --output_dir=outputs/act-so101-pick-place

列车扩散政策

python -m lerobot.scripts.train \
  --policy.type=diffusion \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --training.num_epochs=8000 \
  --output_dir=outputs/diffusion-so101-pick-place

社区数据集: SO-101 拥有乐机器人生态系统中最大的社区数据集集合之一。 在收集您自己的数据之前,请检查 适用于现有 SO-101 数据集的 HuggingFace Hub — 您可以根据现有的基础数据集进行微调并节省记录时间。

数据集准备好了吗? 开始训练。

将您的数据集推送到 HuggingFace 并训练 ACT 或扩散策略。