SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 3 阶段
基于双 奥比中光 相机、增强深度、B601-DM 主从臂和 SmolVLA,复现高反光桌面上透明瓶与香蕉模型的自主整理链路。
01 / DOCUMENTATION 内容概述
系列教程第 3/7 阶段:编译 OrbbecSDK v2 C++ Bridge,逐项验证 RGB、深度增强、双相机并发、许可和设备稳定性。
02 / DOCUMENTATION 5.1 准备 OrbbecSDK v2
cd ~/wsgit clone https://github.com/orbbec/OrbbecSDK_v2.git先根据 OrbbecSDK 自己的 README 完成 ARM64 编译,并确认至少存在:
/home/r/ws/OrbbecSDK_v2/include/libobsensor/ObSensor.hpp/home/r/ws/OrbbecSDK_v2/build/src/generated/Export.h/home/r/ws/OrbbecSDK_v2/build/linux_arm64/lib/libOrbbecSDK.so03 / DOCUMENTATION 5.2 正确的 bridge 编译命令
cd ~/ws/rebot_lerobot/lerobot/src/lerobot/cameras/orbbec/cpprm -rf build
cmake -S . -B build -DORBBECSDK_ROOT=/home/r/ws/OrbbecSDK_v2 -DORBBECSDK_LIBRARY=/home/r/ws/OrbbecSDK_v2/build/linux_arm64/lib/libOrbbecSDK.so -DORBBECSDK_INCLUDE_DIR=/home/r/ws/OrbbecSDK_v2/include -DORBBECSDK_GENERATED_INCLUDE_DIR=/home/r/ws/OrbbecSDK_v2/build/src/generated
cmake --build build --config Release检查动态库:
ldd build/orbbec_rgbd_bridge | grep -E 'Orbbec|not found'04 / DOCUMENTATION 5.3 第一个坑:OrbbecSDKDIR 不是 .so 文件
错误写法:
-DOrbbecSDK_DIR=/path/to/libOrbbecSDK.soOrbbecSDK_DIR 应该指向含 OrbbecSDKConfig.cmake 的目录,而源码 build tree 往往没有安装好的 package config。当前 CMakeLists 同时支持 package config 和“头文件 + 动态库”两种方式,因此源码编译场景直接传 ORBBECSDK_ROOT、ORBBECSDK_INCLUDE_DIR 和 ORBBECSDK_LIBRARY 最清楚。
05 / DOCUMENTATION 5.4 第二个坑:Export.h 在 generated 目录
如果出现:
fatal error: Export.h: No such file or directory不要复制粘贴这个头文件到 SDK include 目录。正确做法是传入:
-DORBBECSDK_GENERATED_INCLUDE_DIR=/home/r/ws/OrbbecSDK_v2/build/src/generated06 / DOCUMENTATION 5.5 第三个坑:SDK v2 没有Config::enableDevice
某些旧示例会写:
config->enableDevice(serial);当前 SDK v2 的 ob::Config 不提供这个接口。本项目改为:
-
ob::Context::queryDeviceList()枚举设备。 -
优先使用
getDeviceBySN()。 -
如果 SDK 明明列出序列号却直接查找失败,再遍历列表比较序列号并使用
getDevice(index)。 -
用选中的
ob::Device构造ob::Pipeline(device)。
这也解决了“双相机都能被枚举,但指定序列号时偶尔提示找不到”的尴尬情况。
07 / DOCUMENTATION 5.6 枚举相机
./build/orbbec_rgbd_bridge --list-devices记录 Gemini 305 与 Gemini 335L 的 OrbbecSDK 序列号。本文示例是:
Gemini 305 : CV2TC5100075Gemini 335L: CP3L44P0001N你的设备序列号一定要以实际输出为准。
08 / DOCUMENTATION 6.1 为什么/dev/video2 看起来像绿色噪声?
Orbbec RGB-D 相机在 Linux 下可能生成多个 /dev/video*:RGB、深度、IR、元数据都有可能出现。LeRobot/OpenCV 能“打开”一个节点,只能说明它是 V4L2 输入,不能说明数据是普通 BGR。
本项目的 bridge 会根据 SDK profile 选择彩色流,并使用 FormatConvertFilter 将 MJPG、YUYV、UYVY 或 I420 转成真正 RGB。请用 SDK 序列号,不要把 /dev/video2 或 /dev/video4 填进 Orbbec 相机配置。
09 / DOCUMENTATION 6.2 先测试腕部 Gemini 305 RGB
python examples/rebot_b601_smolvla_record/debug_orbbec_camera.py --serial CV2TC5100075 --bridge src/lerobot/cameras/orbbec/cpp/build/orbbec_rgbd_bridge --width 640 --height 480 --fps 10 --warmup-s 15 --timeout-ms 15000 --frames 10010 / DOCUMENTATION 6.3 再测试 Gemini 335L RGB + 增强深度
python examples/rebot_b601_smolvla_record/debug_orbbec_camera.py --serial CP3L44P0001N --bridge src/lerobot/cameras/orbbec/cpp/build/orbbec_rgbd_bridge --width 640 --height 480 --fps 10 --warmup-s 25 --timeout-ms 25000 --frames 100 --depth --enhanced-depth --enhanced-depth-model /home/r/ws/model.sm4 --align-depth-to-color不要只确认“程序没有报错”,还要把透明瓶放到真实高反光桌面上做动态检查:
-
缓慢旋转和横移透明瓶,观察瓶身深度是否整片反复消失或跳到背景距离。
-
改变瓶子与桌面高光的相对位置,观察桌面是否出现大面积随帧闪烁的孔洞。
-
对比瓶体边缘、瓶底接触区和香蕉轮廓在连续帧中的稳定性。
-
分别测试无瓶、只有透明瓶、只有香蕉和两者部分遮挡,排除 filter 只在单一构图下看起来正常。
-
检查
top RGB与top_depth的空间对齐;边缘整体错位比少量深度孔洞更危险。
推荐先运行一小段未启用增强滤波的对照测试,再以完全相同的相机姿态启用 EnhancedDepthFilter;如需留档,可分别采集短测试 episode。评价重点是无效像素比例、轮廓连续性和帧间抖动,而不是伪彩深度图是否“更鲜艳”。透明表面仍有局部无效值是正常现象,增强结果过度平滑、把瓶子和桌面粘成同一平面同样不可取。
11 / DOCUMENTATION 6.4 最后测试双相机同时工作
python examples/rebot_b601_smolvla_record/debug_orbbec_camera.py --pair --bridge src/lerobot/cameras/orbbec/cpp/build/orbbec_rgbd_bridge --wrist-serial CV2TC5100075 --top-serial CP3L44P0001N --fps 10 --frames 200 --enhanced-depth --enhanced-depth-model /home/r/ws/model.sm412 / DOCUMENTATION 6.5 许可保存在设备里,还要不要外部校验工具?
本项目保留了官方 SDK 的设备许可校验链路。若许可已经写入 Gemini 335L,可以不配置外部 enhanced_depth_license_check_command,SDK 会在创建和运行 EnhancedDepthFilter 时读取设备许可。
但是 Jetson 系统时间必须正确。设备断网冷启动后如果时间回到 1970 年,SDK 可能报:
lic_license_verify_from_memory failed: 2003 (License not yet valid)解决方法:
date -Istimedatectl statussudo timedatectl set-timezone Asia/Shanghaisudo timedatectl set-ntp true离线时先关闭 NTP,再手动设置真实时间。采集和推理脚本会在连接相机前拒绝早于 2024-01-01 的系统时间。
13 / DOCUMENTATION 6.6bridge protocol magic mismatch: b'[08/'
bridge 的标准输出是 Python 读取的二进制帧协议。如果 OrbbecSDK 日志也写进 stdout,日志中的 [08/12 ...] 会被 Python 当作包头,于是出现 magic mismatch。
当前 bridge 将 SDK 日志和诊断输出重定向到 stderr,stdout 只保留二进制包。若自行改 bridge,务必守住这条边界。
14 / DOCUMENTATION 6.7 相机超时与setXu failed
依次检查:
-
OrbbecViewer、旧 bridge、ROS 相机节点是否仍占用设备。
-
两个脚本是否错误地同时打开同一序列号。
-
USB 是否确实运行在
5000M,而不是退化到 USB 2。 -
两台相机是否挤在无供电扩展坞上。
-
是否给 Gemini 335L 足够的 25 秒 warmup 与 25 秒 timeout。
-
SDK、固件、扩展库和模型是否兼容。
先单相机、再双相机,永远比直接启动整套采集更省时间。🙂
硬件
软件应用和在线服务
实现步骤
准备 OrbbecSDK v2
核对 SDK、扩展库、头文件、生成目录和 model.sm4 的版本组合
编译 C++ Bridge
使用正确的 OrbbecSDK_DIR 与 generated 头文件路径完成编译
枚举并锁定设备
按序列号识别 Gemini 305 与 Gemini 335L,避免设备索引在重插后交换
单测 Gemini 305 RGB
检查腕部彩色流格式、分辨率、帧率和延迟,不把深度 UVC 节点误当 BGR
单测 Gemini 335L RGB-D
检查彩色、对齐深度、EnhancedDepthFilter 与 uint16 毫米深度输出
双相机并发测试
同时运行两台设备,观察 USB 带宽、超时、setXu failed 与帧时间戳
验证设备许可
检查增强深度许可、系统时间与 License not yet valid 2003 问题
排查协议与稳定性
核对 bridge protocol magic、超时重启和独立 USB 路径
项目结果

完成 OrbbecSDK v2 Bridge 编译和双相机分工验证,Gemini 305 可稳定输出腕部 RGB,Gemini 335L 可输出全局 RGB、对齐增强深度和原始 uint16 深度,并记录许可、协议和超时故障的处理方法。