记录在 Jetson Orin 上为 Intel RealSense D435i 深度相机安装驱动的完整过程:做了什么、遇到了什么、为什么这么做。
一、做了什么
在 Jetson Orin(ARM64 架构 / JetPack 6.1)上,从源码编译并安装了 librealsense SDK ,并且特意选择了 RSUSB(libuvc)用户态后端,绕开了 JetPack 6 上内核补丁失效导致相机识别不到的问题。最终相机能正常出深度 + RGB 画面。
整个过程的关键决策只有一个:不走传统的"内核补丁"路线,改走"用户态后端"路线。 下面解释为什么。
二、先搞清楚几个基础概念
2.1 RealSense 的"驱动"到底是什么
D435i 本质是一个 UVC(USB Video Class)设备,深度/RGB 数据走标准 USB 视频协议。所以:
- 相机本身不需要专门的"设备驱动"------Linux 内核自带的 UVC 驱动就能识别它(
lsusb能看到)。 - 真正要装的是 librealsense SDK ,它才是把相机用起来(对齐深度、读 IMU、出点云、提供
realsense-viewer等工具)的核心。我们平时说的"装 RealSense 驱动",指的就是装这个 SDK。
2.2 为什么必须"源码编译安装"
软件安装有两种方式:
| 方式 | 做法 | 比喻 |
|---|---|---|
包管理器安装(apt install) |
下载别人预编译好的成品二进制,直接用 | 买现成家具 |
| 源码编译安装 | 下载源代码,自己在本机编译成二进制再装 | 买木料图纸自己组装 |
我们必须用源码编译,两个原因叠加:
- 架构问题 :Intel 官方提供的预编译包主要面向 x86 架构 (普通 PC)。Jetson Orin 是 ARM64 架构,没有现成的 ARM 成品包可下,只能自己拿源码编译。
- 定制需求 :我们需要在编译时加一个特殊选项
-DFORCE_RSUSB_BACKEND=true(见后文),这种"编译时定制"只有自己编译才能做到,买成品改不了。
2.3 cmake 和 make 的区别
源码编译有三步,理解它们的分工很重要:
cmake ../ -D... → 配置:探测本机环境、下载依赖、生成"施工图"(Makefile) [快]
make -j$(nproc) → 编译:照施工图把源代码翻译成二进制 [慢]
sudo make install → 安装:把编译好的程序复制到系统目录 [快]
cmake不编译代码 ,只做规划,输出一份适配本机的 Makefile。它还会在这一步联网下载依赖(nlohmann/json、fastcdr 等)。make才真正编译,必须读 cmake 生成的 Makefile。- 两个的参数也不同:
-D是给 cmake 的配置项 ;-j是给 make 的并行核心数。
三、核心问题:内核补丁在 JetPack 5 和 6 上的差异
这是整件事的关键背景,也是为什么我没走内核补丁路线的原因。
3.1 两条技术路线
librealsense 访问相机有两种后端(backend),二选一:
| 后端 | 怎么访问相机 | 对应安装方式 |
|---|---|---|
| V4L2 后端(内核路线) | 走内核的 uvcvideo 模块 |
需要打内核补丁 |
| RSUSB / libuvc 后端(用户态路线) | 纯用户态走 libusb,不碰内核 | 加 -DFORCE_RSUSB_BACKEND=true |
3.2 内核补丁是干什么的
标准内核的 uvcvideo 模块,不支持 RealSense 需要的扩展功能,主要是两块:
- 帧元数据(metadata)------曝光、精确时间戳等。
- IMU / HID 设备支持------D435i 带 IMU,依赖内核的 HID 相关模块。
所以官方提供了一个脚本 patch-realsense-ubuntu-L4T.sh,它会:下载内核源码 → 给 uvcvideo 等模块打补丁 → 重新编译这些内核模块 → 安装。打完补丁,V4L2 后端就能拿到完整的 metadata 和 IMU 数据。
3.3 为什么 JetPack 5.x 上内核补丁好使
JetPack 5.x 基于 Ubuntu 20.04 ,用的内核版本较老。这个内核的结构和 RealSense 的补丁是匹配的:
- 补丁脚本里的 patch 文件,就是针对这一代 L4T 内核的源码写的,能干净地打上(
patch不报Hunk FAILED)。 - 关键的 HID / hiddraw 相关功能在这一代内核里是完整的,IMU 依赖的内核接口都在。
所以在 JetPack 5.x 上,跑 patch-realsense-ubuntu-L4T.sh → 编译 → 安装,深度、RGB、IMU、metadata 全部正常。这也是为什么老教程都教你"打内核补丁"。
3.4 为什么 JetPack 6.x 上内核补丁不好使
JetPack 6.x 升级到 Ubuntu 22.04 ,换了更新的内核。这导致两个问题:
- 补丁打不上 :老的 patch 文件是针对旧内核源码写的,新内核的
uvcvideo等源码结构变了,补丁对不上号,打补丁时报Hunk FAILED,整个流程直接卡死。 - 更致命------内核去掉了 IMU 依赖的功能 :根据 Intel 官方在 issue 里的说明,JetPack 6 移除了
hiddraw这个函数,而带 IMU 的相机(属于 HID 设备)正是依赖它。这不是补丁能修的------功能从内核里被拿掉了。
结论:在 JetPack 6.x 上,传统内核补丁路线基本走不通。补丁能不能打上是一回事,就算打上了,IMU 也可能因为缺 hiddraw 而拿不到数据。这也是社区里 issue #12710、#13784 等大量帖子反复讨论的核心矛盾。
参考 issue:
3.5 JetPack 6.x 上的正确路线
既然内核补丁不好使,社区验证出来的可行方案是:
| 需求 | JetPack 6.1 上的正解 |
|---|---|
| 深度 + RGB+IMU | RSUSB / libuvc 后端,不碰内核,最省心(我走的就是这条) |
| 要内核级原生 IMU 支持 | libuvc 后端编译 + 固件降级到 5.13.0.55(社区实测配方) 装 realsense_mipi_platform_driver 或自己重编内核开 HID(官方都说很复杂) |
选 RSUSB 后端,这也是 JetPack 6 上最稳的做法。
四、我实际执行的步骤
第 1 步:安装依赖
bash
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y
sudo apt-get install -y git cmake build-essential pkg-config
sudo apt-get install -y libssl-dev libusb-1.0-0-dev libudev-dev
sudo apt-get install -y libgtk-3-dev libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
sudo apt-get install -y libcurl4-openssl-dev # 关键:external_libcurl.cmake 要用系统 libcurl
第 2 步:获取源码
bash
cd ~
git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
第 3 步:安装 udev 规则(相机权限)
bash
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
因为走 RSUSB 后端,不需要 打内核 patch,跳过
patch-realsense-ubuntu-L4T.sh。
第 4 步:修改 external_libcurl.cmake(用系统 libcurl)
源码默认会去联网编译 libcurl,弱网环境容易失败。改成用系统预装的 libcurl:
bash
cat > ~/librealsense/CMake/external_libcurl.cmake << 'EOF'
if(CHECK_FOR_UPDATES)
pop_security_flags() # remove security flags
find_package(CURL REQUIRED)
message(STATUS "成功找到系统 libcurl 头文件路径: ${CURL_INCLUDE_DIRS}")
message(STATUS "系统 libcurl 库路径: ${CURL_LIBRARIES}")
add_library(curl INTERFACE)
target_include_directories(curl INTERFACE ${CURL_INCLUDE_DIRS})
target_link_libraries(curl INTERFACE ${CURL_LIBRARIES})
add_custom_target(libcurl)
if (NOT WIN32 AND NOT APPLE)
find_package(OpenSSL REQUIRED)
target_link_libraries(curl INTERFACE OpenSSL::SSL OpenSSL::Crypto)
endif()
push_security_flags()
endif() #CHECK_FOR_UPDATES
EOF
第 5 步:配置 + 编译 + 安装
bash
cd ~/librealsense
mkdir -p build && cd build
cmake ../ -DFORCE_RSUSB_BACKEND=true -DCMAKE_BUILD_TYPE=Release
make -j$(nproc) # 内存紧张就改 -j4
sudo make install
cmake 配置成功的标志------输出里必须看到:
bash
-- using RS2_USE_LIBUVC_BACKEND ← 证明走的是 RSUSB/libuvc 后端(正确)
-- Checking for module 'libudev'
-- Found libudev, version 249 ← 证明 udev 支持被编进去了
第 6 步:验证
bash
realsense-viewer # 图形界面,能看到深度/RGB 画面即成功
rs-enumerate-devices # 命令行列出相机及固件信息
五、我踩过的坑(按发生顺序)
坑 1:cmake 联网下载依赖失败(HTTP2 / TLS 报错)
现象:cmake 配置阶段报错
bash
error: RPC failed; curl 16 Error in the HTTP2 framing layer
fatal: error reading section header 'shallow-info'
Failed to download nlohmann/json
或
bash
GnuTLS recv error (-110): The TLS connection was non-properly terminated.
原因 :cmake 要从 GitHub git clone 下载依赖(nlohmann/json、fastcdr 等),弱网环境下 GitHub 连接不稳,时好时坏。与 RealSense 本身无关。
解决(两个办法):
-
强制 git 用 HTTP/1.1(对 HTTP2 framing 报错很有效):
bashgit config --global http.version HTTP/1.1 git config --global http.postBuffer 524288000 -
或配 GitHub 镜像,让所有依赖走加速:
bashgit config --global url."https://gh-proxy.com/https://github.com/".insteadOf "https://github.com/"
改完后必须 rm -rf build 重新 cmake,否则残留状态不会重新触发下载。
六、效果展示

