解决:RealSense D435 在树莓派4B(Ubuntu 22.04 + ROS2 Humble)上的权限与驱动问题完整复盘

一、问题描述(最初遇到的问题)

1. 尝试使用 sudo 运行 ROS 2 launch 文件失败

(1)现象

在终端中执行以下命令时遇到错误:

bash 复制代码
sudo -E ros2 launch realsense2_camera rs_launch.py ...

系统返回:

复制代码
sudo: ros2: command not found
(2)原因分析
  • sudo 默认会重置 PATH 环境变量,即使使用了 -E 参数,其受 secure_path 限制仍不会包含 ROS 2 的安装路径(如 /opt/ros/humble/bin)。
  • ROS 2 环境脚本(setup.bash)仅在普通用户 shell 中加载,root 环境下未执行,因此找不到 ros2 命令。
(3)初步误导

用户误以为必须使用 sudo 才能获得相机硬件访问权限,但实际上 RealSense D435 在正确配置后无需 root 权限。


2. 普通用户运行 ROS 节点时无法检测到相机

(1)现象

直接以普通用户身份运行:

bash 复制代码
ros2 launch realsense2_camera rs_launch.py ...

节点启动后持续报错:

复制代码
[WARN] [camera.camera]: No RealSense devices were found!
(2)伴随现象
  • rs-enumerate-devices(RealSense SDK 设备枚举工具)在普通用户下同样报 No device detected
  • 但使用 sudo rs-enumerate-devices 则能完整识别设备并列出所有流配置。
  • lsusb 可见设备(ID 8086:0b07),且设备节点 /dev/bus/usb/002/002 权限为 crw-rw-rw- root plugdev,用户已加入 plugdev 组。
(3)根本原因
  • RealSense SDK 默认使用用户态 USB 驱动(libusb 后端) ,它需要进程具备 CAP_SYS_RAWIO 能力才能直接向 USB 设备发送控制命令。
  • 普通用户即使有设备文件读写权限,也会因缺少该能力而被内核拒绝,导致 SDK 无法初始化设备。
  • sudo 赋予 root 权限,绕过了这一限制,但直接使用 sudo 运行整个 ROS 节点是不安全且不规范的做法。

二、解决方法(真正的解决方法)

1. 确认硬件连接与基础环境

(1)验证设备物理连接
bash 复制代码
lsusb

确保输出包含:

复制代码
Bus 002 Device 00x: ID 8086:0b07 Intel Corp. RealSense D435
(2)检查用户组成员
bash 复制代码
groups

确认当前用户已加入 plugdevvideo 组。若未加入:

bash 复制代码
sudo usermod -a -G plugdev,video $USER

注意 :执行后需注销重新登录才能使组权限生效。

