RealSense D435i 驱动安装梳理(Jetson Orin + JetPack 6.1)

记录在 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 下载别人预编译好的成品二进制,直接用 买现成家具
源码编译安装 下载源代码,自己在本机编译成二进制再装 买木料图纸自己组装

我们必须用源码编译,两个原因叠加:

  1. 架构问题 :Intel 官方提供的预编译包主要面向 x86 架构 (普通 PC)。Jetson Orin 是 ARM64 架构,没有现成的 ARM 成品包可下,只能自己拿源码编译。
  2. 定制需求 :我们需要在编译时加一个特殊选项 -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 需要的扩展功能,主要是两块:

  1. 帧元数据(metadata)------曝光、精确时间戳等。
  2. 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 ,换了更新的内核。这导致两个问题:

  1. 补丁打不上 :老的 patch 文件是针对旧内核源码写的,新内核的 uvcvideo 等源码结构变了,补丁对不上号,打补丁时报 Hunk FAILED,整个流程直接卡死。
  2. 更致命------内核去掉了 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 本身无关

解决(两个办法):

  1. 强制 git 用 HTTP/1.1(对 HTTP2 framing 报错很有效):

    bash 复制代码
    git config --global http.version HTTP/1.1
    git config --global http.postBuffer 524288000
  2. 或配 GitHub 镜像,让所有依赖走加速:

    bash 复制代码
    git 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 上更省心的一个理由。

参考文献:

jetson orin nano设备上编译安装相机D435i的驱动_d435i相机驱动安装-CSDN博客

相关推荐
苏映视官方账号3 小时前
精品案例丨方寸之间,“微” 毫毕现 —— 圆刀机高精度检测工艺优化实例
人工智能·数码相机·视觉检测·制造
互联网散修7 小时前
鸿蒙实战:从零实现自定义相机(上)——架构设计与核心实现
数码相机·华为·harmonyos·自定义相机
2601_957418807 小时前
Android手机与相机USB有线连接技术
数码相机
jinxindeep1 天前
Dexterity-BEV:跨本体&跨相机&Action三维空间对齐,推动通用机器人策略学习
数码相机·学习·机器人
2601_957418801 天前
Android相机USB有线连接技术深度解析:PTP/MTP协议原理与工程实践
数码相机
yeflx1 天前
海康 NVR 相机图像采集
数码相机
LabVIEW开发2 天前
LabVIEW 机器视觉 让 FDM 3D 打印缺陷检出率达到 100%
数码相机·labview·labview知识·labview功能·labview程序
小白不白1112 天前
Invoke的用法
开发语言·人工智能·数码相机·计算机视觉·c#
博图光电2 天前
梅卡曼德工业相机代理 | 专业工业视觉解决方案 - 助力智能制造
数码相机·制造