跳到主要内容
技术文档/奥比中光/在机器人中接入奥比中光深度相机(ROS 2)
奥比中光 / TECHNICAL WIKI

在机器人中接入奥比中光深度相机(ROS 2)

深度相机 / ROS 2

说明如何在 Ubuntu 与 ROS 2 环境中接入奥比中光深度相机:先确定驱动、ROS 2 发行版和设备启动文件,再完成驱动安装、数据流验证、RViz2 可视化、话题与坐标系确认,最后把相机正确挂接到机器人机体坐标系

ROS 2UbuntuRViz2TFPointCloud2ROS 2 Humble / Jazzy / Lyrical
在机器人中接入奥比中光深度相机(ROS 2)
02 / DOCUMENTATION

内容概述

ROS 2 Humble / Jazzy / Lyrical

本文说明如何在 Ubuntu 与 ROS 2 环境中接入奥比中光深度相机:先确定驱动、ROS 2 发行版和设备启动文件,再完成驱动安装、数据流验证、RViz2 可视化、话题与坐标系确认,最后把相机正确挂接到机器人机体坐标系。

示例以 Astra 2 为主。ROS 2 驱动、发行版、CPU 架构和相机型号必须相互匹配;正式部署前请以奥比中光官方仓库与当前设备固件的最新说明为准。

03 / DOCUMENTATION

基础知识

ROS 2 Humble / Jazzy / Lyrical

✅ 深度相机接入 ROS 2 的方式是使用 OrbbecSDK ROS2 Wrapper:它把 SDK 的取流能力封装成一个相机节点,按标准 ROS 2 消息发布图像、点云、IMU 与相机内参,机器人其余节点只需订阅话题。

✅ ROS 2 驱动与独立 SDK 是两个独立发行物。驱动包内已自带 SDK 运行库,按任务一安装过独立 SDK 的主机无需卸载,两者可以共存,但版本应保持一致。

04 / DOCUMENTATION

接入后的数据形态

ROS 2 Humble / Jazzy / Lyrical

相机节点启动后,数据以话题形式输出,各类数据分别对应不同的上层用途:

数据话题(默认命名空间 /camera)消息类型典型用途
深度图/camera/depth/image_rawsensor_msgs/msg/Image距离测量、避障、地面检测
彩色图/camera/color/image_rawsensor_msgs/msg/Image目标识别、可视化
红外图/camera/ir/image_rawsensor_msgs/msg/Image暗光成像、结构光散斑调试
点云/camera/depth/pointssensor_msgs/msg/PointCloud2三维感知、建图、抓取定位
IMU/camera/gyro_accel/samplesensor_msgs/msg/Imu运动估计、与视觉融合(仅具备 IMU 的型号有数据,见通用 02)
相机内参/camera/depth/camera_infosensor_msgs/msg/CameraInfo像素与三维坐标互相换算

完整话题清单、编码格式与坐标系定义见 通用 02 话题与坐标系。

05 / DOCUMENTATION

版本与发行版对应关系

ROS 2 Humble / Jazzy / Lyrical

驱动通过 GitHub Releases 发布预编译 deb 包,每个 zip 对应「一种 ROS 2 发行版 + 一种主机架构」:

项目取值说明
ROS 2 发行版Humble / Jazzy / Lyrical发行包覆盖这三种;Foxy 与 Rolling 需从源码构建
主机架构amd64 / arm64由主机决定,与相机型号无关

发布页的文件名为 orbbec-ros2-debs-<发行版>-<架构>.zip,解压后得到两个 deb:

代码块
纯文本
ros-<发行版>-orbbec-camera-msgs_<版本>_<架构>.deb   消息与服务定义ros-<发行版>-orbbec-camera_<版本>_<架构>.deb        相机节点本身

⚠️ 驱动版本应与任务一所用 SDK 版本对应(示例环境两者均为 v2.10.6)。主机上若已有版本不一致的独立 SDK,/usr/local/lib 下的库可能先于驱动自带的库被加载。

06 / DOCUMENTATION

型号与启动文件

ROS 2 Humble / Jazzy / Lyrical

每种型号对应一个启动文件,参数默认值按该型号的传感器能力设定。启动文件随 orbbec_camera 包安装,位于 share/orbbec_camera/launch/。

型号系列启动文件
Astra 2astra2.launch.py
Astra Mini Pro / Astra Mini S Proastra.launch.py
Gemini 2 / Gemini 2 Lgemini2.launch.py / gemini2L.launch.py
Gemini 210 / 215gemini210.launch.py
Gemini 301 系列(305 / 305g)gemini_301_series.launch.py
Gemini 330 系列gemini_330_series.launch.py
Gemini 340 系列gemini345.launch.py / gemini345_lg.launch.py
Gemini 430 系列gemini435_le.launch.py
Femto Boltfemto_bolt.launch.py
Femto Mega / Femto Mega Ifemto_mega.launch.py
DaBai 系列dabai_a.launch.py 等对应型号文件
LiDAR 系列lidar.launch.py

