☰
Ubuntu 22.04下Intel RealSense D405开发环境搭建与深度图采集实战
2026/10/6 10:59:22 网站建设 项目流程

最近手上的桌面级抓取项目换了视觉传感器,从原来的D435i换成了D405,原因很简单:目标距离太近,D435i在10厘米到20厘米这个区间出图已经吃力了,而D405本身就是为短距离高精度设计的。换完之后找了一圈教程,发现大部分还停留在D435/D415时代,要么给的apt源地址早失效,要么直接劝你源码编译,对一个只是想先把环境跑起来的人来说太劝退。这篇文章把我这次在Ubuntu 22.04上从零配置D405开发环境的全过程整理出来,包括realsense-viewer怎么装、怎么验证设备、怎么把SDK接进自己的Python和C++程序里。如果你照着敲完命令还没跑通,欢迎直接跳到文末的排查清单对号入座。

先说下这篇内容适合谁。如果你刚拿到D405,还没在Ubuntu上看到过任何画面,那这篇就是给你写的;如果你之前用D435/D415,环境装过但最近系统重装或换了台机器,这篇也能让你少走很多弯路;就算你是纯Python玩家,只想快速拿到深度图继续搞图像处理,我也把Python API那块单独拉出来了。整个流程大概是二十分钟到半小时,前提是你网络正常、手边有USB 3.0接口。

1. 先弄清楚D405到底能干哪些活

1.1 为什么是D405而不是D435/D415

RealSense D400系列里,大家最熟悉的其实是D415和D435,前者偏中远距离,后者是当时主打的高帧率型号。但这两款在近距离场景下都有个通病:最小深度距离太大,离得太近时深度图直接变成一团黑色。D405就不一样,它的标称深度范围大概是0.1米到0.5米,实际在使用中7厘米左右也能勉强出图,而且它是全局快门,对运动物体的形变控制更好。所以做桌面机械臂抓取、零件测量、近距离读码这类项目,选D405是更合理的。

我见过不少人拿D405当普通摄像头用,插上就想看彩色图,这其实有点浪费。D405真正值钱的是它的深度精度,尤其在做体积测量和位姿估计时,短距离段的毫米级表现是D435给不了的。所以后面配置时,我会把深度流和彩色流都打开,方便你对比观察。这篇文章的核心就是帮你把它的深度能力用起来。

1.2 动手前需要准备的软硬件清单

按照我这次实操的经验,你最好先确认以下几样东西,不然装到一半容易卡住。

  • Ubuntu 22.04 LTS系统,桌面版或服务器版都行,但如果想看realsense-viewer的图形界面,还是建议用桌面版;
  • D405相机一台,确认包装盒里的USB线没有损坏,线材这东西很玄学,坏的线会让你排查一整天;
  • 电脑有原生USB 3.0口,注意不是USB 2.0,也不是扩展坞上的口,这点后面重点说;
  • 内存8GB以上,4GB也不是不能跑,但viewer开两个图像流就有点喘;
  • 能访问Intel官方软件源,apt源方案依赖网络。

我这次用的是一台ThinkPad的笔记本,集成显卡,Ubuntu 22.04 LTS,内核版本5.15,跑realsense-viewer没有任何问题。如果你的机器是NVIDIA独显,可能要多注意驱动相关的问题,这个我在文末排查清单里也写了。

2. 快速搭建开发环境:官方apt源安装librealsense

2.1 为什么我选了apt源而不是源码编译

网上很多教程都喜欢让用户从源码编译librealsense,给出的理由通常是“源码最新”“可以自己改SDK”。但我的观点很直接:如果你不是要定制SDK内部逻辑,只是想把D405跑起来正常出图,那就老老实实用官方apt源。

源码编译最常见的问题不是编译本身,而是卡在依赖上。librealsense编译时要处理libusb、GLFW、OpenCV、CUDA这些乱七八糟的依赖,任何一个版本不对都能让你搞一个下午。尤其很多教程是在旧系统上写的,放到Ubuntu 22.04上跑,能遇到各种报错。而官方apt仓库已经把这些依赖关系都打包好了,一条apt install下去,系统会自动把需要的库装上,后续apt upgrade还能顺带升级SDK,对大多数人来说这体验是最舒服的。

