SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造
基于双 Orbbec 相机、增强深度、B601-DM 主从臂和 SmolVLA,复现高反光桌面上透明瓶与香蕉模型的自主整理链路。
01 / DOCUMENTATION 内容概述
系列教程第 1/7 阶段:明确项目目标、数据流与核心改造,完成主从臂、双 Orbbec 相机、增强深度和安全线程的总体设计。

基于 Seeed 官方 LeRobot 仓库改造:在高反光实验环境中,使用 Orbbec Gemini 305 + Gemini 335L、轻量化蚂蚁灵波(LingBot-Depth)EnhancedDepthFilter、B601-DM 同型号主从臂遥操、云端 RTX 4090 训练与 Jetson Orin NX 边缘推理,挑战透明塑料可乐瓶与香蕉模型的自主整理任务。🔗GitHub
📌 项目阶段说明(截至 2026-08-17):本文已经实机完成相机与增强深度接入、设备许可校验、重力补偿遥操、RGB-D 数据采集与合并、RTX 4090 云端训练、checkpoint 回传,以及 Jetson Orin NX 上的在线推理和安全限幅验证。目前工作停留在模型部署参数微调阶段,尚未在高反光桌面上稳定、可重复地完成透明塑料可乐瓶抓取与归位。因此,本文是一份可运行、可诊断的阶段性工程复现记录,不是一份宣称透明物体抓取已经达到稳定成功率的最终结果报告。
想象一下这样的画面:灯光在桌面上形成明显高光,透明塑料可乐瓶的瓶壁几乎与背景融在一起,黄色香蕉模型和瓶子每次又都被随意摆放。机械臂需要先观察全局,再靠近、抓取,最后把两件物体送回各自的固定位置。它不依赖提前写死的坐标,也不是靠脆弱的颜色阈值脚本硬撑,而是从真人遥操演示中学习整套操作策略。✨
这正是本项目希望最终完成的事情,也是当前仍在继续攻克的最后一段路。
🔍 本项目没有刻意选择“好拍、好识别”的哑光测试台。 实验场景存在较强镜面反射,被操作物之一还是透明塑料可乐瓶。这两项条件会同时考验 RGB 语义识别、深度边缘稳定性和抓取策略泛化,也是本文引入增强深度链路的直接原因。
我们从 Seeed 官方 LeRobot 仓库 出发,让两台同型号的 reBot Arm B601-DM 分别担任主臂和从臂;给主臂加入重力补偿和夹爪微力辅助;给从臂加入 MotorBridge 500 Hz 独立命令流、故障保持、夹爪限力闭合和 episode 恢复;再将腕部 Gemini 305 的近景 RGB、全局 Gemini 335L 的 RGB,以及经过奥比中光 EnhancedDepthFilter 处理的深度可视化图一起交给 SmolVLA。RGB 提供透明瓶的语义与外观线索,增强深度提供更稳定的空间线索,两者互补,而不是让某一路传感器独自完成全部工作。
本文不仅给出“能跑”的命令,也会认真交代一路踩过的坑。很多机器人问题并不浪漫:一个错误的 /dev/video* 节点可以让彩色图变成绿色噪点,一次 H.264 编码尖峰可以让电机命令流断档,一根被关节压住的数据线甚至可能让从臂突然失能。好消息是,这些问题都能被拆开、记录、验证,再逐个解决。🔧
02 / DOCUMENTATION 项目要解决什么问题?🎯
目标任务是:
Arrange the banana model and the transparent plastic cola bottle back to their assigned places on the desktop也就是让机械臂学习一条可以泛化的桌面整理策略:
-
香蕉和透明塑料可乐瓶的起始位置、朝向可以变化。
-
两件物体最终对应的位置保持明确、稳定。
-
机械臂能够通过视觉判断物体位置,而不是记忆某一条固定轨迹。
-
在桌面高光、局部镜面反射和透明瓶深度不完整的情况下,策略仍能利用多路视觉完成操作。
-
训练、采集和推理使用同一套视觉分布,尤其是同一种深度滤波模型、阈值与可视化范围。
这比普通哑光物体抓取更难:透明瓶会让深度出现背景穿透、边缘缺失或跳变,高反光桌面又会带来局部孔洞与飞点。项目的关键问题因此不只是“能否接入深度相机”,而是“能否把同一套经过验证的增强深度处理稳定地贯穿采集、训练和推理”。
本项目的第一阶段采用模仿学习:操作者拖动 B601-DM 主臂,从臂同步执行动作,系统同时记录相机、关节状态与实际下发动作,最后用 SmolVLA 学习“看见什么、当前机械臂是什么状态、下一步该怎么动”。
03 / DOCUMENTATION 1.1 数据流总览

