跳到主要内容
Projects/SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 3 阶段

SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 3 阶段

基于双 奥比中光 相机、增强深度、B601-DM 主从臂和 SmolVLA,复现高反光桌面上透明瓶与香蕉模型的自主整理链路。

Apache-2.0 / MIT

01 / DOCUMENTATION 内容概述

系列教程第 3/7 阶段:编译 OrbbecSDK v2 C++ Bridge,逐项验证 RGB、深度增强、双相机并发、许可和设备稳定性。

02 / DOCUMENTATION 5.1 准备 OrbbecSDK v2

代码块
Bash
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.so

03 / DOCUMENTATION 5.2 正确的 bridge 编译命令

代码块
Bash
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

检查动态库:

代码块
Bash
ldd build/orbbec_rgbd_bridge | grep -E 'Orbbec|not found'

04 / DOCUMENTATION 5.3 第一个坑:OrbbecSDKDIR 不是 .so 文件

错误写法:

代码块
Bash
-DOrbbecSDK_DIR=/path/to/libOrbbecSDK.so

OrbbecSDK_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 目录。正确做法是传入:

代码块
Bash
-DORBBECSDK_GENERATED_INCLUDE_DIR=/home/r/ws/OrbbecSDK_v2/build/src/generated

06 / DOCUMENTATION 5.5 第三个坑:SDK v2 没有Config::enableDevice

某些旧示例会写:

代码块
C++
config->enableDevice(serial);

当前 SDK v2 的 ob::Config 不提供这个接口。本项目改为:

  1. ob::Context::queryDeviceList() 枚举设备。

  2. 优先使用 getDeviceBySN()。

  3. 如果 SDK 明明列出序列号却直接查找失败,再遍历列表比较序列号并使用 getDevice(index)。

  4. 用选中的 ob::Device 构造 ob::Pipeline(device)。

这也解决了“双相机都能被枚举,但指定序列号时偶尔提示找不到”的尴尬情况。

07 / DOCUMENTATION 5.6 枚举相机

代码块
Bash
./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

代码块
Bash
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 100

10 / DOCUMENTATION 6.3 再测试 Gemini 335L RGB + 增强深度

代码块
Bash
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

不要只确认“程序没有报错”,还要把透明瓶放到真实高反光桌面上做动态检查:

  1. 缓慢旋转和横移透明瓶,观察瓶身深度是否整片反复消失或跳到背景距离。

  2. 改变瓶子与桌面高光的相对位置,观察桌面是否出现大面积随帧闪烁的孔洞。

  3. 对比瓶体边缘、瓶底接触区和香蕉轮廓在连续帧中的稳定性。

  4. 分别测试无瓶、只有透明瓶、只有香蕉和两者部分遮挡,排除 filter 只在单一构图下看起来正常。

  5. 检查 top RGB 与 top_depth 的空间对齐;边缘整体错位比少量深度孔洞更危险。

推荐先运行一小段未启用增强滤波的对照测试,再以完全相同的相机姿态启用 EnhancedDepthFilter;如需留档,可分别采集短测试 episode。评价重点是无效像素比例、轮廓连续性和帧间抖动,而不是伪彩深度图是否“更鲜艳”。透明表面仍有局部无效值是正常现象,增强结果过度平滑、把瓶子和桌面粘成同一平面同样不可取。

11 / DOCUMENTATION 6.4 最后测试双相机同时工作

代码块
Bash
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.sm4

12 / 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)

解决方法:

代码块
Bash
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

依次检查:

  1. OrbbecViewer、旧 bridge、ROS 相机节点是否仍占用设备。

  2. 两个脚本是否错误地同时打开同一序列号。

  3. USB 是否确实运行在 5000M,而不是退化到 USB 2。

  4. 两台相机是否挤在无供电扩展坞上。

  5. 是否给 Gemini 335L 足够的 25 秒 warmup 与 25 秒 timeout。

  6. SDK、固件、扩展库和模型是否兼容。

先单相机、再双相机,永远比直接启动整套采集更省时间。🙂

硬件

软件应用和在线服务

实现步骤

01

准备 OrbbecSDK v2

核对 SDK、扩展库、头文件、生成目录和 model.sm4 的版本组合

02

编译 C++ Bridge

使用正确的 OrbbecSDK_DIR 与 generated 头文件路径完成编译

03

枚举并锁定设备

按序列号识别 Gemini 305 与 Gemini 335L,避免设备索引在重插后交换

04

单测 Gemini 305 RGB

检查腕部彩色流格式、分辨率、帧率和延迟,不把深度 UVC 节点误当 BGR

05

单测 Gemini 335L RGB-D

检查彩色、对齐深度、EnhancedDepthFilter 与 uint16 毫米深度输出

06

双相机并发测试

同时运行两台设备,观察 USB 带宽、超时、setXu failed 与帧时间戳

07

验证设备许可

检查增强深度许可、系统时间与 License not yet valid 2003 问题

08

排查协议与稳定性

核对 bridge protocol magic、超时重启和独立 USB 路径

项目结果

SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 3 阶段 项目结果
SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 3 阶段

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

Bladewin Smith
我成功复现了

评论

0 comments