还有一个容易踩的坑:不要在源码编译和apt安装两者之间反复横跳,装了两套之后系统里的librealsense库会非常混乱,程序起来之后链接的库版本都不确定。我的建议是如果你之前试用过源码编译,最好先彻底清理掉,再走apt这条路。

2.2 添加Intel官方软件源并安装开发包

先更新系统基础软件包,这是避免后面装依赖时莫名其妙报错的好习惯。

sudo apt update && sudo apt upgrade -y

然后安装几个基础工具,如果你系统里已经有了可以跳过。

sudo apt install -y curl build-essential cmake python3-pip

接下来把Intel RealSense的官方apt源添加进去。注意Ubuntu 22.04已经弃用了老的apt-key方式,我们直接使用新的keyrings方式,一劳永逸,以后不会有烦人的警告。

sudo mkdir -p /etc/apt/keyrings curl -sSf https://librealsense.intel.com/Debian/librealsense.pgp | sudo tee /etc/apt/keyrings/librealsense.pgp > /dev/null sudo tee /etc/apt/sources.list.d/librealsense.list > /dev/null <<EOF deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo focal main EOF

这里有一点经验之谈:Intel官方的apt仓库目前主力发布版本还是对应Ubuntu 20.04的focal,但在22.04上直接用focal源是没问题的,deb包依赖兼容性很正常。如果你尝试用jammy字段反而可能遇到404。所以别纠结这个细节,直接按我上面的来。

随后更新源并安装四个核心包。

sudo apt update sudo apt install -y librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg

这四个包分别做什么:

  • librealsense2-dkms:内核模块,负责让Linux内核正确识别并驱动RealSense设备;
  • librealsense2-utils:包含realsense-viewer、rs-enumerate-devices、rs-fw-update等命令行工具;
  • librealsense2-dev:开发头文件和动态链接库,后面写C++程序靠它;
  • librealsense2-dbg:调试符号文件,一般用不上,装上保险。

装完之后可以顺手查看一下安装版本,确认所有包版本一致,避免出现SDK和内核模块版本不匹配的情况。

dpkg -l | grep librealsense

如果看到版本号一致,说明装得很干净。

2.3 配置用户权限并验证设备能否被识别

安装完成后别急着打开viewer,先做两件事。第一是把自己加入plugdev用户组,否则非root用户访问USB设备时经常遇到权限不足的问题。

sudo usermod -a -G plugdev $USER newgrp plugdev

newgrp是让当前shell立即切换到新用户组,省去注销重新登录的麻烦,如果你重新打开一个终端,那也相当于已经生效了。

然后插上D405,执行下面的命令看设备是否被系统识别。

rs-enumerate-devices

正常输出会列出设备名称、型号、序列号、固件版本等信息,型号那一行会明确写着Intel RealSense D405。如果这一条命令能通过,意味着驱动链路八成没问题。

再顺手看一眼lsusb的输出:

lsusb | grep -i intel

你会看到类似Intel Corp. Intel RealSense D405的记录。到了这里,环境基本就通了。但我还是建议你先别急着写代码,先把realsense-viewer跑起来看一眼画面,这一步能帮你确认相机本身是好的。

3. realsense-viewer 实操:从启动到拿到第一帧深度图

3.1 启动realsense-viewer并认识界面布局

直接在终端敲命令启动:

realsense-viewer

如果不出意外,会弹出一个Qt风格的窗口,左边是设备列表,中间大块区域是图像流显示区,右边是参数控制面板。第一次打开时中间可能是空的,因为默认不会自动开流,需要手动在左边面板里点击Stereo Module和RGB Camera,让深度流和彩色流跑起来。