04 / DOCUMENTATION 这个项目改进了什么?🌟
这些改动不是简单地“多接一台相机、再加一个模型”。它们围绕同一个目标展开:让系统在透明物体、高反光背景和边缘设备算力有限的现实条件下,仍能稳定采集可学习的数据,并把完全一致的输入送到 SmolVLA 推理端。
05 / DOCUMENTATION 2.1 同型号 B601-DM 主从臂适配
官方示例更多围绕特定 leader 或基础 follower 插件展开。本项目将 B601-DM 同时适配成:
-
rebot_b601_leader:读取 6 个关节和夹爪,并运行重力补偿、阻抗或零力矩辅助。 -
rebot_b601_follower:接收 7 维位置目标,运行关节限位、相对目标限幅、状态检查和安全恢复。 -
rebot_motorbridge.py:按 Seeed DM 配置维护高频 MIT 命令流与完整反馈诊断。
主从臂都采用 DM 电机,默认通过 Seeed MotorBridge 串口设备 /dev/ttyACM* 通信,而不是把 MotorBridge 错当成板载 can0。
06 / DOCUMENTATION 2.2 主臂重力补偿遥操

单纯关闭主臂电机虽然轻,但机械臂会坠落;使用刚性位置控制又很难拖动。项目复用了 Seeed reBot-DevArm-Grasp 中的动力学模型,为主臂 6 个关节提供重力前馈,并保留轻微阻尼。
经过实机调试后采用的核心参数是:
gravity_comp_torque_scale = 0.95gravity_comp_torque_limit = 8.0gravity_comp_kp = 1.9gravity_comp_kd = 0.75update_hz = 100夹爪不施加“重力补偿”,而是使用独立的 force_assist:给张开方向一个很小的 0.09 Nm 偏置,软件上限为 0.15 Nm,帮助克服上电后的机械阻力,同时避免夹爪突然自行弹开。
07 / DOCUMENTATION 2.3 双 Orbbec 相机不再“都当普通摄像头”
两台相机分工明确:
| 相机 | 安装位置 | 训练输入 | 说明 |
|---|---|---|---|
| Gemini 305 | 机械臂腕部 | observation.images.wrist | 只取 RGB,提供近距离抓取视角 |
| Gemini 335L | 桌面全局视角 | observation.images.top | 全局 RGB,观察物体与目标位置 |
| Gemini 335L | 同上 | observation.images.top_depth | 经 EnhancedDepthFilter 处理后的三通道深度可视化,重点提供透明瓶边界、桌面和目标区域的空间线索 |
| Gemini 335L | 同上 | observation.depths.top | 滤波后、未伪彩化的 uint16 毫米深度,保留孔洞和真实测量结果,供复核与后续研究 |
腕部和全局相机都通过 OrbbecSDK v2 的 C++ bridge 读取。这样做不是为了“显得高级”,而是因为 Orbbec RGB-D 相机会暴露多个 UVC 节点,其中一些是原始深度、红外或元数据流。把这些节点交给 OpenCV 当 BGR 图像读取,就会得到绿色密集噪点,而不是正常彩色画面。
08 / DOCUMENTATION 2.4 蚂蚁灵波轻量模型:为透明瓶与高反光场景补强深度线索