示例环境(Astra 2)使用 astra2.launch.py。型号不在上表时,可在 share/orbbec_camera/launch/ 目录中按型号名查找。

07 / DOCUMENTATION

环境要求

ROS 2 Humble / Jazzy / Lyrical

项目要求
操作系统Ubuntu;x64 平台已验证 Ubuntu 22.04
ROS 2已安装且能 source 对应发行版的 setup.bash
架构amd64 或 arm64
磁盘驱动与依赖约占数百 MB
权限不需要 sudo 运行节点(由 udev 规则授予设备访问权限)

⚠️ ARM64 的支持范围:受支持的 ARM64 平台为 NVIDIA Jetson 系列。其他 ARM64 平台在架构上可以安装 arm64 包,但不在受支持平台列表内,兼容性需自行验证。

08 / DOCUMENTATION

环境准备与驱动安装

ROS 2 Humble / Jazzy / Lyrical

✅ 驱动以预编译 deb 形式发布:按「ROS 2 发行版 + 主机架构」取一个压缩包,解压后安装其中的两个 deb,不需要编译。

✅ 安装包自带 udev 规则与 SDK 运行库,节点以普通用户运行即可,不需要 sudo。

09 / DOCUMENTATION

系统要求

ROS 2 Humble / Jazzy / Lyrical

项目要求
操作系统Ubuntu;x64 平台已验证 Ubuntu 22.04
ROS 2Humble / Jazzy / Lyrical(发行包覆盖这三种)
主机架构amd64 或 arm64
磁盘空间驱动与依赖合计数百 MB

⚠️ ARM64 的支持范围:受支持的 ARM64 平台为 NVIDIA Jetson 系列。其他 ARM64 平台在架构上可以安装 arm64 包,但不在受支持平台列表内,兼容性需自行验证。

10 / DOCUMENTATION

安装 ROS 2

ROS 2 Humble / Jazzy / Lyrical

机器上已有可用的 ROS 2 时,跳过本节。未安装时按 ROS 2 Ubuntu 安装说明 安装桌面版(含 RViz2,用于后续查看图像与点云):

代码块
Bash
sudo apt install ros-<ROS 发行版>-desktop

安装完成后,每个终端使用前都需要 source 环境:

代码块
Bash
source /opt/ros/<ROS 发行版>/setup.bash

建议把该命令写入 ~/.bashrc,避免每次手动执行。

11 / DOCUMENTATION

下载驱动

ROS 2 Humble / Jazzy / Lyrical

驱动发布页:OrbbecSDK_ROS2 Releases。国内网络可改用 Gitee 镜像。

发布页的 Windows 无关,Linux 包统一命名为 orbbec-ros2-debs-<发行版>-<架构>.zip,一个压缩包对应一种发行版与一种架构的组合:

文件适用环境
orbbec-ros2-debs-humble-amd64.zipHumble · x64
orbbec-ros2-debs-humble-arm64.zipHumble · ARM64
orbbec-ros2-debs-jazzy-amd64.zipJazzy · x64
orbbec-ros2-debs-jazzy-arm64.zipJazzy · ARM64
orbbec-ros2-debs-lyrical-amd64.zipLyrical · x64
orbbec-ros2-debs-lyrical-arm64.zipLyrical · ARM64

✅ 按上表的两个字段(发行版、架构)即可唯一确定应下载的文件。发行版用 printenv ROS_DISTRO 确认,架构用 uname -m 确认(x86_64 对应 amd64,aarch64 对应 arm64)。

若所用 ROS 2 发行版的软件源中已收录该驱动(apt list | grep orbbec 可确认),也可直接用系统包管理器安装。发行包版本通常落后于 Releases 的最新版,需要最新功能时仍以 Releases 为准。

下载后解压:

代码块
Bash
unzip orbbec-ros2-debs-<发行版>-<架构>.zip -d orbbec_ros2ls orbbec_ros2

解压结果包含两个文件:

代码块
纯文本
ros-<发行版>-orbbec-camera-msgs_<版本>_<架构>.debros-<发行版>-orbbec-camera_<版本>_<架构>.deb
12 / DOCUMENTATION

安装依赖与驱动

ROS 2 Humble / Jazzy / Lyrical

先装驱动所需的系统与 ROS 依赖:

代码块
Bash
sudo apt install -y libgflags-dev libgoogle-glog-dev nlohmann-json3-dev   ros-<ROS 发行版>-image-transport ros-<ROS 发行版>-image-transport-plugins   ros-<ROS 发行版>-compressed-image-transport ros-<ROS 发行版>-image-publisher   ros-<ROS 发行版>-camera-info-manager ros-<ROS 发行版>-diagnostic-updater   ros-<ROS 发行版>-diagnostic-msgs ros-<ROS 发行版>-statistics-msgs   ros-<ROS 发行版>-backward-ros ros-<ROS 发行版>-xacrosudo apt install -y libdw-dev libssl-dev python3-tabulate

再安装两个 deb:

代码块
Bash
cd orbbec_ros2sudo dpkg -i ros-<发行版>-orbbec-camera-msgs_<版本>_<架构>.deb              ros-<发行版>-orbbec-camera_<版本>_<架构>.deb

⚠️ 若 dpkg 提示依赖未满足,执行 sudo apt-get install -f 补齐依赖后再确认包状态:

代码块
Bash
dpkg -l | grep orbbec

两行状态应为 ii。

需要在机器人 URDF 中引用相机模型时,再安装机型描述包:

代码块
Bash
sudo apt install -y ros-<ROS 发行版>-orbbec-description

该包提供 share/orbbec_description/urdf/ 下各型号的 xacro 模型与网格文件,用法见 通用 03 第 1 节。

安装后的文件位置(以 ROS 2 安装根目录 /opt/ros/<ROS 发行版>/ 为基准):

路径内容
share/orbbec_camera/launch/各型号的启动文件
share/orbbec_camera/config/参数配置文件
share/orbbec_camera/udev/udev 规则源文件
share/orbbec_camera/examples/示例代码
lib/orbbec_camera/节点与工具的可执行文件(orbbec_camera_node、list_devices_node 等)
lib/liborbbec_camera.so相机节点插件
lib/libOrbbecSDK.so.<版本>驱动自带的 SDK 运行库
lib/extensions/深度引擎与后处理扩展库

查询本机实际安装的全部文件:

代码块
Bash
dpkg -L ros-<ROS 发行版>-orbbec-camera | less

⚠️ 上述路径属于 ROS 2 的安装根目录,与任务一安装的独立 SDK(/opt/OrbbecSDK_<版本>/)是两套独立的目录结构,两者互不替代。

13 / DOCUMENTATION

设备权限(udev 规则)

ROS 2 Humble / Jazzy / Lyrical

Linux 下访问 USB 设备需要权限规则,否则打开设备会失败、只能用 sudo 运行节点。安装包会把规则文件安装到系统目录:

代码块
纯文本
/etc/udev/rules.d/99-obsensor-libusb.rules

规则对已连接的设备需要重新触发才能生效,重新插拔相机也可以:

代码块
Bash
sudo udevadm control --reload-rules && sudo udevadm trigger

确认规则文件存在:

代码块
Bash
ls /etc/udev/rules.d/ | grep obsensor
14 / DOCUMENTATION

验证设备识别

ROS 2 Humble / Jazzy / Lyrical

代码块
Bash
source /opt/ros/<ROS 发行版>/setup.bashros2 run orbbec_camera list_devices_node

正常输出示例:

代码块
纯文本
[INFO] [...] [list_device_node]: name: Orbbec Astra2[INFO] [...] [list_device_node]: pid: 0x0660[INFO] [...] [list_device_node]: serial: <序列号>[INFO] [...] [list_device_node]: connection: USB3.0[INFO] [...] [list_device_node]: firmware version: <固件版本>[INFO] [...] [list_device_node]: usb port: <端口号>

connection 应为 USB3.0。若显示 USB2.0,深度图的分辨率与帧率将受限,应改用 USB 3.0 端口与线材。

⚠️ 列表为空时,依次检查:相机是否插在 USB 3.0 端口、lsusb 是否能看到设备、udev 规则是否生效(见第 5 节)。lsusb 看不到设备属于硬件连接问题,与驱动无关。

15 / DOCUMENTATION

从源码构建(发行版不在发行包覆盖范围时)

ROS 2 Humble / Jazzy / Lyrical

发行包只覆盖 Humble / Jazzy / Lyrical。使用 Foxy、Rolling 或需要修改驱动代码时,从源码构建:

代码块
Bash
mkdir -p ~/ros2_ws/srccd ~/ros2_ws/srcgit clone https://github.com/orbbec/OrbbecSDK_ROS2.gitcd OrbbecSDK_ROS2 && git checkout v2-maincd ~/ros2_wscolcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Releasesource install/setup.bash

源码构建方式下,udev 规则需手动安装:

代码块
Bash
sudo bash ~/ros2_ws/src/OrbbecSDK_ROS2/orbbec_camera/scripts/install_udev_rules.sh

⚠️ 源码构建使用 v2-main 分支;main 分支对应 SDK v1 世代,仅用于 v2 已不支持的旧型号。

16 / DOCUMENTATION

启动与查看数据流

ROS 2 Humble / Jazzy / Lyrical

✅ 启动只需一条命令:ros2 launch orbbec_camera astra2.launch.py;型号与启动文件的对应关系见 通用 01 第 3 节。