已完成
- librealsense SDK 源码编译安装成功(RSUSB/libuvc 后端)。
- 相机能出深度 + RGB 画面。
- 安装位置:
/usr/local/lib/(库)、/usr/local/include/(头文件)、/usr/local/bin/(realsense-viewer等工具)。
已知限制
- RSUSB 后端会丢失硬件时间戳 / 部分 metadata 。对纯视觉 SLAM、软件时间戳对齐(
approximate_sync)够用;但若后续要做对时间戳精度敏感的紧耦合 VIO,可能成为瓶颈。 - IMU 在 JetPack 6 上可能取不到数据 (hiddraw 缺失)。若需要 IMU,社区验证的解法是 libuvc 后端 + 固件降级到 5.13.0.55。
如何验证 IMU 是否可用
bash
rs-enumerate-devices | grep -i -E "accel|gyro|motion" # 看 IMU 有没有被识别
rs-motion # 图形界面,转动相机看模型动不动
- 模型跟着转 → IMU 正常。
- 模型不动(数据为 0)→ 经典的 JetPack 6 hiddraw 故障,需固件降级。
重要提醒
JetPack 升级或内核更新后,若用的是内核补丁方案,补丁会失效需重打。 RSUSB 后端不受此影响------这也是它在 Jetson 上更省心的一个理由。
参考文献: