Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

week3

1.标准化部分调研以及模型数据集通用方法调研

本周补充调研了标准化方案。要求标准化的核心目标是:如果别人购买同样的 SO101 主从臂、同样的双摄像头和类似的桌面任务环境,可以尽量复用本项目的数据采集、训练和部署流程,而不是每个人都从零开始调设备、写命令、排查路径。

当前标准化计划分为硬件标准化、软件环境标准化、数据采集标准化、数据集格式标准化和模型训练标准化五部分。

1.1 硬件标准化

硬件标准化的目标是固定机器人和传感器组合,减少由于设备差异导致的模型不可复用问题。

标准化项目当前约定作用
机械臂SO101 leader + SO101 follower保证动作空间、关节数量和控制方式一致
摄像头数量2 路保证视觉输入结构一致
摄像头视角overhead + wrist保证训练和部署时的视觉分布一致
任务物体tennis ball固定第一阶段任务对象
任务目标target area固定放置区域定义

后续如果其他同学购买同样硬件,只需要按照同样的机械臂型号、摄像头数量、摄像头位置和任务场景搭建,即可复用本项目的数据采集脚本和训练配置。

1.2 软件环境标准化

软件标准化主要解决“同一套命令在不同电脑上跑不起来”的问题。当前项目环境约定如下:

Ubuntu 22.04
Python 环境:conda env lerobot
机器人框架:LeRobot 0.5.2
采集命令:lerobot-record
训练命令:lerobot-train
数据格式:LeRobotDataset

需要标准化保存的内容包括:

  • conda 环境名称和依赖版本。
  • LeRobot 版本。
  • 数据采集命令模板。
  • 训练命令模板。

1.3 数据采集标准化

数据采集标准化的目标是让不同人采集的数据具有相同结构,后续可以合并训练。

当前任务文本统一为:

Pick up the tennis ball and place it in the target area.

当前 camera key 统一为:

overhead
wrist

这两个名称后续需要固定,不能一批数据叫 top,另一批叫 front,否则训练时模型输入字段不一致,会影响数据集合并和模型加载。

建议后续采集标准如下:

项目建议标准
episode 时长30s
reset 时长10s
数据集 FPS优先 15fps,稳定后再尝试 30fps
任务文本固定英文任务描述
数据目录使用时间戳,避免覆盖
失败样本单独记录并剔除
摄像头 key固定为 overheadwrist

标准化采集的意义是:后续如果其他人用同样硬件采集同一任务,可以把数据直接合并到同一个 LeRobotDataset 训练流程中,而不需要重新写数据转换代码。

1.4 数据集格式通用性调研

LeRobot 的核心优势是数据集格式相对统一。通过 lerobot-record 采集的数据会保存为 LeRobotDataset,其中包括:

  • 多路图像 observation。
  • 机器人 state。
  • 机器人 action。
  • episode 信息。
  • 任务文本 task
  • 数据集 meta 信息。

只要模型支持 LeRobotDataset,就可以在同一套数据上切换不同 policy 做实验。也就是说,本项目采集的数据不只服务于 SmolVLA,也可以用于对比其他 imitation learning 或 VLA 模型。

1.5 标准化交付计划

为了让其他人购买同样硬件后可以复用,本项目后续计划整理一套标准化交付材料:

1. 硬件清单
2. 摄像头安装位置示意
3. LeRobot 环境安装说明
4. USB attach 脚本
5. 主从臂校准步骤
6. 双摄像头采集命令模板
7. LeRobotDataset 检查脚本
8. SmolVLA训练命令模板
9. rollout 测试步骤
10. 常见错误排查表

标准化的最终目标是形成一套可以复制的 SO101 双摄像头 VLA 数据采集和训练流程。

2.训练模型部分

模型训练部分当前主要围绕自采 LeRobotDataset 展开。数据采集完成后,同一套数据集可以优先用于以下三类实验:

  1. **SmolVLA **

    • 作为主线模型。
    • 使用双摄像头图像、机器人状态和文本任务描述。
    • 目标是训练可执行 “Pick up the tennis ball and place it in the target area.” 的 VLA 策略。
  2. **Pi0 **

    • 作为更大模型方向储备。

    • 需要更多算力和更稳定的数据集。

    • 当前不作为第一优先级。

因此当前采集数据时,需要尽量保证数据字段通用:

camera keys: overhead, wrist
task: Pick up the tennis ball and place it in the target area.
robot type: so101_follower
teleop type: so101_leader
fps: 15 或 30,但同一批数据内保持一致

这样后续可以在不重新采集数据的情况下,直接切换 --policy.type=smolvla--policy.type=act--policy.type=diffusion 进行训练对比。

本周训练的采集数据遇到的硬件问题:

问题 1:摄像头 FPS 设置失败

采集过程中出现过摄像头帧率设置失败:

OpenCVCamera(...) failed to set fps=15 (actual_fps=30.0)

原因是部分 USB 摄像头实际只支持固定的 30fps 模式。即使在 LeRobot 配置中请求 15fps,驱动仍返回 30fps。LeRobot 会严格检查请求帧率和实际帧率是否一致,因此直接报错退出。

处理方式:

  • 对实际只能 30fps 的摄像头,在摄像头配置中写 fps=30
  • 如果希望数据集帧率更低,可以通过 --dataset.fps=15 控制保存频率。
  • 不强行把所有摄像头都设置为 15fps。

结论:摄像头采集帧率和数据集保存帧率可以分开考虑。摄像头按硬件支持的模式运行,数据集按训练需要保存。

问题 2:MJPG 坏帧

采集过程中频繁出现:

Corrupt JPEG data: premature end of data segment

这是 OpenCV 解码 MJPG 图像流时打印的警告,说明摄像头传来的 JPEG 压缩帧不完整。该问题在 WSL2 + USB 摄像头环境中比较常见,尤其是在双摄像头同时采集时更明显。

原因分析:

  • MJPG 本质是连续 JPEG 压缩帧。
  • USB 转发过程中如果数据包不完整,OpenCV 会收到不完整 JPEG。
  • 双摄像头同时采集会增加 USB 带宽压力。
  • WSL2 的 USB 转发稳定性弱于原生 Linux。

处理方式:

  • 对不稳定的俯视摄像头,尽量避免使用 MJPG,改用 YUYV。
  • 对手腕摄像头保留 MJPG,但降低分辨率到 320x240。
  • 降低数据集保存帧率到 15fps。
  • 尽量不要让两个摄像头插在同一个 USB Hub 上。

结论:少量 Corrupt JPEG data 可以忍受,但如果伴随读帧超时,就必须降低负载或更换摄像头格式。

问题 3:读帧超时

双摄像头采集过程中还出现过更严重的错误:

TimeoutError: OpenCVCamera(...) latest frame is too old

该错误会导致 LeRobot 停止录制。它说明某一路摄像头长时间没有提供新帧,超过了 LeRobot 的最大等待时间。

从日志看,主要不稳定的是俯视摄像头:

usb-Sonix_Technology_Co.__Ltd._USB2.0_CAM1...

原因分析:

  • 俯视摄像头在 MJPG 模式下容易出现坏帧。
  • 双摄像头同时 30fps 会使 WSL2 USB 转发压力较大。
  • 实时视频编码会进一步增加 CPU 压力。
  • 当采集主循环低于目标 FPS 时,图像缓存中的最新帧可能变旧,最终触发 timeout。

处理方式:

俯视摄像头:YUYV,640x480,15fps
手腕摄像头:MJPG,320x240,30fps
数据集保存:15fps
实时编码:关闭

结论:由于任务要求必须使用两路摄像头,当前不能简单改成单摄像头采集。较可行的方案是降低双摄像头整体负载,并让俯视摄像头避开不稳定的 MJPG 模式。

问题 4:采集循环低于目标 FPS

日志中多次出现:

Record loop is running slower than the target FPS

这说明 LeRobot 的主循环速度低于设定的数据集 FPS,可能导致丢帧或机器人控制不稳定。

原因分析:

  • 双摄像头读取耗时较高。
  • 图像写盘线程占用 CPU。
  • 视频编码占用 CPU。
  • WSL2 文件系统和 USB 转发都有额外开销。

处理方式:

  • --dataset.fps 从 30 降到 15。
  • 关闭 --dataset.streaming_encoding
  • 减少 --dataset.num_image_writer_threads_per_camera
  • 降低手腕摄像头分辨率。
  • 采集时关闭不必要的后台程序。

结论:当前WSL2 环境下,双摄像头 30fps 采集不够稳定,硬件适配问题严重

目前已更换ubuntu原生电脑来重新采集数据