背景
具身智能的瓶颈不在模型,在数据闭环。VLA(视觉-语言-动作)模型需要真实机器人的 操作轨迹数据——这要求先把硬件、采集、格式三层全部打通。
本项目是这条链路的完整实践:Piper 六轴机械臂 + Orbbec 深度相机 + Jetson 边缘设备, 实现自动抓取与 LeRobot 格式的 VLA 数据采集。
硬件栈
| 组件 | 型号 | 角色 |
|---|---|---|
| 机械臂 | Piper(六轴) | 执行器 |
| 深度相机 | Orbbec | RGB + 深度感知 |
| 上位机 | Jetson | 边缘推理 + 控制 |
| 通信 | CAN 总线(USB-CAN 转接) | 臂控制通道 |
机械臂走 CAN 总线而不是网口——这是和大多数教程不同的地方,也是踩坑的起点。
三个核心工程问题
1. CAN 总线:内核模块的坑
Jetson 默认内核可能没有 gs_usb 模块(USB-CAN 适配器驱动)。排查路径:
# 检查内核配置
zcat /proc/config.gz | grep CONFIG_CAN_GS_USB
# 输出 "# CONFIG_CAN_GS_USB is not set" → 需要编译内核模块
需要编译与当前内核完全匹配的 gs_usb 模块,设置开机自动加载。另一个高频故障是
CAN 发送失败(Message NOT sent)——标准解法是关接口、卸载驱动、物理重插 USB-CAN、
机械臂断电重启,再重新激活接口。物理层的问题要用物理方法解决,软件重试没用。
2. 手眼标定:2D 单应性就够
相机在固定位置俯视工作台,不需要复杂的 6D 手眼标定——2D 单应性矩阵足够把 图像坐标映射到机械臂工作平面坐标:
- 方式 A(手动标定):在相机画面上点击目标点 → 拖动机械臂末端到该点 → 记录,重复 4+ 个点 → 求解单应性
- 方式 B(复用):已有
2d_homography.npy时,点击画面验证映射精度即可
采集/抓取前必须校验,否则”抓偏”会一路污染数据。
3. 数据格式对齐 LeRobot
采集的数据必须对齐 HuggingFace LeRobot 的数据格式,才能直接进 VLA 训练栈:
- 每个 episode 包含:相机图像序列 + 关节状态 + 动作序列 + 时间戳
- 断点续采:采集中断后能从上次的 episode 继续,不丢数据
- 支持 headless 运行(无显示环境)
功能全景
| 模块 | 说明 |
|---|---|
| YOLO 自动分类抓取 | 检测目标 → 手眼标定映射 → 抓取放置 |
| 半自动采集 | 键盘控制臂,人遥操作录制轨迹 |
| VLA 推理部署 | 数据对齐后加载模型推理,回放动作 |
| LLM 视觉识别抓取 | OpenAI 兼容 VLM 判断类别 → 匹配放置位置 |
| 中国象棋 | 识别棋盘 → 抓子落子 |
| 主从臂跟随 | 主臂示教,从臂跟随 |
工程教训
- 物理层问题用物理方法解决——CAN 断了就是断电重插,别在软件里绕
- 手眼标定是数据质量的第一道闸——标定不准,采集越多垃圾数据越多
- 数据格式要对齐主流训练栈——LeRobot 格式让数据直接可训练,这是”数据闭环”的闭环点
- 断点续采是刚需——真实采集不可能一次成功,没有续采就得从头再来
代码
完整硬件配置、环境搭建、标定流程、故障排查: github.com/cloud666666666/AIIT-Roboarm