ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Orbbec深度相机ROS2多设备部署实战:从SDK安装到点云同步

Orbbec深度相机ROS2多设备部署实战:从SDK安装到点云同步 最近在帮朋友调两台Orbbec深度相机从OrbbecSDK的安装到ROS2环境下多设备同时出点云折腾了整整半个下午。网上关于Orbbec深度相机部署的教程不少但绝大多数只讲了单设备怎么跑通多设备配置要么藏在官方仓库的issue里要么版本对不上照着做根本复现不了。这次我把整个部署过程完整记录下来覆盖OrbbecSDK与ROS2的版本选型、单相机快速接入流程、多相机同时启动的完整配置以及调试中遇到的典型问题和排查思路。无论你是刚接触深度相机的新手还是在ROS2里被多设备折腾到头秃的开发者这篇内容都值得收藏。1. 环境准备与SDK选型思路1.1 为什么选择ROS2而不是ROS1先说结论如果你是2024年之后才开始做机器人视觉相关开发直接上ROS2不要犹豫。Orbbec官方对ROS1 wrapper的维护已经基本停止最新的OrbbecSDK_ROS2仓库从一开始就是基于ROS2设计的功能迭代、issue响应都在ROS2这边。我最初也想图省事用ROS1 Noetic因为旧项目里ROS1生态成熟但翻了一遍官方wrapper的commit记录ROS1分支停在两三年前的版本连新出的Gemini 330系列相机支持都没有只能放弃。ROS2本身的优势也值得多说一句。DDS的分布式通信机制让多相机多节点部署变得自然一个相机一个节点互相之间不会因为话题命名冲突而崩溃。这在多设备场景下特别重要ROS1时代那种靠master集中管理、节点一多就互相踩踏的问题在ROS2里基本不存在。你只需要处理好命名空间和node名称多相机就能各跑各的互不干扰。1.2 硬件识别与OrbbecSDK版本对应关系Orbbec的相机产品线看起来乱但摸清楚了就那几类。Gemini系列走的是USB接口结构光或者双目方案适合近距离高精度场景Femto系列分两种Femto和Femto Mega是USB或者POE供电的RGB-D相机Femto Bolt则是纯网络相机走的是2.5G以太网接口。Astra系列是上一代结构光产品现在新项目不太推荐了除非你手头有存货。我这台是Gemini 335E双USB-C接口一个数据口一个供电口接USB3.0时不需要单独供电。这里有个细节需要注意不同系列的SDK兼容性不一样老设备用新SDK往往会有兼容问题。所以你先要做的是确定自己的设备类型然后去Orbbec官网找对应的SDK版本。ROS2 wrapper的README里会写明它支持哪些设备、需要哪个版本的OrbbecSDK这一步千万别跳我第一次就栽在这上面用旧版SDK强行编译新wrapper编译倒是过了一启动就报设备打开失败。1.3 依赖安装与OrbbecSDK编译我的系统环境是Ubuntu 22.04 ROS2 Humble这是目前ROS2 LTS版本里最稳的组合。如果你还在用20.04可以上Foxy或者Galactic但我建议直接升系统Humble的兼容性和社区支持都要好得多。先装基础依赖sudo apt install git cmake build-essential \ libeigen3-dev libopencv-dev libjsoncpp-dev \ libgtest-dev libyaml-cpp-dev python3-colcon-common-extensions然后下载并编译OrbbecSDK本体。官方SDK的编译方式很简单cmake一套带走git clone https://github.com/orbbec/OrbbecSDK.git cd OrbbecSDK mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install编译的时候如果报缺少libusb相关的头文件记得先装libusb-1.0-0-dev。编译完之后可以跑一下SDK自带的示例程序OrbbecViewer来验证相机能不能正常出图。这一步很关键我在单台相机的场景下没问题但在多设备场景踩过一个坑两台相机一起插的时候OrbbecViewer只能识别到一台后面会专门讲这个。2. 单相机完整接入ROS2流程2.1 udev规则与设备权限深度相机接入Linux之后如果直接跑节点大概率会报No device found或者权限错误。原因很简单相机的USB设备节点默认只有root用户能访问你的ROS2节点是用普通用户跑的自然打不开。OrbbecSDK源码目录里带着一份udev规则文件路径在misc/scripts/99-orbec.rules。拷贝到系统udev目录然后重新加载sudo cp misc/scripts/99-orbec.rules /etc/udev/rules.d/ sudo udevadm control --reload sudo udevadm trigger这里有个容易忽略的点插拔相机之后如果发现权限还是不对别急着改文件权限先重新插拔一次USB让udev规则重新生效。我习惯写完规则之后重启一次电脑虽然麻烦点但保证环境干净排查问题的时候不会多一个变量。2.2 编译ROS2 Wrapper与Launch启动Orbbec的ROS2 wrapper仓库叫OrbbecSDK_ROS2本身是一个colcon工作空间下的package结构。mkdir -p ~/orbbec_ws/src cd ~/orbbec_ws/src git clone https://github.com/orbbec/OrbbecSDK_ROS2.git cd ~/orbbec_ws colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPERelease编译完成后先配置环境变量再启动节点source ~/orbbec_ws/install/setup.bash ros2 launch orbbec_camera orbbec_camera.launch.py默认launch会启动一个名为orbbec_camera_node的节点发布的话题大致如下/camera/color/image_raw彩色图像/camera/depth/image_raw深度图像像素格式是16UC1/camera/depth/points点云数据类型是sensor_msgs/PointCloud2/camera/color/camera_info、/camera/depth/camera_info相机内参如果彩色图是黑白的或者图像里灰蒙蒙一片大概率是彩色格式设置错了。Orbbec的wrapper默认color format可能是YUYV某些设备在ROS2下显示不太正常。在launch文件里把color_format参数改成RGB或者BGR再试试。我实测Gemini 335E用RGB是最稳的ROS2的image_transport对RGB的支持也比YUYV好。2.3 rviz2中的可视化验证节点跑起来之后用rviz2验证是最直观的。新开一个终端ros2 run rviz2 rviz2在rviz2里添加两个显示组件一个Imagetopic选/camera/color/image_raw一个PointCloud2topic选/camera/depth/points。点云的Fixed Frame要设置成相机的frame_id一般是camera_link或者camera_depth_frame。如果点云没显示出来先检查frame_id是否正确再看tf树里有没有camera_link到camera_depth_optical_frame的变换。wrapper应该会自动发布tf但如果你做到了多设备或者自己改了frame_idtf没配上就什么都显示不出来。这一步如果顺利单相机就算完全跑通了。接下来是重头戏多设备配置。3. 多设备配置实战3.1 默认配置下多设备冲突的原因先说问题现象。两台Orbbec相机同时插到一台电脑上只跑一个相机节点能正常工作一旦再启动第二个节点新节点会一直报Device not found甚至第一个节点也可能跟着掉线。就算你不死心写了两个launch文件想同时启动第二个节点起来后会把第一台的流也抢过去现象非常诡异。根本原因是OrbbecSDK在默认情况下不指定序列号它能枚举到设备但是打开设备的时候是按下标找的。第一个节点打开了下标0的设备第二个节点再打开时如果设备列表里第一台已经被占用了SDK不一定能从列表里正确排除已经被占用的设备就会发生设备打开冲突。多设备正确配置的核心就是给每个节点指定不同的设备序列号让每个节点明确知道自己要打开哪一台设备而不是靠默认的下标。所以多设备配置的关键就三个字序列号。另外多个节点如果都用默认的node名和话题名即使设备能打开话题也会互相覆盖。你需要同时给每个节点设置不同的camera_name或者namespace让话题分开。3.2 基于序列号与命名空间的多设备启动先查询设备序列号。插上所有相机然后运行ros2 run orbbec_camera list_devices_node这个节点会枚举所有Orbbec设备输出类似[0] SN: 1234567890 name: Orbbec Gemini 335E [1] SN: 0987654321 name: Orbbec Gemini 335E记下两台相机的序列号然后写launch文件。我实际用的是这样一个Python launch文件双相机配置下非常稳定from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packageorbbec_camera, executableorbbec_camera_node, nameleft_camera, parameters[{ serial_number: 1234567890, camera_name: left, color_format: RGB, color_resolution: 1280x720, depth_resolution: 640x480, pointcloud_enable: True, enable_colored_pointcloud: True, }] ), Node( packageorbbec_camera, executableorbbec_camera_node, nameright_camera, parameters[{ serial_number: 0987654321, camera_name: right, color_format: RGB, color_resolution: 1280x720, depth_resolution: 640x480, pointcloud_enable: True, enable_colored_pointcloud: True, }] ), ])保存为dual_orbbec.launch.py然后colcon build之后启动ros2 launch orbbec_camera dual_orbbec.launch.py启动之后用ros2 topic list看一下话题你会看到两个相机的话题按照camera_name参数分开了/left/camera/color/image_raw/left/camera/depth/points/right/camera/color/image_raw/right/camera/depth/points如果两个节点的camera_name相同话题就会冲突后启动的节点会把先启动的节点的话题顶掉订阅端收到的数据会反复跳变。所以多设备时camera_name是必填参数每个节点的名字name也要不同避免节点管理器报重名。3.3 带宽分配与硬件同步方案多设备同时跑起来之后第二个坑往往是带宽。深度相机的数据量很大VGA分辨率的深度图30帧每秒一帧640x480x2字节大概是614KB每秒就是18MB/s1080P的彩色图如果不开压缩每秒能到80MB/s以上。两台相机同时以全分辨率满帧率输出对USB总线的压力非常明显。如果你遇到间歇性丢帧或者图像撕裂优先做三件事把相机的USB线分别插到不同USB控制器上USB3.0口和USB2.0口往往对应不同控制器但要注意深度的点云数据必须走USB3.0以上。降低彩色分辨率到720P深度保持640x480。对于大多数视觉SLAM和抓取任务这个配置已经够了。把彩色格式从RGB换成MJPG深度数据量不变但彩色部分带宽能降一个数量级。如果是Femto Bolt这类网络相机带宽问题变成了网络配置问题。多台网络相机需要分配不同IP并在相机固件里配置静态IP而不是DHCP避免reboot之后IP漂移。OrbbecSDK的枚举工具会抓取网络设备IP不通的时候同样会出现设备找不到。另一个容易被忽视的问题是硬件时间同步。两台相机如果完全独立运行各自的深度图和彩色图之间没有硬件触发信号时间戳是异步的动态场景下做点云融合会看到明显的错位。Orbbec 330系列相机提供sync接口支持一主一从或者主从链式同步。主相机输出同步信号从相机接收所有相机的曝光起始时刻基本对齐。SDK wrapper里enable_sync参数可以配合硬件同步使用具体接线方式参考相机说明书。如果没有硬件同步需求静态标定场景下用软件时间戳也能凑合。4. 常见问题排查与避坑经验4.1 设备枚举失败或找不到设备这个问题出现频率最高而且原因五花八门。先用排除法快速定位lsusb看内核是否能识别到Orbbec设备。如果lsusb里能看到设备但SDK枚举不到先检查udev规则是否生效再确认SDK版本是否支持该设备。如果lsusb里都看不到换一根USB线试试或者把相机插到主板的USB3.0口上不要用前置面板或者USB Hub。USB Hub是多设备场景里的隐形杀手深度数据对延迟和带宽敏感Hub会引入额外延迟问题很随机。如果多设备里只有一台能被枚举到最简单的排查方式是用官方OrbbecViewer工具。还是只能看到一台说明是硬件层面的枚举问题先换接口、换线、换Hub如果能枚举到两台说明SDK层面没问题是你的启动参数问题多半是没指定序列号。4.2 点云Topic正常但rviz2不显示点云这个话题看似简单实际遇到的人非常多。先说结论90%是Fixed Frame设置问题。你的tf树里如果有多个相机的坐标系rviz2的Fixed Frame要设置成你要看的那台相机的frame_id别让它自动选。另外注意相机的frame_id参数可以用frame_id参数自定义多设备时建议改成left_camera_link、right_camera_link这样的语义化名称省得在rviz2里分不清。还有5%的情况是pointcloud_enable参数没有设置成truewrapper默认不一定开启点云。最后5%是点云计算本身需要依赖GPU或者CPU算力如果你的机器性能很差点云生成速率低到每秒只有一帧看起来就像卡住了一样。用ros2 topic hz /left/camera/depth/points看一下实际发布频率低于5Hz就要考虑降分辨率。4.3 多设备时间戳不同步的处理如果你要做两台相机的数据融合时间戳不同步是躲不开的问题。软件层面最简单的方案是让所有相机的节点用同一个系统时钟这需要主机的时钟本身是准的。建议在主机上配置NTP同步保证system time稳定然后wrapper里把时间戳模式设置成主机时间而不是相机硬件时间。这样两个相机的话题时间戳虽然在严格意义上不是同一时刻但至少都在同一个时间基准下处理帧间插值会方便很多。如果要严格同步必须上硬件同步信号。Orbbec官方文档里有多相机同步的配置说明核心思路就是选择一台作为master其他相机作为slave通过sync线连接然后wrapper里开启对应的sync参数。配置完之后用ros2 topic echo对比两个相机的曝光时间戳差异应该在微秒级别。4.4 多设备部署的几点个人心得最后分享几个这次调试攒下来的经验。第一多相机节点的启动顺序是有讲究的。我的经验是不同节点的启动间隔至少要给2到3秒不要两个相机节点同时拉起。当前SDK在并发枚举设备时还有竞态问题快速连续启动容易导致第二台设备枚举失败。你可以在launch文件里给每个Node加一个delay或者用shell脚本顺序启动。第二USB供电问题比想象中常见。两台相机如果都插在同一排USB口上电压不稳会导致相机时断时连。最好给相机外接独立供电特别是长线或者用Hub的情况下。我这次调试时就是给其中一台插了独立供电问题立刻消失。第三调试多设备时建议先关掉非必要设备只插一台相机验证单设备拓扑正常之后再逐步插入第二台。不要一上来就两台的launch一起启动出了错很难判断是SDK问题还是配置问题。一台一台配配好查话题、查tf、查点云频率全都没问题再做并联测试这样效率最高。我个人的体会是Orbbec的ROS2 wrapper整体完成度已经相当高了单相机基本零配置就能跑通多设备的核心难点不是在代码上而是在对设备枚举机制的理解和USB资源的分配上。只要把序列号、camera_name、USB控制器这三个关键点抓到位多相机部署并不是什么难事。最后再分享一个小技巧调试完所有launch配置后记得把每台相机的序列号贴在物理设备上不然下次回来插线顺序一变你根本分不清哪台是哪台。
返回列表