✅ 查看数据用 RViz2:加 Image 显示订阅 /camera/color/image_raw 与 /camera/depth/image_raw,加 PointCloud2 显示订阅 /camera/depth/points。

17 / DOCUMENTATION

启动相机节点

ROS 2 Humble / Jazzy / Lyrical

代码块
Bash
source /opt/ros/<ROS 发行版>/setup.bashros2 launch orbbec_camera astra2.launch.py

启动过程约需两秒,日志中的关键行如下:

代码块
纯文本
[camera.camera]: Device Orbbec Astra 2 connected[camera.camera]: Serial number: <序列号>[camera.camera]: Firmware version: <固件版本>[camera.camera]: ROS Wrapper version: <驱动版本>[camera.camera]: SDK version: <SDK 版本>[camera.camera]: usb connect type: USB3.0[camera.camera]: depth Frame - Width: 800 Height: 600 fps: 30 Format: Y16[camera.camera]: ir Frame - Width: 800 Height: 600 fps: 30 Format: Y8[camera.camera]: color Frame - Width: 1280 Height: 720 fps: 30 Format: MJPG[camera.camera]: Initialize device cost: <毫秒数> ms

三行 Frame - Width … 表示各路流已按该分辨率与格式启动。出现这三行即可进入下一步;若缺少某一路,检查启动参数中对应的 enable_* 与分辨率是否落在设备支持的组合内。

18 / DOCUMENTATION

确认数据流

ROS 2 Humble / Jazzy / Lyrical

新开一个终端(同样先 source),逐项确认:

代码块
Bash
ros2 topic listros2 topic hz /camera/depth/image_rawros2 topic hz /camera/color/image_raw

ros2 topic hz 会输出统计帧率;统计需要等待数帧,中途没有输出属正常。

查看节点自报的各流帧率、延迟与订阅者状态:

代码块
Bash
ros2 topic echo /camera/device_status --once

其中每路流的 publish_rate_hz 为该流最近的实际发布频率,delay_ms_avg 为平均延迟。设备在线状态由 device_online 给出。

19 / DOCUMENTATION

在 RViz2 中查看

ROS 2 Humble / Jazzy / Lyrical

代码块
Bash
rviz2

在 RViz2 中依次添加显示项:

显示类型话题看到的内容
Image/camera/color/image_raw彩色图像
Image/camera/depth/image_raw深度图(默认按原始 16 位显示,灰度随距离变化)
PointCloud2/camera/depth/points由深度图生成的三维点云
Image/camera/ir/image_raw红外图像

PointCloud2 的 Size (m) 调小到 0.01 左右、Style 选 Points 更容易观察。

RViz2 中的点云显示
RViz2 中的点云显示

图为 PointCloud2 显示 /camera/depth/points 的效果:Fixed Frame 设为 camera_depth_optical_frame,Color Transformer 设为 AxisColor、Axis 设为 Z,颜色随深度变化(近处偏红、远处偏蓝)。画面左侧 Displays 中的 Global Status: Ok 表示 TF 与话题均正常。

⚠️ Global Options → Fixed Frame 必须与消息的 frame_id 属于同一棵 TF 树。只看相机数据时设为 camera_depth_optical_frame 即可;若设为 base_link 而尚未发布机体到相机的变换,RViz2 会提示 No transform from ...,此时按 通用 03 第 1 节 补静态变换。

轻量查看单路图像也可用 rqt_image_view(需先安装):

代码块
Bash
sudo apt install ros-<ROS 发行版>-rqt-image-viewros2 run rqt_image_view rqt_image_view /camera/depth/image_raw
rqt_image_view 中的深度图
rqt_image_view 中的深度图

图为 rqt_image_view 订阅 /camera/depth/image_raw 的效果:窗口顶部下拉框为当前话题,深色区域为有效深度(灰度随距离变化),黑色为无效值。深度图以原始 16 位灰度显示,不做伪彩色映射。

20 / DOCUMENTATION

常用启动参数

ROS 2 Humble / Jazzy / Lyrical

参数在启动命令后以 名称:=值 形式覆盖,可叠加多个。示例环境(Astra 2)的默认值如下:

参数默认值说明
camera_namecamera话题命名空间
serial_number空多相机时指定设备
enable_depth / enable_color / enable_irtrue各路流开关
depth_width / depth_height / depth_fps800 / 600 / 30深度流参数
color_width / color_height / color_fps1280 / 720 / 30彩色流参数
color_formatMJPG彩色采集格式
ir_width / ir_height / ir_fps800 / 600 / 30红外流参数
enable_point_cloudtrue是否生成点云
enable_colored_point_cloudfalse是否生成彩色点云
depth_registrationfalse深度是否注册到彩色帧
publish_tftrue是否发布相机内部 TF
color_frame_queue_max_frames1彩色帧队列长度
uvc_backendlibuvc采集后端
time_domainglobal时间戳基准

