RK3588 Ubuntu ROS2 开发环境配置

友善之臂

Posted by LXG on June 24, 2026

烧录和更新


sudo apt update
sudo apt upgrade -y
sudo reboot

查看内核版本


pi@NanoPi-R6C:~$ uname -a
Linux NanoPi-R6C 6.1.99 #56 SMP Thu Jun 12 15:43:53 CST 2025 aarch64 aarch64 aarch64 GNU/Linux

安装开发工具


sudo apt install -y git vim curl wget build-essential cmake python3-pip

安装ROS2

Ubuntu版本 推荐ROS版本 状态
Ubuntu 22.04 ROS2 Humble LTS
Ubuntu 22.04 ROS2 Iron 已停止维护
Ubuntu 22.04 ROS2 Jazzy 官方不支持

安装 ROS2 Humble

添加 ROS2 仓库


sudo apt update
sudo apt install software-properties-common curl -y

sudo add-apt-repository universe

添加 ROS key


sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
-o /usr/share/keyrings/ros-archive-keyring.gpg

# 国内网络下载失败处理
# 浏览器下载: https://raw.githubusercontent.com/ros/rosdistro/master/ros.key
# scp 命令传递给rk3588

lxg@lxg:~/Downloads$ scp ros.key pi@192.168.110.59:/home/pi


pi@NanoPi-R6C:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  ros.key
pi@NanoPi-R6C:~$ sudo cp ros.key /usr/share/keyrings/ros-archive-keyring.gpg
pi@NanoPi-R6C:~$ ls /usr/share/keyrings/ros-archive-keyring.gpg
/usr/share/keyrings/ros-archive-keyring.gpg

添加源


echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu \
$(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

更新和安装


sudo apt update

sudo apt install ros-humble-desktop -y

配置环境变量


echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

source ~/.bashrc

pi@NanoPi-R6C:~$ printenv | grep ROS
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=humble

深度相机

Orbbec Gemini 335 VS 336L

对比项 Orbbec Gemini 335 Orbbec Gemini 336L
定位 室内机器人、桌面建图、视觉AI 无人车、AGV、户外机器人
深度技术 双目立体视觉 + IR投射 双目立体视觉 + IR投射
基线长度 50 mm 95 mm
深度范围 0.26 ~ 10 m 0.25 ~ 20 m
最佳工作距离 0.3 ~ 3 m 0.3 ~ 6 m
2m深度精度 ≤1.5% ≤0.8%
RGB分辨率 1920×1080 @30fps 1280×800 @60fps
RGB快门 Rolling Shutter Global Shutter
深度分辨率 1280×800 1280×800
视场角(FOV) 87° × 58° 94° × 68°
户外抗阳光能力 一般 较强
运动场景表现 一般 优秀
SLAM建图效果 良好 优秀
视觉里程计(VIO) 可用 更稳定
RTAB-Map 可用 推荐
ORB-SLAM3 可用 推荐
ROS2支持 官方支持 官方支持
IP防护等级 IP5X IP65
工作温度 -10℃ ~ 45℃ -10℃ ~ 50℃
重量 97 g 133 g
体积 更小 更大
价格 较便宜 较贵
适合场景 室内小车、学习ROS 园区配送车、巡检机器人

下载 Orbbec SDK

OrbbecSDK_v2-Download


lxg@lxg:~/Downloads$ scp OrbbecSDK_v2.8.6_202604271452_6399409_linux_arm64.tar.gz pi@192.168.110.59:/home/pi

lxg@lxg:~/Downloads$ scp OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64.tar.gz  pi@192.168.110.59:/home/pi

pi@NanoPi-R6C:~/OrbbecCamera$ ls
OrbbecSDK_v2.8.6_202604271452_6399409_linux_arm64.tar.gz  OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64.tar.gz

pi@NanoPi-R6C:~/OrbbecCamera$ tar -zxvf OrbbecSDK_v2.8.6_202604271452_6399409_linux_arm64.tar.gz

pi@NanoPi-R6C:~/OrbbecCamera$ tar -zxvf OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64.tar.gz

配置相机权限


sudo vim /etc/udev/rules.d/99-orbbec.rules

# Orbbec Gemini 335
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0800", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0801", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0802", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0803", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0804", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0805", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0806", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0807", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0808", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0809", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080a", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080b", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080c", MODE="0666", GROUP="plugdev"

sudo udevadm control --reload-rules
sudo udevadm trigger

启动相机


pi@NanoPi-R6C:~/OrbbecCamera/OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64$ ./OrbbecViewer

监控CPU温度


sudo apt update
sudo apt install lm-sensors
sudo sensors-detect

watch -n 1 sensors

pi@NanoPi-R6C:~/OrbbecCamera/OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64$ watch -n 1 sensors
pi@NanoPi-R6C:~/OrbbecCamera/OrbbecViewer_v2.8.6_202604271453_db82a04_linux_arm64$ sensors
npu_thermal-virtual-0
Adapter: Virtual device
temp1:        +58.2°C  (crit = +115.0°C)

center_thermal-virtual-0
Adapter: Virtual device
temp1:        +57.3°C  (crit = +115.0°C)

bigcore1_thermal-virtual-0
Adapter: Virtual device
temp1:        +61.9°C  (crit = +115.0°C)

soc_thermal-virtual-0
Adapter: Virtual device
temp1:        +60.1°C  (crit = +115.0°C)

simple_vin-isa-0000
Adapter: ISA adapter
in0:          19.80 V  

gpu_thermal-virtual-0
Adapter: Virtual device
temp1:        +57.3°C  (crit = +115.0°C)

littlecore_thermal-virtual-0
Adapter: Virtual device
temp1:        +61.0°C  (crit = +115.0°C)

bigcore0_thermal-virtual-0
Adapter: Virtual device
temp1:        +61.9°C  (crit = +115.0°C)

温度总结

传感器 温度
CPU大核 61.9℃
CPU小核 61.0℃
GPU 57.3℃
NPU 58.2℃
SoC 60.1℃
中心温度 57.3℃

负载查看

rk3588_orbbec_htop

安装 rtabmap


sudo apt install \
ros-humble-rtabmap \
ros-humble-rtabmap-ros \
ros-humble-rtabmap-msgs

下一步就是把 Orbbec → ROS2 → RTAB-Map 这条链路打通

安装 Orbbec ROS驱动

OrbbecSDK ROS2 Wrapper v2

OrbbecSDK ROS2 Wrapper 提供 Orbbec 相机与 ROS 2 环境的无缝集成,支持 ROS2 Foxy、Humble 和 Jazzy 发行版。

初始化 rosdep


sudo apt install -y python3-colcon-common-extensions python3-rosdep python3-vcstool git build-essential

# 可能会卡住,更换镜像源
sudo rosdep init

# 直接使用清华源(推荐)

sudo mkdir -p /etc/ros/rosdep/sources.list.d

sudo vi /etc/ros/rosdep/sources.list.d/20-default.list

# 添加浏览器访问的https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list内容

rosdep update

20-default.list


# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx

# generic
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte

# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead

这是 rosdep 的配置文件,作用是告诉 rosdep update:去哪里下载依赖映射规则。

安装准备:环境配置与依赖项

安装依赖项:


sudo apt install libgflags-dev nlohmann-json3-dev \
ros-$ROS_DISTRO-image-transport ros-${ROS_DISTRO}-image-transport-plugins ros-${ROS_DISTRO}-compressed-image-transport \
ros-$ROS_DISTRO-image-publisher ros-$ROS_DISTRO-camera-info-manager \
ros-$ROS_DISTRO-diagnostic-updater ros-$ROS_DISTRO-diagnostic-msgs ros-$ROS_DISTRO-statistics-msgs ros-$ROS_DISTRO-xacro \
ros-$ROS_DISTRO-backward-ros libdw-dev libssl-dev mesa-utils libgl1 libgoogle-glog-dev

启用 ROS 2 自动补全:


eval "$(register-python-argcomplete3 ros2)"
eval "$(register-python-argcomplete3 colcon)"

方案 A :二进制直接安装(以 Humble 版本为例)

查看软件包


sudo apt update
apt list | grep orbbec

安装 OrbbecSDK ROS2 包:


sudo apt install ros-humble-orbbec-camera ros-humble-orbbec-description

方案 B:从源码构建(Source Build)

安装说明

下载源码


mkdir -p ~/ros2_ws/src

cd ~/ros2_ws/src

git clone https://gitee.com/orbbecdeveloper/OrbbecSDK_ROS2.git

# 国内网络: https://gitee.com/orbbecdeveloper/OrbbecSDK_ROS2.git

安装依赖


cd ~/ros2_ws

rosdep install --from-paths src --ignore-src -r -y

安装流程


rosdep install
      ↓
读取 package.xml
      ↓
发现依赖:
      eigen
      opencv
      yaml-cpp
      ↓
查询 base.yaml
      ↓
映射为:
      libeigen3-dev
      libopencv-dev
      libyaml-cpp-dev
      ↓
apt install

编译


cd ~/ros2_ws
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release

RK3588上编译缓慢问题

  1. 启用交换分区

# 1. 使用 dd 真正写入一个 4GB 的连续文件(这步在板子上可能需要几十秒,请耐心等待)
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

# 2. 设置权限
sudo chmod 600 /swapfile

# 3. 格式化为 swap
sudo mkswap /swapfile

# 4. 再次尝试启用
sudo swapon /swapfile

  1. 再次编译

sudo apt install ccache

sudo apt install ninja-build

colcon build --event-handlers console_direct+ \
  --parallel-workers 2 \
  --cmake-args \
    -G Ninja \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
    -DCMAKE_C_COMPILER_LAUNCHER=ccache \
    -DMAKE_ARGUMENTS="-j4"

Ubuntu 远程控制

打开板子的 Settings(设置) -> Sharing(共享) -> Remote Desktop(远程桌面)

ubuntu_sharing

在 Ubuntu 台式机上安装 Remmina


sudo apt install remmina remmina-plugin-rdp remmina-plugin-secret -y

打开Remmina

remmina_remote

remmina_login

注意: 域可以不用填写

启动相机ROS2节点

终端 1


# 检查相机是否已连接
ros2 run orbbec_camera list_devices_node

# 启动相机
ros2 launch orbbec_camera gemini_330_series.launch.py

pi@NanoPi-R6C:~/ros2_ws$ ros2 run orbbec_camera list_devices_node
USB port_id: 4-1-2
Modified USB port_id: 4-1
[INFO] [1782368685.010809277] [list_device_node]: - Name: Orbbec Gemini 336L, PID: 0x0807, SN/ID: CPC9363000F3, Connection: USB3.2
[INFO] [1782368685.010937908] [list_device_node]: serial: CPC9363000F3
[INFO] [1782368685.010992743] [list_device_node]: usb port: 4-1
[INFO] [1782368685.011023078] [list_device_node]: usb connect type: USB3.2

启动相机的日志


pi@NanoPi-R6C:~/ros2_ws$ ros2 launch orbbec_camera gemini_330_series.launch.py
[INFO] [launch]: All log files can be found below /home/pi/.ros/log/2026-06-25-14-25-51-826415-NanoPi-R6C-4422
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [component_container-1]: process started with pid [4435]
[component_container-1] [INFO] [1782368752.471640754] [camera.camera_container]: Load Library: /opt/ros/humble/lib/liborbbec_camera.so
[component_container-1] [INFO] [1782368752.593053569] [camera.camera_container]: Found class: rclcpp_components::NodeFactoryTemplate<orbbec_camera::OBCameraNodeDriver>
[component_container-1] [INFO] [1782368752.593118614] [camera.camera_container]: Instantiate class: rclcpp_components::NodeFactoryTemplate<orbbec_camera::OBCameraNodeDriver>
[component_container-1] [INFO] [1782368752.616365098] [camera.camera]: Device access mode: Default (4)
[component_container-1] [INFO] [1782368752.616439767] [camera.camera]: setUvcBackendType:libuvc
[component_container-1] [INFO] [1782368754.756469870] [camera.camera]: startDevice called
[INFO] [launch_ros.actions.load_composable_nodes]: Loaded node '/camera/camera' in container '/camera/camera_container'
[component_container-1] [INFO] [1782368754.766890705] [camera.camera]: Connecting to the default device
[component_container-1] [INFO] [1782368754.962551306] [camera.camera]: Select device cost 195 ms
[component_container-1] [INFO] [1782368754.962665936] [camera.camera]: Try to connect device via USB3.2
[component_container-1] [INFO] [1782368754.963019743] [camera.camera]: OBCameraNode: use_intra_process: OFF
[component_container-1] [INFO] [1782368754.976867521] [camera.camera]: current time domain: global
[component_container-1] [INFO] [1782368754.976968734] [camera.camera]: hdr_index1_laser_control_ 1 hdr_index1_depth_exposure_ 1 hdr_index1_depth_gain_ 16 hdr_index1_ir_brightness_ 30 hdr_index1_ir_ae_max_exposure_ 30458
[component_container-1] 
[component_container-1] [INFO] [1782368754.976994402] [camera.camera]: hdr_index0_laser_control_ 1 hdr_index0_depth_exposure_ 7500 hdr_index0_depth_gain_ 16 hdr_index0_ir_brightness_ 90 hdr_index0_ir_ae_max_exposure_ 30458
[component_container-1] 
[component_container-1] [INFO] [1782368754.977012778] [camera.camera]: laser_index1_laser_control_ 0 laser_index1_depth_exposure_ 3000 laser_index1_depth_gain_ 16 laser_index1_ir_brightness_ 60 laser_index1_ir_ae_max_exposure_ 17000
[component_container-1] 
[component_container-1] [INFO] [1782368754.977029112] [camera.camera]: laser_index0_laser_control_ 1 laser_index0_depth_exposure_ 3000 laser_index0_depth_gain_ 16 laser_index0_ir_brightness_ 60 laser_index0_ir_ae_max_exposure_ 30000
[component_container-1] 
[component_container-1] [INFO] [1782368754.977055363] [camera.camera]: Available presets:
[component_container-1] [INFO] [1782368754.977113991] [camera.camera]: Preset 0: Default
[component_container-1] [INFO] [1782368754.977134992] [camera.camera]: Preset 1: AMR with IR-Pass
[component_container-1] [INFO] [1782368754.977153951] [camera.camera]: Preset 2: High Accuracy
[component_container-1] [INFO] [1782368754.977169701] [camera.camera]: Preset 3: Factory Calib
[component_container-1] [INFO] [1782368754.977184285] [camera.camera]: Preset 4: Custom
[component_container-1] [INFO] [1782368754.977199161] [camera.camera]: Load device preset: Default
[component_container-1] [INFO] [1782368754.977245246] [camera.camera]: Device preset Default loaded
[component_container-1] [INFO] [1782368755.228774195] [camera.camera]: Setting heartbeat to OFF
[component_container-1] [INFO] [1782368755.229424932] [camera.camera]: Depth process is HW
[component_container-1] [INFO] [1782368755.229460809] [camera.camera]: Setting LDP to ON
[component_container-1] [INFO] [1782368755.231488273] [camera.camera]: Setting G300 laser control to 1
[component_container-1] [INFO] [1782368755.231760702] [camera.camera]: Current sync mode: OB_MULTI_DEVICE_SYNC_MODE_STANDALONE
[component_container-1] [INFO] [1782368755.232722078] [camera.camera]: Set sync mode: OB_MULTI_DEVICE_SYNC_MODE_STANDALONE
[component_container-1] [INFO] [1782368755.232749204] [camera.camera]: Setting color mirror to OFF
[component_container-1] [INFO] [1782368755.232801123] [camera.camera]: Setting color flip to OFF
[component_container-1] [INFO] [1782368755.232821249] [camera.camera]: Setting depth mirror to OFF
[component_container-1] [INFO] [1782368755.232839333] [camera.camera]: Setting depth flip to OFF
[component_container-1] [INFO] [1782368755.232862376] [camera.camera]: Setting noise removal filter:ON
[component_container-1] [INFO] [1782368755.232876376] [camera.camera]: Setting color auto white balance to ON
[component_container-1] [INFO] [1782368755.233099803] [camera.camera]: Setting color auto exposure priority to OFF
[component_container-1] [INFO] [1782368755.233212391] [camera.camera]: Setting color auto exposure to ON
[component_container-1] [INFO] [1782368755.233499112] [camera.camera]: Setting depth auto exposure priority to OFF
[component_container-1] [INFO] [1782368755.233724289] [camera.camera]: Setting IR auto exposure to ON
[component_container-1] [INFO] [1782368755.235937845] [camera.camera]: default noise removal filter min diff: 256
[component_container-1] [INFO] [1782368755.235960888] [camera.camera]: default noise removal filter max size: 80
[component_container-1] [INFO] [1782368755.236170605] [camera.camera]: Setting hardware noise removal filter:OFF
[component_container-1] [INFO] [1782368755.236187523] [camera.camera]: Setting accel data correction to ON
[component_container-1] [INFO] [1782368755.236205315] [camera.camera]: Setting gyro data correction to ON
[component_container-1] [INFO] [1782368755.236579832] [camera.camera]: Setting DecimationFilter......
[component_container-1] [INFO] [1782368755.236607541] [camera.camera]: set DecimationFilter to false
[component_container-1] [INFO] [1782368755.236635543] [camera.camera]: Skip setting filter: DecimationFilter
[component_container-1] [INFO] [1782368755.236651293] [camera.camera]: Setting ThresholdFilter......
[component_container-1] [INFO] [1782368755.236685420] [camera.camera]: set ThresholdFilter to false
[component_container-1] [INFO] [1782368755.236697087] [camera.camera]: Skip setting filter: ThresholdFilter
[component_container-1] [INFO] [1782368755.236709338] [camera.camera]: Setting HDRMerge......
[component_container-1] [INFO] [1782368755.236719546] [camera.camera]: set HDRMerge to false
[component_container-1] [INFO] [1782368755.236731214] [camera.camera]: Skip setting filter: HDRMerge
[component_container-1] [INFO] [1782368755.236748131] [camera.camera]: Setting SequenceIdFilter......
[component_container-1] [INFO] [1782368755.236758631] [camera.camera]: set SequenceIdFilter to false
[component_container-1] [INFO] [1782368755.236768548] [camera.camera]: Skip setting filter: SequenceIdFilter
[component_container-1] [INFO] [1782368755.236781674] [camera.camera]: Setting SpatialFastFilter......
[component_container-1] [INFO] [1782368755.236791591] [camera.camera]: set SpatialFastFilter to false
[component_container-1] [INFO] [1782368755.236803258] [camera.camera]: Skip setting filter: SpatialFastFilter
[component_container-1] [INFO] [1782368755.236818717] [camera.camera]: Setting SpatialModerateFilter......
[component_container-1] [INFO] [1782368755.236828051] [camera.camera]: set SpatialModerateFilter to false
[component_container-1] [INFO] [1782368755.236838843] [camera.camera]: Skip setting filter: SpatialModerateFilter
[component_container-1] [INFO] [1782368755.236852261] [camera.camera]: Setting SpatialAdvancedFilter......
[component_container-1] [INFO] [1782368755.236862469] [camera.camera]: set SpatialAdvancedFilter to false
[component_container-1] [INFO] [1782368755.236875012] [camera.camera]: Skip setting filter: SpatialAdvancedFilter
[component_container-1] [INFO] [1782368755.236886970] [camera.camera]: Setting TemporalFilter......
[component_container-1] [INFO] [1782368755.236897763] [camera.camera]: set TemporalFilter to false
[component_container-1] [INFO] [1782368755.236909138] [camera.camera]: Skip setting filter: TemporalFilter
[component_container-1] [INFO] [1782368755.236921680] [camera.camera]: Setting HoleFillingFilter......
[component_container-1] [INFO] [1782368755.236931597] [camera.camera]: set HoleFillingFilter to false
[component_container-1] [INFO] [1782368755.236942390] [camera.camera]: Skip setting filter: HoleFillingFilter
[component_container-1] [INFO] [1782368755.236955223] [camera.camera]: Setting DisparityTransform......
[component_container-1] [INFO] [1782368755.236965724] [camera.camera]: set DisparityTransform to true
[component_container-1] [INFO] [1782368755.236976808] [camera.camera]: Skip setting filter: DisparityTransform
[component_container-1] [INFO] [1782368755.238768304] [camera.camera]: Setting DecimationFilter......
[component_container-1] [INFO] [1782368755.238815556] [camera.camera]: set color DecimationFilter to false
[component_container-1] [INFO] [1782368755.316627911] [camera.camera]: Publish diagnostics every 1 seconds
[component_container-1] [INFO] [1782368755.615559747] [camera.camera]: Device Orbbec Gemini 336L connected
[component_container-1] [INFO] [1782368755.615769173] [camera.camera]: Serial number: CPC9363000F3
[component_container-1] [INFO] [1782368755.615838010] [camera.camera]: Firmware version: 1.6.00
[component_container-1] [INFO] [1782368755.615882928] [camera.camera]: ROS Wrapper version: 2.7.6
[component_container-1] [INFO] [1782368755.615966640] [camera.camera]: SDK version: 2.7.6
[component_container-1] [INFO] [1782368755.616034310] [camera.camera]: Hardware version: 0.1
[component_container-1] [INFO] [1782368755.616083604] [camera.camera]: usb connect type: USB3.2
[component_container-1] [INFO] [1782368755.616128231] [camera.camera]: device unique id: 4-1-2
[component_container-1] [INFO] [1782368755.616184817] [camera.camera]: Current node pid: 4435
[component_container-1] [INFO] [1782368755.616227693] [camera.camera]: Start device cost 859 ms
[component_container-1] [INFO] [1782368755.616528998] [camera.camera]: Enable color stream
[component_container-1] [INFO] [1782368755.616631378] [camera.camera]: Enable depth stream
[component_container-1] [INFO] [1782368755.632051601] [camera.camera]: Enable frame sync
[component_container-1] [INFO] [1782368756.204120347] [camera.camera]: Publishing static transform from color to depth
[component_container-1] [INFO] [1782368756.204366816] [camera.camera]: Translation 23.8342, -0.00534668, -0.445967
[component_container-1] [INFO] [1782368756.204440027] [camera.camera]: Rotation -0.00527049, 0.000312583, -0.000735458, 0.999986
[component_container-1] [INFO] [1782368756.204601035] [camera.camera]: Publishing static transform from depth to depth
[component_container-1] [INFO] [1782368756.204666663] [camera.camera]: Translation 0, 0, 0
[component_container-1] [INFO] [1782368756.204727624] [camera.camera]: Rotation 0, 0, 0, 1
[component_container-1] [INFO] [1782368756.207635960] [camera.camera]: Setting color AE ROI to 0, 1279, 0, 719
[component_container-1] [INFO] [1782368756.207799134] [camera.camera]: Color Frame - Width: 1280 Height: 720 fps: 30 Format: MJPG
[component_container-1] [INFO] [1782368756.209308409] [camera.camera]: Setting depth AE ROI to 0, 847, 0, 479
[component_container-1] [INFO] [1782368756.210796267] [camera.camera]: Depth Frame - Width: 848 Height: 480 fps: 30 Format: Y16
[component_container-1] [INFO] [1782368756.632535749] [camera.camera]: Setting interleave mode to nothing
[component_container-1] [INFO] [1782368756.632777260] [camera.camera]: current interleave_ae_mode_: laser
[component_container-1] [INFO] [1782368756.635404418] [camera.camera]: Enable enable_interleave_depth_frame to false
[component_container-1] [INFO] [1782368756.635604510] [camera.camera]: Initialize device cost 1672 ms

终端 2

查看可订阅的主题


pi@NanoPi-R6C:~$ ros2 topic list
/camera/color/camera_info
/camera/color/image_raw
/camera/color/image_raw/compressed
/camera/color/image_raw/theora
/camera/color/metadata
/camera/depth/camera_info
/camera/depth/image_raw
/camera/depth/image_raw/compressedDepth
/camera/depth/metadata
/camera/depth/points
/camera/depth_filter_status
/camera/device_status
/diagnostics
/joint_states
/parameter_events
/robot_description
/rosout
/tf
/tf_static

✅ Orbbec ROS2 驱动已经正常工作 ✅ RGB 图像正常发布 ✅ Depth 图像正常发布 ✅ PointCloud 正常发布 ✅ CameraInfo 正常发布 ✅ TF 已存在

友善 RK3588 USB3 直连 Gemini 336L 无法打开相机问题

连接方式 结果
RK3588 USB3 直连 Gemini 336L ❌ setXu failed、无图像
RK3588 USB2.0 ✅ 正常
RK3588 USB3 → 绿联 USB3 HUB → Gemini 336L ✅ 正常

报错日志


[06/25 15:41:46.495093][error][10528][ObLibuvcDevicePort.cpp:282] setXu failed, error code=-1
[06/25 15:41:46.595409][error][10528][ObLibuvcDevicePort.cpp:282] setXu failed, error code=-1
[06/25 15:41:46.695829][warning][10528][ObException.cpp:32] A unrecoverable_exception has occurred!
 - where: Protocol.cpp(64)
 - msg: Request failed, statusCode: 8, msg: Device response size(0) < response header size(10), propertyId: 1037
 - type: IO
 - status: 1004

问题分析

XU 代表 UVC Extension Unit(UVC 扩展单元)。奥比中光的 SDK 与相机硬件之间交互控制指令(比如切换红外模式、读取 D2C 参数、下发时间戳同步等)并不是走标准的 USB 串口,而是通过 UVC 协议中的 XU 字段来发送私有协议大包。

setXu failed 意味着 RK3588 的主板通过 USB3.0 向相机发送控制指令时,硬件层握手失败或超时(Timeout)。

为什么直连 USB3.0 会挂?

友善 RK3588 盒子的 USB3.0 接口信号走线可能在高速高频状态下抗干扰能力稍弱,或者它的内部 XHCI 驱动在处理 Gemini 336L 这种高频、大吞吐量的同步传输(Isochronous/Bulk Control)时,时序控制(Timing)过于严格,导致控制包在物理层直接被丢弃(Errno -1 即底层协议栈死锁)。

为什么加了绿联 USB3.0 HUB 就正常了?

这涉及到 USB 拓扑学中的 信能隔离与协议代理机制:

  1. 信号整形与时序重构(Retimer/Redriver 功能):绿联 HUB 内部有一颗独立的 USB3.0 集线器控制芯片(通常是创惟 GL3523 或瑞昱 RTS5411)。当相机接入 HUB 时,相机的 XU 控制命令第一站是和 HUB 的芯片进行高速电气握手,HUB 的芯片对这些高频信号进行了重新调制、放大和整形,再由 HUB 统一打包通过一根线传给 RK3588。

  2. 驱动“隔离墙”:RK3588 的 USB3.0 控制器此时面对的不再是挑剔的 Gemini 336L 相机硬件,而是面对标准且兼容性极佳的“绿联 HUB”。所有底层的时序摩擦,都在 HUB 芯片内部被消化掉了。

验证数据是否正常


pi@NanoPi-R6C:~$ ros2 topic hz /camera/color/image_raw
average rate: 3.898
	min: 0.017s max: 1.116s std dev: 0.34425s window: 10
average rate: 3.573
	min: 0.017s max: 1.116s std dev: 0.32503s window: 13
average rate: 2.374
	min: 0.017s max: 2.259s std dev: 0.59826s window: 14
average rate: 2.111
	min: 0.017s max: 2.259s std dev: 0.61038s window: 15

pi@NanoPi-R6C:~ros2 topic hz /camera/depth/image_rawaw
average rate: 24.121
	min: 0.029s max: 0.103s std dev: 0.01955s window: 25
average rate: 25.612
	min: 0.029s max: 0.103s std dev: 0.01661s window: 53
average rate: 24.099
	min: 0.024s max: 0.169s std dev: 0.02557s window: 74
average rate: 24.806
	min: 0.024s max: 0.169s std dev: 0.02324s window: 101

测试彩色图像话题 /camera/color/image_raw 的帧率(Hz)时,发现了一个极其严重的问题:

平均帧率(average rate)只有 2.1Hz ~ 3.9Hz,且延迟极不稳定(最大延迟甚至达到了 2.2 秒,抖动 std dev 很高)。

这属于典型的高分辨率图像在 ROS 2 传输中的性能瓶颈/丢包现象。

RVIZ2

结合你现在的 topic:


/camera/color/image_raw
/camera/depth/image_raw
/camera/depth/points
/tf
/tf_static

RViz 可以看这些:

RGB 图像(彩色画面)

👉 对应: /camera/color/image_raw

RViz 显示方式:Add → Image

rviz_color_image_raw

深度图(Depth Image)

👉 对应:/camera/depth/image_raw

RViz 显示方式:Add → Image

灰度图: 亮 = 远,暗 = 近(或反过来,取决于驱动)

用途:

  1. 距离估计
  2. 3D重建基础

rviz_depth_image_raw

点云(3D PointCloud)

👉 对应:/camera/depth/points

RViz 显示方式:Add → PointCloud2

需要设置:

  • Topic: /camera/depth/points
  • Fixed Frame: camera_link 或 camera_depth_frame

用途:

  1. 3D环境重建
  2. RTAB-Map建图核心数据
  3. 无人车避障基础

rviz_depth_points

TF坐标系

👉 对应:

/tf /tf_static

RViz 显示方式:Add → TF

用途:

你可以看到:


camera_link
camera_color_frame
camera_depth_frame

作用: RGB 与 Depth 对齐

SLAM定位: RTAB-Map建图坐标系

Rtabmap 测试

查看TF树


pi@NanoPi-R6C:~$ ros2 run tf2_tools view_frames
[INFO] [1782699714.080503412] [view_frames]: Listening to tf data for 5.0 seconds...
[INFO] [1782699719.164193115] [view_frames]: Generating graph in frames.pdf file...
[INFO] [1782699719.185189854] [view_frames]: Result:tf2_msgs.srv.FrameGraph_Response(frame_yaml="camera_color_frame: \n  parent: 'camera_depth_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_depth_frame: \n  parent: 'camera_link'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_color_optical_frame: \n  parent: 'camera_color_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_depth_optical_frame: \n  parent: 'camera_depth_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\n")

转换后如下


camera_link
 └── camera_depth_frame
      └── camera_color_frame
           └── camera_color_optical_frame

camera_depth_frame
 └── camera_depth_optical_frame

RTAB-Map必须的最小TF结构


map
 └── odom
      └── base_link
           └── camera_link

你现在最缺的是:base_link → camera_link

临时解决(立刻可用)


pi@NanoPi-R6C:~$ ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 base_link camera_link
[WARN] [1782700441.251815626] []: Old-style arguments are deprecated; see --help for new-style arguments
[INFO] [1782700441.285526105] [static_transform_publisher_efl7ugUHNFfVuUy6]: Spinning until stopped - publishing transform
translation: ('0.000000', '0.000000', '0.000000')
rotation: ('0.000000', '0.000000', '0.000000', '1.000000')
from 'base_link' to 'camera_link'

再次查看TF树


pi@NanoPi-R6C:~$ ros2 run tf2_tools view_frames
[INFO] [1782700486.686946437] [view_frames]: Listening to tf data for 5.0 seconds...
[INFO] [1782700491.742857976] [view_frames]: Generating graph in frames.pdf file...
[INFO] [1782700491.753088677] [view_frames]: Result:tf2_msgs.srv.FrameGraph_Response(frame_yaml="camera_color_frame: \n  parent: 'camera_depth_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_depth_frame: \n  parent: 'camera_link'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_color_optical_frame: \n  parent: 'camera_color_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_depth_optical_frame: \n  parent: 'camera_depth_frame'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\ncamera_link: \n  parent: 'base_link'\n  broadcaster: 'default_authority'\n  rate: 10000.000\n  most_recent_transform: 0.000000\n  oldest_transform: 0.000000\n  buffer_length: 0.000\n")

转换后是


base_link
└── camera_link
    └── camera_depth_frame
        ├── camera_depth_optical_frame
        └── camera_color_frame
            └── camera_color_optical_frame

检查 RTAB-Map 运行条件

确认 RTAB-Map 是否已经安装


pi@NanoPi-R6C:~$ ros2 pkg list | grep rtabmap
rtabmap_conversions
rtabmap_demos
rtabmap_examples
rtabmap_launch
rtabmap_msgs
rtabmap_odom
rtabmap_python
rtabmap_ros
rtabmap_rviz_plugins
rtabmap_slam
rtabmap_sync
rtabmap_util
rtabmap_viz

确认相机 frame_id


pi@NanoPi-R6C:~$ ros2 topic echo /camera/color/camera_info --once
header:
  stamp:
    sec: 1782701626
    nanosec: 49651968
  frame_id: camera_color_optical_frame
height: 720
width: 1280

pi@NanoPi-R6C:~$ ros2 topic echo /camera/depth/camera_info --once
header:
  stamp:
    sec: 1782701688
    nanosec: 659686912
  frame_id: camera_depth_optical_frame
height: 480
width: 848

pi@NanoPi-R6C:~$ ros2 topic hz /camera/color/image_raw
average rate: 13.708
	min: 0.012s max: 0.438s std dev: 0.10655s window: 15
average rate: 6.776
	min: 0.012s max: 0.669s std dev: 0.19800s window: 18
average rate: 3.552
	min: 0.012s max: 2.692s std dev: 0.59997s window: 19
average rate: 4.402
	min: 0.012s max: 2.692s std dev: 0.50840s window: 28
average rate: 3.644
	min: 0.012s max: 2.692s std dev: 0.56078s window: 30

pi@NanoPi-R6C:~ros2 topic hz /camera/depth/image_rawaw
average rate: 25.337
	min: 0.018s max: 0.104s std dev: 0.01857s window: 26
average rate: 27.136
	min: 0.012s max: 0.104s std dev: 0.01434s window: 55
average rate: 27.343
	min: 0.012s max: 0.104s std dev: 0.01401s window: 83
average rate: 26.329
	min: 0.012s max: 0.139s std dev: 0.01686s window: 107
average rate: 26.842
	min: 0.012s max: 0.139s std dev: 0.01537s window: 136


问题


✔ Depth(正常)
~27 Hz 稳定
std dev ~0.014s

👉 深度流是 健康的

❌ RGB(严重异常)
平均 13Hz → 掉到 3~4Hz
max 延迟 2.9s
std dev 0.5s+

👉 这是严重掉帧 + 卡顿 + 排队堵塞

根本原因


❌ 1. RGB分辨率太高(核心问题)

你现在:

1280 × 720 RGB
848 × 480 Depth

👉 RGB 远比 Depth 重

在 RK3588 上:

RGB = CPU + memcpy + encode
Depth = 通常更轻

➡️ 结果:RGB 被拖死

❌ 2. ROS2 image pipeline 堵塞

你的现象:

min 0.012s
max 2.9s

👉 说明 buffer 在堆积(典型 backlog)

❌ 3. USB 带宽 / DMA 抖动

Orbbec + RK3588 常见:

RGB 丢帧
Depth 正常
❌ 4. 没做 frame rate match

RGB ~4Hz
Depth ~27Hz

👉 RTAB-Map 必炸

解决方案


✅ 方案1(最关键):降 RGB 分辨率

把 RGB 改成:

640 × 480
15~30 FPS

👉 这是最有效的一步

✅ 方案2:强制 RGB/Depth 同帧率

在 Orbbec launch 里设置:

color_fps = 15
depth_fps = 15
✅ 方案3:关闭无用输出(减少负载)

关闭:

compressed
theora
metadata(如果不需要)
✅ 方案4:RTAB-Map 同步优化

启动参数:

approx_sync:=true
queue_size:=30

项目 建议
RGB 640×480
FPS 15~30
Depth 640×480 或 848×480
FPS 15~30
USB 必须 USB3 直连

降低分辨率命令


ros2 launch orbbec_camera gemini_330_series.launch.py color_width:=640 color_height:=480 color_fps:=15 depth_width:=640 depth_height:=480 depth_fps:=15

ros2 launch orbbec_camera gemini_330_series.launch.py color_width:=640 color_height:=480 color_fps:=10 depth_width:=640 depth_height:=480 depth_fps:=10

RTAB-Map 启动


ros2 launch rtabmap_launch rtabmap.launch.py \
rgb_topic:=/camera/color/image_raw \
depth_topic:=/camera/depth/image_raw \
camera_info_topic:=/camera/color/camera_info \
frame_id:=base_link \
approx_sync:=true \
queue_size:=40 \
qos:=1 \
visual_odometry:=true

rtabmap_rk3588_336L

RTAB-Map / RViz 点云颜色


🟢 绿色点(Green Points)

👉 当前帧(live frame / sensor frame)

特点:

当前相机看到的点云
实时更新(跟着你动)
没有融合历史信息
类似“这一帧看到的世界”
🟡 黄色点(Yellow Points)

👉 地图点(global map / accumulated map)

特点:

多帧融合后的结果
SLAM构建的“世界模型”
通常来自 RTAB-Map memory / graph
已经经过配准优化(loop closure 后更明显)

颜色 含义
🟢 绿色 当前相机看到的世界(实时)
🟡 黄色 SLAM累计建出来的世界(历史融合)