(3)检查 udev 规则
bash 复制代码
ls -l /etc/udev/rules.d/*realsense*.rules

确保存在规则文件,内容为允许 plugdev 组访问 Intel RealSense 设备。若缺失,可手动创建:

bash 复制代码
sudo tee /etc/udev/rules.d/99-realsense-libusb.rules << 'EOF'
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", MODE="0666", GROUP="plugdev"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger

2. 安装支持普通用户权限的 RealSense SDK(libuvc 后端)

(1)为什么需要 libuvc 后端
  • 官方 Deb 包(ros-humble-librealsense2)默认编译为使用 V4L2 内核后端 ,在树莓派上易与 uvcvideo 驱动冲突,且仍可能受限于 USB 权限问题。
  • libuvc 后端 通过 libusb 直接与设备通信,完全绕过内核视频驱动,并可结合 udev 规则为普通用户赋予完整的访问权限。
(2)从源码编译并安装 SDK(使用 libuvc 后端)
bash 复制代码
# 安装依赖
sudo apt update
sudo apt install -y git cmake build-essential pkg-config libusb-1.0-0-dev

# 克隆仓库并切换至稳定分支
mkdir -p ~/librealsense_build
cd ~/librealsense_build
git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
git checkout v2.54.1   # 与 ROS2 Humble 兼容的稳定版本

# 运行官方 libuvc 安装脚本(自动处理 udev、权限、编译)
sudo ./scripts/libuvc_installation.sh
  • 脚本执行过程中会询问是否禁用内核 UVC 驱动,回答 y
  • 脚本结束后会自动重启系统。
(3)验证 SDK 安装成功

重启后,以普通用户执行:

bash 复制代码
rs-enumerate-devices

若输出完整的设备信息及流配置,则表明权限问题已彻底解决。


3. 配置 ROS 2 节点使用已安装的 SDK

(1)不要从源码编译 ROS 节点
  • 系统中通过 apt 安装的 ros-humble-realsense2-camera 包与上述 SDK 版本兼容时,无需重新编译
  • 重新编译不仅多余,还可能因依赖关系错误引入冲突的 SDK 包。
(2)直接使用预编译的 ROS 2 节点
bash 复制代码
# 确保 ROS 2 环境已加载
source /opt/ros/humble/setup.bash

# 直接启动相机节点
ros2 launch realsense2_camera rs_launch.py \
    align_depth.enable:=true \
    depth_module.depth_profile:=640x480x15 \
    rgb_camera.color_profile:=640x480x15 \
    enable_infra1:=false \
    enable_infra2:=false
(3)若提示找不到 launch 文件

说明 ros-humble-realsense2-camera 曾被误删,重新安装即可:

bash 复制代码
sudo apt install ros-humble-realsense2-camera -y

该包会依赖 ros-humble-librealsense2但注意 :此时需确保手动安装的 SDK 库文件不会被覆盖。若发生覆盖导致权限失效,可再次运行 libuvc_installation.sh 修复。


4. 最终验证步骤

(1)验证 SDK 工具
bash 复制代码
rs-enumerate-devices   # 必须输出设备信息
realsense-viewer       # 若能打开图形界面并显示图像,则完全正常
(2)验证 ROS 节点
bash 复制代码
ros2 launch realsense2_camera rs_launch.py align_depth.enable:=true
  • 日志中不应再出现 No RealSense devices were found!
  • 另开终端执行 ros2 topic list | grep camera,应看到 /camera/color/image_raw 等话题。
(3)长期环境变量设置

将以下内容追加到 ~/.bashrc,避免每次手动 source:

bash 复制代码
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc

三、其他总结(中间不必要的步骤和导致的问题)

1. 错误步骤一:盲目使用 sudo 运行 ROS 命令

(1)现象

最初因担心权限问题而尝试 sudo ros2 launch ...,遇到 command not found 错误。

(2)原因
  • 未理解 ROS 2 环境变量仅对普通用户生效。
  • 未意识到 RealSense 设备可通过 udev 规则赋予普通用户访问权。
(3)后果
  • 浪费了时间排查 sudo 环境问题。
  • 错误地将注意力引向"如何用 root 运行 ROS",而非解决根本的 USB 权限问题。

2. 错误步骤二:误执行 rosdep install 导致冲突包安装

(1)背景

在成功通过 libuvc_installation.sh 解决权限问题后,因后续教程引导,执行了以下操作:

bash 复制代码
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y

该命令解析了 realsense-ros 源码中的 package.xml,并自动安装了依赖项 ros-humble-librealsense2

(2)后果
  • ros-humble-librealsense2 是一个 Deb 包,其安装的 SDK 库文件(/usr/lib/aarch64-linux-gnu/librealsense2.so)覆盖了手动编译的、配置好权限的 /usr/local/lib/librealsense2.so
  • 新安装的库文件默认使用 V4L2 后端,且未针对普通用户权限进行优化,导致 rs-enumerate-devices 再次报 No device detected
  • 因此误以为"重新编译 ROS 节点"破坏了原有正常环境。
(3)正确认识
  • rosdep install 在从源码编译 ROS 包时是必要的,但前提是确实需要从源码构建 ROS 节点。
  • 在本场景中,完全不需要从源码编译 ROS 节点,因此执行该命令纯属画蛇添足,反而引入了破坏性依赖。

3. 错误步骤三:不必要的 colcon build 编译 ROS 节点

(1)背景

rosdep install 后,继续执行了:

bash 复制代码
colcon build --packages-select realsense2_camera realsense2_camera_msgs

编译过程耗时数分钟,且编译出的节点仍然依赖被覆盖后的 SDK 库。

(2)后果
  • 浪费了编译时间。
  • 由于库冲突,编译后的节点与手动安装的 SDK 不兼容,导致运行时仍无法找到设备。
  • 增加了问题排查的复杂度,一度认为编译是导致故障的原因。
(3)根本问题
  • 已有的 ros-humble-realsense2-camera(通过 apt 安装)与手动安装的 SDK 库在 ABI 层面完全兼容(版本同为 2.57.7),无需重新编译。
  • 重新编译不仅多余,还暴露了 rosdep 依赖管理的副作用。

4. 最终正确操作:卸载冲突包,恢复环境

(1)关键命令
bash 复制代码
sudo apt remove --purge ros-humble-librealsense2 -y

该命令移除了 Deb 包安装的 SDK 库文件,使系统重新使用 /usr/local/lib 下手动编译的库。

(2)执行后效果
  • rs-enumerate-devices 立即恢复正常,普通用户可识别设备。
  • ROS 节点(无论是 apt 安装版还是编译版)均能正常工作。
(3)总结教训
  • 当手动编译安装的库与系统包管理器安装的库发生冲突时,优先卸载包版本,保留手动版本
  • 在未明确需要新功能或修复 Bug 的情况下,不要轻易从源码编译 ROS 节点,直接使用官方 Deb 包即可。
  • rosdep install 会静默安装系统依赖,可能覆盖手动配置的环境,使用时需格外谨慎

5. 附:完整的正确操作流程(精简版)

  1. 用户加入 plugdev 组并注销重新登录
  2. 执行 libuvc_installation.sh 编译安装 SDK(自动配置 udev 和权限)。
  3. 重启后直接运行 ros2 launch realsense2_camera rs_launch.py (无需 sudo)。
  4. 若 ROS 节点缺失,则 sudo apt install ros-humble-realsense2-camera(勿编译源码)。

全程无需执行 rosdep installcolcon build


6. 技术要点备忘

组件 正确配置
后端类型 libuvc(用户态 USB)
库路径 /usr/local/lib/librealsense2.so
权限赋予 udev 规则 + 用户加入 plugdev
ROS 节点来源 apt 官方包 ros-humble-realsense2-camera
启动方式 普通用户直接 ros2 launch

以上即为本次故障排查与解决过程的完整复盘。所有不必要的弯路均源于对 ROS 依赖管理机制和 RealSense 后端选择的理解偏差,望后续使用者引以为戒。

相关推荐
白毛大侠2 小时前
LVS 完全入门:从零理解 Linux 虚拟服务器的三种模式
linux·服务器·lvs
ulias2122 小时前
Linux中的开发工具
linux·运维·服务器·开发语言·c++·windows
qq_254617772 小时前
windows脚本.bat实现:自动化远程登录or推文件到板子
linux·自动化
姜太小白2 小时前
【Linux】CentOS 7 VNC 远程桌面配置
linux·python·centos
捞的不谈~2 小时前
解决在Ubuntu系统下使用Lucid 相机(HTR003S-001)-Ubuntu 20.04系统遇到GLIBC和GLIBCXX版本不兼容的问题
linux·运维·ubuntu
悠然南风2 小时前
【云原生学习】Linux网络知识操作精讲 + 实战踩坑
linux
李李李li2 小时前
linux x86 离线安装docker 27.5.0
linux·docker·eureka
float_com2 小时前
【JavaWeb】----- Linux基础入门
linux·javaweb
卢傢蕊2 小时前
LVS+Keepalived 高可用群集
linux·运维·lvs·keepalived