只保留深度流并降低分辨率:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py   enable_color:=false enable_ir:=false   depth_width:=400 depth_height:=300 depth_fps:=15

为相机改名(多相机场景):

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py camera_name:=camera_front

参数完整的取值与含义可用以下命令查看:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py --show-args
21 / DOCUMENTATION

深度滤波

ROS 2 Humble / Jazzy / Lyrical

深度图常出现空洞(黑色区域)、边缘飞点或帧间抖动,由深度后处理滤波器处理。启动文件已为各滤波器定义了参数,默认多数关闭,仅噪声去除默认开启。

参数默认值作用
enable_noise_removal_filtertrue去除离散噪声点;noise_removal_filter_min_diff 与 noise_removal_filter_max_size 控制判定阈值与邻域范围
enable_spatial_filterfalse空间滤波,平滑单帧图像,减少边缘飞点;参数 spatial_filter_alpha spatial_filter_diff_threshold spatial_filter_magnitude spatial_filter_radius
enable_temporal_filterfalse时域滤波,抑制帧间抖动;参数 temporal_filter_diff_threshold temporal_filter_weight
enable_hole_filling_filterfalse填补深度空洞;参数 hole_filling_filter_mode
enable_threshold_filterfalse按距离阈值裁剪;参数 threshold_filter_min / threshold_filter_max
enable_decimation_filterfalse降采样,降低数据量;参数 decimation_filter_scale

示例:为近距离抓取场景打开时域滤波与空洞填补:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py   enable_temporal_filter:=true enable_hole_filling_filter:=true

⚠️ 滤波器在深度流上逐帧运算,全部开启会增加主机负载;参数取 -1 或空值时表示沿用设备当前值,而非关闭滤波器。各滤波器的完整参数与算法说明见驱动文档的深度过滤器章节。

22 / DOCUMENTATION

停止与重启

ROS 2 Humble / Jazzy / Lyrical

在启动节点的终端按 Ctrl+C 正常退出。节点会释放设备,之后可立即重新启动。

⚠️ 若进程被强制结束(kill -9、终端异常关闭),UVC 设备可能处于残留状态,再次启动时话题存在但始终收不到数据。此时重新插拔相机(或对 USB 端口执行复位)后再启动即可恢复。

23 / DOCUMENTATION

故障处理

ROS 2 Humble / Jazzy / Lyrical

现象原因与处理
启动报找不到设备 / 设备数为 0相机未接在 USB 3.0 端口、线材不支持 USB 3.0,或 udev 规则未生效;先 lsusb 确认设备存在
启动报参数不支持 / profile 无效分辨率、帧率或格式不在设备支持列表内;用 ros2 run orbbec_camera list_camera_profile_mode_node 查询
话题存在但收不到数据上次进程异常退出导致设备残留;按第 5 节重新插拔后重启
启动瞬间出现 Color frame queue overflow首帧到达速度超过队列长度(默认 1 帧),属启动瞬态;持续出现时降低分辨率或帧率
RViz2 报 No transformFixed Frame 与消息坐标系不在同一 TF 树;改 Fixed Frame 或补机体到相机的静态变换
RViz2 中点云不显示未开启 enable_point_cloud,或 Size (m) 过大;同时确认 Fixed Frame 正确
CPU 占用过高关闭不用的流、降低分辨率或帧率、关闭点云输出(见 通用 03 第 3 节)
深度图大面积空白场景超出量程、表面反光或过暗;0 为无效值属正常现象
24 / DOCUMENTATION

话题与坐标系

ROS 2 Humble / Jazzy / Lyrical

✅ 相机节点默认以 /camera 为命名空间发布深度、彩色、红外三路图像,外加点云、内参与状态话题;图像话题仅在对应流使能时发布,IMU 话题仅在实际具备 IMU 的型号上产生数据。

✅ 深度图编码为 16UC1,单位毫米,像素值 0 表示无效(超量程或无回波),不需要再乘比例系数。

25 / DOCUMENTATION

话题清单

ROS 2 Humble / Jazzy / Lyrical

相机节点在默认命名空间 /camera 下的话题:

话题类型内容
/camera/depth/image_rawsensor_msgs/msg/Image深度图,16UC1,毫米
/camera/depth/camera_infosensor_msgs/msg/CameraInfo深度相机内参与畸变模型
/camera/depth/pointssensor_msgs/msg/PointCloud2由深度图生成的点云(需 enable_point_cloud)
/camera/color/image_rawsensor_msgs/msg/Image彩色图,rgb8
/camera/color/image_raw/compressedsensor_msgs/msg/CompressedImage彩色压缩流(随发布插件使能出现)
/camera/color/camera_infosensor_msgs/msg/CameraInfo彩色相机内参
/camera/ir/image_rawsensor_msgs/msg/Image红外图,mono8
/camera/ir/camera_infosensor_msgs/msg/CameraInfo红外相机内参
/camera/gyro_accel/samplesensor_msgs/msg/Imu陀螺仪与加速度计融合输出
/camera/accel/imu_infoorbbec_camera_msgs/msg/IMUInfo加速度计标定参数
/camera/gyro/imu_infoorbbec_camera_msgs/msg/IMUInfo陀螺仪标定参数
/camera/device_statusorbbec_camera_msgs/msg/DeviceStatus设备在线状态与各流实际发布帧率
/camera/depth_filters/statusorbbec_camera_msgs/msg/DepthFiltersStatus深度后处理滤波器状态
/tf /tf_statictf2_msgs/msg/TFMessage相机内部坐标系变换

⚠️ 未使能的流不会发布对应话题。例如关闭红外流后,/camera/ir/image_raw 不再出现,依赖它的订阅端会一直等不到数据。

⚠️ IMU 话题只在实际具备 IMU 的型号上产生数据:节点会为 IMU 相关话题建立发布者,但设备没有对应传感器时不会有消息。示例设备 Astra 2 的传感器只有深度、彩色、红外三路(可用 ros2 run orbbec_camera list_camera_profile_mode_node 确认),其 IMU 话题始终为空。具备 IMU 的型号需同时开启对应流:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py enable_accel:=true enable_gyro:=true
26 / DOCUMENTATION

图像编码与取值

ROS 2 Humble / Jazzy / Lyrical

流编码典型分辨率取值含义
深度16UC1800 × 600每像素 16 位无符号整数,单位毫米;0 为无效值
彩色rgb81280 × 720三通道 8 位;设备侧为 MJPG 时由驱动解码后发布
红外mono8800 × 600单通道 8 位灰度

深度值的读取方式(C++):

代码块
C++
auto depth = msg->data;                       // sensor_msgs::msg::Image::_data_typeuint16_t d = depth[row * width + col];        // 单位:毫米,0 表示无效

Python 侧建议用 numpy.frombuffer 转为 uint16 数组后按二维索引访问,避免逐像素处理带来的开销。

⚠️ 彩色图默认以 MJPG 采集、在主机侧解码为 rgb8 后发布。带宽允许时也可将 color_format 设为 YUYV 或 RGB,省去解码开销,但占用更高。

27 / DOCUMENTATION

相机内参

ROS 2 Humble / Jazzy / Lyrical

camera_info 提供该流的内参与畸变模型,用于像素坐标与相机三维坐标互算:

字段含义
k3 × 3 内参矩阵,包含焦距 fx fy 与主点 cx cy
d畸变系数;模型由 distortion_model 给出
distortion_model示例设备的深度流为 rational_polynomial
frame_id与该流图像一致的坐标系名,如 camera_depth_optical_frame

反投影公式(深度图,单位毫米→米):

代码块
纯文本
Z = 深度像素值 / 1000X = (u - cx) * Z / fxY = (v - cy) * Z / fy
28 / DOCUMENTATION

坐标系与 TF

ROS 2 Humble / Jazzy / Lyrical

节点默认发布相机内部各传感器之间的静态变换(publish_tf 默认开启)。坐标系分两类:

类型示例轴向约定
机体坐标系camera_depth_frame、camera_color_frameROS 约定:X 向前、Y 向左、Z 向上
光学坐标系camera_depth_optical_frame、camera_color_optical_frame相机约定:Z 向前(光轴)、X 向右、Y 向下

图像与点云消息的 frame_id 均为光学坐标系。相机节点默认发布的坐标系包括:

代码块
纯文本
camera_depth_frame ─┬─ camera_depth_optical_frame                    ├─ camera_ir_frame ── camera_ir_optical_frame                    ├─ camera_color_frame ── camera_color_optical_frame                    ├─ camera_accel_frame ── camera_accel_optical_frame                    └─ camera_gyro_frame ── camera_gyro_optical_frame

⚠️ 这些是相机内部的坐标系,根节点 camera_depth_frame 与机器人机体之间没有变换。接入机器人时必须补一条机体到相机的静态变换,否则 RViz2 中会报 No transform from [camera_depth_optical_frame] to [base_link]。做法见 通用 03 机器人集成要点。

29 / DOCUMENTATION

话题与坐标系 · QoS

ROS 2 Humble / Jazzy / Lyrical

图像话题的默认 QoS 为 RELIABLE / VOLATILE / KEEP_LAST(10)。订阅端使用 ROS 2 默认 QoS 即可匹配;若订阅端显式改为 BEST_EFFORT,与 RELIABLE 发布端仍可通信,但反向不成立。

30 / DOCUMENTATION

服务接口

ROS 2 Humble / Jazzy / Lyrical

除话题外,节点还提供服务用于查询与控制。常用服务:

服务作用
/camera/get_device_info查询型号、序列号、固件版本、SDK 版本
/camera/get_sdk_version查询当前 SDK 版本
/camera/get_streams_enable查询各流使能状态
/camera/set_color_exposure / /camera/set_color_gain设置彩色曝光与增益
/camera/set_depth_exposure / /camera/set_depth_gain设置深度曝光与增益
/camera/set_color_flip / /camera/set_depth_flip翻转图像
/camera/set_color_rotation / /camera/set_depth_rotation旋转图像
/camera/save_images保存当前帧到磁盘
/camera/save_point_cloud保存当前点云
/camera/set_bag_recording开始或停止设备级录制
/camera/send_software_trigger软触发一次采集
/camera/reboot_device重启设备

查询设备信息:

代码块
Bash
ros2 service call /camera/get_device_info orbbec_camera_msgs/srv/GetDeviceInfo '{}'

完整服务列表用 ros2 service list | grep -v parameters 查看。

31 / DOCUMENTATION

最小订阅示例

ROS 2 Humble / Jazzy / Lyrical

以下为一个可直接运行的 Python 示例:订阅深度图,取画面中心区域,输出其中的最小与最大有效距离。示例仅用于说明数据如何取出,不涉及具体业务逻辑。

代码块
Python
# depth_probe.py —— 读取深度图中心区域的有效距离范围import rclpyfrom rclpy.node import Nodefrom rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicyfrom sensor_msgs.msg import Imageimport numpy as np

class DepthProbe(Node):    def __init__(self):        super().__init__("depth_probe")        qos = QoSProfile(depth=10, reliability=ReliabilityPolicy.RELIABLE,                         history=HistoryPolicy.KEEP_LAST)        self.create_subscription(Image, "/camera/depth/image_raw", self.on_image, qos)        self.count = 0        self.done = False
    def on_image(self, msg):        self.count += 1        if self.count <= 5:          # 跳过启动初期的前几帧            return        # 深度图为 16UC1,按行宽还原成二维数组,取值单位毫米        depth = np.frombuffer(msg.data, dtype=np.uint16).reshape(msg.height, msg.width)        h, w = depth.shape        roi = depth[h // 3: h * 2 // 3, w // 3: w * 2 // 3]   # 画面中心 1/3 区域        valid = roi[roi > 0]         # 0 为无效像素        if valid.size:            print("有效像素 %d 个,最小距离 %d mm,最大距离 %d mm"                  % (valid.size, valid.min(), valid.max()))        else:            print("该区域内没有有效深度值")        self.done = True

def main():    rclpy.init()    node = DepthProbe()    while rclpy.ok() and not node.done:        rclpy.spin_once(node, timeout_sec=0.5)    node.destroy_node()    rclpy.shutdown()

if __name__ == "__main__":    main()

启动相机节点后运行:

代码块
Bash
python3 depth_probe.py

输出示例:

代码块
纯文本
有效像素 49275 个,最小距离 1679 mm,最大距离 3695 mm

要点:

位置说明
QoSProfile与发布端的 RELIABLE / KEEP_LAST(10) 保持一致
np.frombuffer(...).reshape(h, w)深度数据是一维字节流,需按 height × width 还原
dtype=np.uint16对应 16UC1;彩色图应改用 uint8 并按三通道还原
roi > 0过滤无效像素,避免 0 值参与统计
32 / DOCUMENTATION

常用调试命令

ROS 2 Humble / Jazzy / Lyrical

目的命令
列出话题ros2 topic list
查看某路实际帧率ros2 topic hz /camera/depth/image_raw
查看消息结构ros2 topic echo /camera/depth/camera_info --once
查看带宽ros2 topic bw /camera/depth/image_raw
查看各流帧率与延迟ros2 topic echo /camera/device_status --once
录制数据ros2 bag record -o <目录> /camera/depth/image_raw /camera/color/image_raw
查看节点与参数ros2 node list · ros2 param list /camera/camera

⚠️ ros2 topic hz 与 ros2 topic echo 依赖订阅端,第一次统计需要等待数帧。同时运行多个订阅端会增加主机负载,排查结束后应及时关闭。

33 / DOCUMENTATION

机器人集成要点

ROS 2 Humble / Jazzy / Lyrical

✅ 接入机器人的三个要点:发布机体到相机的静态 TF、按任务选择点云或图像的深度形态、控制分辨率与流数以约束 CPU 与带宽占用。

34 / DOCUMENTATION

机体到相机的静态变换

ROS 2 Humble / Jazzy / Lyrical

相机节点发布的根坐标系是 camera_depth_frame,它对应相机外壳的几何原点。要让机器人其他节点能用这份数据,必须从机体 base_link 补一条静态变换直接指向它:

代码块
Bash
ros2 run tf2_ros static_transform_publisher   --frame-id base_link --child-frame-id camera_depth_frame   --x 0.15 --y 0.0 --z 0.08 --qx 0 --qy 0 --qz 0 --qw 1

若机器人已有 URDF 模型,也可以把相机作为一个固定连接的部件写进模型,再让模型的相机基座与 camera_depth_frame 对齐:

代码块
纯文本
<link name="camera_link"/><joint name="camera_joint" type="fixed">  <parent link="base_link"/>  <child link="camera_link"/>  <origin xyz="0.15 0 0.08" rpy="0 0 0"/></joint>

使用 orbbec_description 包中的型号模型(Astra 2 对应 urdf/astra_2.urdf.xacro)时,模型的根坐标系为 camera_link,其下已包含与驱动一致的 camera_depth_frame、camera_color_frame 等坐标系。只需把 camera_link 固定连接到机体即可,无需再补内部变换。

⚠️ 平移与旋转取值对应相机的实际安装位置与朝向,务必量测后填入,否则点云在机体坐标系中会整体偏移。

35 / DOCUMENTATION

深度图与彩色图的帧对齐

ROS 2 Humble / Jazzy / Lyrical

深度流与彩色流属于不同的光学坐标系,两者之间有固定的外参。若要直接读取彩色图与深度图同一像素位置,可在启动时开启深度到彩色的对齐(参数 depth_registration、align_mode、enable_d2c_viewer,见 Ubuntu平台 / 02)。对齐后图像与点云使用彩色相机坐标系。

在不对齐的情况下,深度图与彩色图按同样的像素坐标读取时,不指向同一空间点。

36 / DOCUMENTATION

数据形态选择

ROS 2 Humble / Jazzy / Lyrical

任务首选数据原因
避障、距离检测深度图直接订阅,或 depth/points 点云点云更直观、可在 RViz2 直接看,但更耗带宽
目标检测、语义分割彩色图颜色与纹理信息完整
建图、抓取、位姿估计点云 depth/points 或彩色点云需要三维几何
暗光环境成像红外图红外指令存在时适用

点云是按需生成的:默认 enable_point_cloud:=true,若机器人自研节点不需要三维点,可关闭以节省 CPU 与带宽:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py enable_point_cloud:=false

彩色点云(深度注册到彩色帧)由 enable_colored_point_cloud:=true 控制,生成开销高于普通点云,仅在确实需要带颜色点云时开启。

37 / DOCUMENTATION

分辨率、帧率与带宽

ROS 2 Humble / Jazzy / Lyrical

相机按启动参数输出指定分辨率与帧率。分辨率与帧率越高,占用的 USB 带宽、主机 CPU(解码、点云生成)与发布带宽越大。按算力调节的主要参数:

参数作用
depth_width / depth_height / depth_fps深度流分辨率与帧率
color_width / color_height / color_fps彩色流分辨率与帧率
ir_width / ir_height / ir_fps红外流分辨率与帧率
enable_depth / enable_color / enable_ir关闭不需要的流
color_formatMJPG(默认,省带宽)或 YUYV / RGB
enable_point_cloud关闭点云生成

示例:嵌入式主机上只保留避障所需的深度流,降低分辨率:

代码块
Bash
ros2 launch orbbec_camera astra2.launch.py   enable_color:=false enable_ir:=false   depth_width:=400 depth_height:=300 depth_fps:=15

⚠️ 流的分辨率与帧率必须在 list_camera_profile_mode_node 列出的组合内取值,否则节点启动失败。查询该产品支持的所有流组合:

代码块
Bash
ros2 run orbbec_camera list_camera_profile_mode_node
38 / DOCUMENTATION

其它机器人相关参数

ROS 2 Humble / Jazzy / Lyrical

参数取值 / 作用
camera_name命名空间;多相机时改为各自独立命名,避免话题冲突
serial_number多相机时指定具体设备;单相机可留空
usb_port多相机时指定设备所在 USB 端口
time_domainglobal 用系统时间戳,device 用设备时间戳
enable_frame_sync深度与彩色帧同步;同版本下按启动文件默认即可
publish_tf是否发布相机内部 TF(默认开启)

多相机场景的参数组织方式,见 驱动文档 的多相机章节。

39 / DOCUMENTATION

机器人开发流程建议

ROS 2 Humble / Jazzy / Lyrical

  1. 先在主机确认出图:跑通 Ubuntu平台 / 02 的 RViz2 查看流程,确认相机本身正常。
  2. 再接到机器人:把相机装到机器人、量测安装位姿,写入 URDF 静态变换。
  3. 调资源:用 ros2 topic hz 观察实际帧率,用 ros2 topic bw 观察带宽,必要时降分辨率、关点云。
  4. 写感知节点:订阅所需话题,按 通用 02 的编码与坐标系说明取数。
  5. 录制回归:用 ros2 bag record 录制一份数据,便于不接相机时离线调试与回放。
40 / SUPPORT

讨论、纠错与持续维护

Forum / GitHub / Community