这里我想多说一句,很多人打开viewer之后看到一堆英文不知所措,其实你只需要记住几个关键位置:

  • 左侧Stereo Module下面有Depth和Infrared,Depth就是深度流;
  • 左侧RGB Camera下面有个Color,这是普通彩色图;
  • 右侧面板可以调整分辨率、帧率、曝光等参数;
  • 画面左上角或底部状态栏会显示每路流的当前分辨率和帧率。

先同时打开Depth和Color,看看能不能出图。深度图在默认配色下是一张灰暗的图,近处物体亮一些,远处暗一些。如果你把鼠标移到深度图上,界面底部会实时显示鼠标所指像素的深度值,单位是毫米。拿手在相机前晃一晃,距离变化会直接体现在数值上,这是很直观的验证方式。

3.2 让D405稳定出图的关键设置

D405的默认参数不一定适你的场景,尤其是第一次跑通后,你会发现画面可能过曝或者深度图上有一堆黑斑。下面这几个设置是短距离场景里最常用的。

第一是分辨率。D405支持多种分辨率,我优先推荐640x480,这个分辨率下帧率高、深度计算稳定,对调试来说完全够用。1280x720虽然细节更多,但近距离下对算力要求也更高,如果你的CPU不够强,viewer界面会明显卡顿。

第二是帧率。默认30fps,如果做机器人抓取这种实时性要求高的项目,可以试60fps。但同样要注意,帧率越高CPU占用越高,而且数据量变大,对USB带宽也更敏感。我在实测中觉得30fps对大多数桌面级应用足够。

第三是深度可视化配色。在右侧的Depth Visualization下拉菜单里,可以切换White to Black、Jet、Rosetta等多种配色方案。调试时我喜欢用Jet,蓝色到红色的渐变更直观,近处是暖色,远处是冷色,一眼就能看出距离趋势。

还有一个很重要的细节:D405的短距离特性决定了它非常依赖环境光。你在室内正常灯光下用没问题,但如果你把它放在强红外干扰的环境里,比如靠近窗户阳光直射的地方,深度图会出现大量噪点甚至完全失效。调试时尽量选择稳定的光照环境。

3.3 固件检查与更新

RealSense设备的固件版本直接关系到成像质量和稳定性。我在装好的系统上执行了下面这条命令,查看当前固件:

rs-fw-update -l

它会列出识别到的设备以及当前固件版本。D405出厂固件如果太老,可能出现深度图异常、设备掉线等问题。官方apt源安装的librealsense2-utils已经自带了rs-fw-update工具,如果你需要更新固件,可以去Intel官网下载对应型号的.bin固件文件,然后执行:

rs-fw-update -f 固件文件路径.bin

但这里我劝你一句:如果当前固件版本不太老,而且设备出图正常,就别折腾固件更新了。固件升级有风险,虽然官方工具已经比较成熟,但电量不足或者USB线接触不良时中途断电,设备变砖不是开玩笑的。我自己的原则是“能正常用就不升”。

4. 接入自己的代码:Python与C++两种姿势

4.1 Python方案:安装pyrealsense2并采集第一帧

realsense-viewer跑通之后,你就可以开始做正事了。Python方案很适合快速原型验证,安装非常简单。

pip install pyrealsense2

这里有一个环境管理上的建议。Ubuntu 22.04系统自带的Python 3.10,直接pip安装到系统环境也方便,但如果你同时给多个项目开发,我强烈建议建个虚拟环境,不然不同项目依赖打架很头疼。

python3 -m venv rs_venv source rs_venv/bin/activate pip install pyrealsense2 opencv-python numpy

我顺便把OpenCV和NumPy也装上了,因为后面做图像处理基本绕不开它们。接下来写一个最简单的Python脚本,采集一帧深度图和彩色图:

import pyrealsense2 as rs import numpy as np import cv2 pipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) try: frames = pipeline.wait_for_frames() depth_frame = frames.get_depth_frame() color_frame = frames.get_color_frame() if not depth_frame or not color_frame: print("No frame received") else: depth_image = np.asanyarray(depth_frame.get_data()) color_image = np.asanyarray(color_frame.get_data()) cv2.imwrite("color.png", color_image) np.save("depth.npy", depth_image) print("Saved color.png and depth.npy") finally: pipeline.stop()

