烧录和更新
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
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℃ |
负载查看

安装 rtabmap
sudo apt install \
ros-humble-rtabmap \
ros-humble-rtabmap-ros \
ros-humble-rtabmap-msgs
下一步就是把 Orbbec → ROS2 → RTAB-Map 这条链路打通
安装 Orbbec ROS驱动
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. 使用 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
- 再次编译
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 台式机上安装 Remmina
sudo apt install remmina remmina-plugin-rdp remmina-plugin-secret -y
打开Remmina


注意: 域可以不用填写
启动相机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 拓扑学中的 信能隔离与协议代理机制:
-
信号整形与时序重构(Retimer/Redriver 功能):绿联 HUB 内部有一颗独立的 USB3.0 集线器控制芯片(通常是创惟 GL3523 或瑞昱 RTS5411)。当相机接入 HUB 时,相机的 XU 控制命令第一站是和 HUB 的芯片进行高速电气握手,HUB 的芯片对这些高频信号进行了重新调制、放大和整形,再由 HUB 统一打包通过一根线传给 RK3588。
-
驱动“隔离墙”: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

深度图(Depth Image)
👉 对应:/camera/depth/image_raw
RViz 显示方式:Add → Image
灰度图: 亮 = 远,暗 = 近(或反过来,取决于驱动)
用途:
- 距离估计
- 3D重建基础

点云(3D PointCloud)
👉 对应:/camera/depth/points
RViz 显示方式:Add → PointCloud2
需要设置:
- Topic: /camera/depth/points
- Fixed Frame: camera_link 或 camera_depth_frame
用途:
- 3D环境重建
- RTAB-Map建图核心数据
- 无人车避障基础

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

RTAB-Map / RViz 点云颜色
🟢 绿色点(Green Points)
👉 当前帧(live frame / sensor frame)
特点:
当前相机看到的点云
实时更新(跟着你动)
没有融合历史信息
类似“这一帧看到的世界”
🟡 黄色点(Yellow Points)
👉 地图点(global map / accumulated map)
特点:
多帧融合后的结果
SLAM构建的“世界模型”
通常来自 RTAB-Map memory / graph
已经经过配准优化(loop closure 后更明显)
| 颜色 | 含义 |
|---|---|
| 🟢 绿色 | 当前相机看到的世界(实时) |
| 🟡 黄色 | SLAM累计建出来的世界(历史融合) |