这是本项目最具辨识度的视觉改进。透明塑料可乐瓶会透射和折射部分光线,深度图中常见瓶壁缺失、背景深度“穿过”瓶身、轮廓跳变;高反光桌面则可能产生局部无效值、飞点和随观察角度变化的闪烁。直接把这样的原始深度彩色化后送进模型,既可能增加噪声,也可能让策略学到不稳定的伪特征。
需要先讲清楚一件事:任何深度滤波模型都不能凭空恢复传感器从未测到的全部透明表面。 本项目使用蚂蚁灵波轻量模型的目标,是在 Jetson 可承担的计算量下改善有效区域的连续性、抑制随机噪声并稳定物体和桌面边缘,再与两路 RGB 共同提供信息,而不是把透明物体检测完全押在深度图上。
本项目使用奥比中光 SDK 中的 EnhancedDepthFilter 与裁剪模型 model.sm4。它没有作为离线数据清洗脚本附加在采集之后,而是直接进入 OrbbecSDK v2 C++ bridge:
-
Gemini 335L 同步输出 color + depth
FrameSet。 -
深度先对齐到彩色图。
-
SDK 创建
ob::EnhancedDepthFilter(device, model_path)。 -
调用官方 filter 处理整个
FrameSet。 -
Python 只接收滤波后的深度;启用增强模式后若 filter 或许可失败,立即报错,不允许悄悄退回原始深度。
-
同一份滤波深度同时生成未伪彩化的
uint16深度和三通道top_depth。
原版 SmolVLA 使用视觉编码器处理三通道图像,因此当前方案让 top_depth 作为第三路视觉输入;滤波后的 uint16 深度继续归档,但由 SmolVLARawDepthFilterProcessor 在进入 GPU 前移除,避免把大尺寸整数深度误送进视觉模型。最终形成互补关系:
-
top RGB:识别透明瓶的瓶盖、标签、轮廓和目标区域等语义线索。 -
wrist RGB:在接近和抓取阶段观察局部边缘、夹爪与物体相对位置。 -
top_depth:提供经增强后的桌面几何、距离层次和可用瓶体边界线索。 -
uint16 depth:忠实归档增强后的测量值,用于质量检查和未来深度网络研究。
更重要的是,采集和推理均在设备侧运行同一套 C++ filter、同一个 model.sm4、相同置信度阈值和相同深度可视化范围。这样训练看到的“深度语言”与部署时完全一致,避免出现云端离线处理很漂亮、Jetson 实时输入却是另一种分布的情况。
09 / DOCUMENTATION 2.5 数据采集不再和电机保活“抢一条线程”

RGB-D 等帧、PNG 写盘、H.264 编码和数据集映射都可能卡住 Python 主循环。DM 电机如果长时间收不到命令,可能进入 watchdog 或保护状态。项目为主臂和从臂都增加了独立的 500 Hz MIT 命令刷新线程:上层采集循环只更新目标,高频线程持续重复最近一次完整的 7 电机命令。
同时增加:
-
50 ms 命令间隔告警阈值。
-
500 ms 硬故障阈值。
-
连续 5 次发送失败锁定故障。
-
电机状态从
ENABLED变为DISABLED时立即中止。 -
连续反馈丢失保护。
-
程序异常后最多 15 秒保持当前姿态,给操作者托住机械臂或按急停。
-
episode 起始姿态记录、安全中止、从臂低速回起点和等待主臂回起点。
10 / DOCUMENTATION 2.6 夹爪控制从“硬顶位置”升级为“限力闭合”
早期方案让从臂夹爪一直用较高 kp 追逐完全闭合位置。夹到物体后仍存在巨大位置误差,电机会持续加载,严重时可能单独变为 DISABLED。
现在采用更接近 Seeed 抓取示例的控制方式:
-
张开和空载移动仍使用位置控制。
-
闭合时使用最大
1.0 Nm的有界前馈力矩和阻尼。 -
至少闭合移动
17°后,才允许根据低速度连续样本判断接触。 -
接触后切换到
kp=5、kd=1、0.30 Nm的柔和保持。 -
收到明确张开命令后解除接触保持。
-
所有夹爪力矩受
1.5 Nm软件上限约束。
此外,遥操时需要“主臂夹爪坐标 → 从臂夹爪坐标”映射;推理时模型已经输出从臂坐标,因此必须关闭二次映射。项目用 gripper_map_leader_to_follower 显式区分这两种场景。
硬件
软件应用和在线服务
实现步骤
明确任务与成果边界
确认目标是透明塑料瓶和香蕉模型的自主整理,记录当前“链路跑通”和“实机成功”之间的区别

核对总体数据流
检查主从臂、腕部 RGB、全局 RGB、增强深度、云端训练与 Jetson 推理的数据方向

适配同型号 B601-DM 主从臂
确认 leader 与 follower 驱动、MotorBridge 串口和 7 维目标接口
验证主臂重力补偿
逐步调试重力前馈、阻尼与夹爪微力辅助,保证主臂可拖动且不会坠落

配置双 Orbbec 相机分工
Gemini 305 只取腕部 RGB,Gemini 335L 提供全局 RGB 与增强深度
验证增强深度链路
对透明瓶和高反光区域检查孔洞、飞点、边缘连续性与实时处理延迟

分离数据采集与电机保活
确认 500 Hz 命令线程不会被等帧、写盘或视频编码阻塞

配置夹爪限力闭合
检查空程、接触判定、柔和保持、张开解除和 1.5 Nm 软件上限
项目结果

完成项目边界、数据流和关键改造的总体设计,确认双相机、重力补偿、增强深度、电机保活与夹爪安全控制各自的输入输出。本阶段只证明技术路线和接口成立,不宣称透明瓶抓取任务已经成功。