这段代码做的事情很简单:启动管道,等待一帧数据,然后把深度图保存成npy数组、彩色图保存成png。运行完后你可以在当前目录看到两个文件。重点是理解depth_frame.get_data()返回的是一个HxW的二维数组,每个元素是16位整数,单位是毫米。这个数据格式是所有后续深度计算的起点。

如果你在import或运行时遇到找不到动态库的报错,先确认你是用pip list | grep realsense看到的安装路径,再看看是不是同时装了apt版的librealsense2-dev。两种安装方式混用可能导致Python API加载到不同版本的底层库,解决办法是把其中一个干净卸载掉。

4.2 C++方案:用CMake把工程组织起来

如果你的项目对性能要求高,或者需要和现有C++代码集成,那就要走C++这条路线。官方apt源安装的librealsense2-dev已经提供了CMake的查找模块,用起来非常方便。

先建一个测试工程:

mkdir -p ~/rs_cpp_test && cd ~/rs_cpp_test

创建CMakeLists.txt:

cmake_minimum_required(VERSION 3.10) project(rs_cpp_test) find_package(realsense2 REQUIRED) add_executable(rs_cpp_test main.cpp) target_link_libraries(rs_cpp_test ${realsense2_LIBRARY}) target_include_directories(rs_cpp_test PRIVATE ${realsense2_INCLUDE_DIR})

再创建一个main.cpp:

#include <librealsense2/rs.hpp> #include <iostream> int main() { rs2::pipeline pipe; rs2::config cfg; cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30); cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30); pipe.start(cfg); rs2::frameset frames = pipe.wait_for_frames(); rs2::depth_frame depth = frames.get_depth_frame(); rs2::video_frame color = frames.get_color_frame(); if (!depth || !color) { std::cerr << "Failed to get frame" << std::endl; return -1; } std::cout << "Depth size: " << depth.get_width() << "x" << depth.get_height() << std::endl; std::cout << "Color size: " << color.get_width() << "x" << color.get_height() << std::endl; auto depth_data = static_cast<const uint16_t*>(depth.get_data()); std::cout << "Center depth (mm): " << depth_data[depth.get_width() / 2 + (depth.get_height() / 2) * depth.get_width()] << std::endl; pipe.stop(); return 0; }

编译运行:

cmake -B build cmake --build build -j$(nproc) ./build/rs_cpp_test

如果一切正常,你会看到深度图的尺寸和画面中心的距离值。这段代码里的depth_data就是原始深度数据缓冲区,可以按像素索引直接访问,这也是C++方案高性能的来源。

有一点需要留意:使用C++ API时,如果你发现代码里写RS2_STREAM_DEPTH报错,大概率是CMake没有正确包含头文件目录。检查一下realsense2_INCLUDE_DIR变量是否被正常定义,有时候安装包版本差异会导致变量名不同,可以打印出来看看。

4.3 示例:同时取深度图和彩色图

在实际项目中,深度图和彩色图通常会一起用到,比如做RGB-D对齐、检测物体的同时测距。上面Python和C++两段示例都已经展示了同时开启两路流的方式,但真正到了算法层面,还要把深度图和彩色图对齐到同一坐标系。

librealsense提供了align功能,Python示例可以这样写:

align = rs.align(rs.stream.color) frames = pipeline.wait_for_frames() aligned_frames = align.process(frames) aligned_depth_frame = aligned_frames.get_depth_frame() color_frame = aligned_frames.get_color_frame()

对齐之后,深度图和彩色图像素一一对应,这样你在彩色图上识别到的物体坐标,可以直接去深度图里查询距离,这是很多视觉抓取项目的基础操作。我第一次做机械臂抓取时,就是因为没做对齐,导致2D检测框和深度坐标对不上,后来查了官方文档才发现这个重要步骤。

C++里对应的是rs2::align对象,用法逻辑一样。这一步不是必须的,但如果你后面要写视觉算法,建议从一开始就养着对齐的好习惯。

