解决: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

确认当前用户已加入 plugdev 和 video 组。若未加入:

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 install 或 colcon build。


6. 技术要点备忘

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

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

相关推荐
码农小韩1 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well06121 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班1 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
额额额对了1 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
子木HAPPY阳VIP2 小时前
Ubuntu 关闭防火墙操作步骤
linux·运维·ubuntu
王振超wzc2 小时前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu
GeW4 小时前
制造强国底座:Linux与数据库驱动的新型工业基础设施
linux
xiaoye-duck4 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络
Tairitsu_H4 小时前
[Linux系统] 命令行参数 | 环境变量 | 程序地址空间
linux·环境变量·命令行参数·程序地址空间
雯宝4 小时前
devices_init / buses_init / classes_init / firmware_init / hypervisor_init 函数
linux