5. 我踩过的坑与排查清单

5.1 设备识别不到或提示权限不足

这是出现频率最高的问题,基本分成两种情况。第一种是rs-enumerate-devices直接找不到设备。先检查lsusb看系统层面有没有枚举到设备,如果lsusb里也没有,那大概率是硬件连接问题,换一根线、换一个USB口试试。特别提醒,不要在USB 2.0口上插D405,它虽然能识别到,但带宽完全不够,数据传输会异常。

第二种是设备能枚举,但打开时报Permission Denied。这就是我前面说的plugdev用户组没配置好。解决办法很简单:

sudo usermod -a -G plugdev $USER sudo udevadm control --reload-rules && sudo udevadm trigger

然后重新插拔相机。udevadm重新加载规则是很多教程里不会提的,但有几次我忘了执行它,导致重新插拔后权限依然没生效,卡了好半天。

5.2 viewer白屏、闪退或画面异常

如果你启动realsense-viewer后窗口白屏,或者一打开就闪退,多半是显卡驱动或OpenGL库的问题。Ubuntu 22.04自带的开源驱动对大多数集成显卡都能正常工作,但如果你用的是NVIDIA独显,建议先确认显卡驱动是否装好,可以运行nvidia-smi看一眼。

还有一种情况是viewer能启动,但画面是花的或者闪烁,这时优先怀疑USB带宽和供电。D405的深度+彩色双路流数据量不小,如果插在扩展坞或者前置USB口上,很容易出现带宽不足。尽量插在机身背面的原生USB 3.0口上。

如果以上都没问题,再看一眼DKMS模块是否加载成功:

dkms status

正常情况下你会看到类似librealsense2/2.x.x的记录。如果这里为空,说明内核模块没装上,可以尝试重新安装dkms包:

sudo apt install --reinstall librealsense2-dkms sudo modprobe uvcvideo

5.3 深度数据抖动和黑屏问题

深度图出现大面积黑色,是最容易让人误以为设备坏掉的情况。对D405来说,黑屏最常见原因是物体离得太近或太远。它的有效范围就是我开头说的0.1到0.5米,超过这个范围深度值算不出来,自然就是黑的。你把物体放到合适距离,黑色区域会立刻消失,不用慌。

深度数据抖动则是另一个常见问题。抖动可能来自环境光干扰,也可能是曝光参数没调好。在realsense-viewer右侧的深度相机设置里把Enable Auto Exposure关掉,手动调小曝光值,抖动通常会缓解。要不要打开HDR模式取决于场景,但D405这种近距离设备,一般默认参数已经挺稳,改参数时一次只改一个,方便定位问题。

5.4 常见问题速查表

现象可能原因解决办法
设备完全识别不到USB线/口损坏,USB 2.0带宽不足换线、换原生USB 3.0口,查看lsusb
权限不足拒绝访问当前用户不在plugdev组sudo usermod -a -G plugdev $USER并重新插拔
viewer白屏或闪退显卡驱动/OpenGL库问题检查nvidia-smi,安装mesa-utils
画面花屏闪烁USB供电不稳或带宽不足换接口,避免扩展坞
深度图大面积黑色物体超出D405有效距离调整到10cm-50cm范围内
深度值轻微抖动环境光干扰或曝光参数不合适手动调曝光,关闭自动曝光再微调
程序启动报找不到动态库源码编译和apt安装混用卸载一份,保持单一版本

最后分享一点我的个人体会

这次配置D405的过程,最大的感受是:难的不是装驱动,而是很多人把它当普通摄像头看待,忽略了短距离全局快门这两个核心特性。你只有理解了它适合什么场景,才能把参数调到正确的位置。如果你也是第一次用,我强烈建议先花十分钟在realsense-viewer里把不同分辨率、不同距离下的画面都看一遍,再写代码。这样后面调参时会省很多时间。另外,等环境完全跑通后,可以继续研究bag包录制和回放,那对算法调试非常有用,尤其是你需要反复测试同一个抓取动作时,先把数据录下来比对着调试,效率提升非常明显。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询