尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ROS2 Humble 下 RealSense D435i 深度图、点云与 IMU 实战
玩机器人的朋友迟早会碰到这么一天手头多了台 RealSense D435i想在 Ubuntu 22.04 ROS2 Humble 的环境里把它跑起来顺手出深度图、点云甚至把 IMU 数据也一起接了。这套组合在视觉 SLAM、导航避障、机械臂抓取里出现频率高得离谱几乎可以说是入门深度视觉的标准配置。这篇文章就完整记录我从系统安装到驱动运行、再到深度和点云功能落地的整个流程包含每个命令、每个参数、每次踩坑适合刚拿到 D435i、准备在 ROS2 里做视觉应用的朋友当作一份可直接照做的操作手册。1. 为什么非得是这套组合Ubuntu 22.04、Humble 与 D435i 的匹配关系1.1 版本搭配为什么是 22.04 配 HumbleROS2 的版本和 Ubuntu 版本是严格绑定的。Humble Hawksbill 是 ROS2 的长期支持版本官方明确支持 Ubuntu 22.04 Jammy。这意味着你在这套系统上装的每一个二进制包、依赖库、编译工具链都是按 22.04 的环境验证过的。换一个组合比如用 20.04 硬装 Humble 的 deb 包大概率会碰到依赖冲突最后所有时间都耗在修环境上。很多人问过为什么不直接用 ROS1 Noetic。答案很简单新项目没有理由再回 ROS1 了。ROS2 的话题和服务机制、参数系统、launch 方式虽然学习曲线更陡一点但长期来看生态已经全面转向 ROS2D435i 的官方驱动也同时维护 ROS1 和 ROS2 两个分支。既然要从头搭就直接踩在 ROS2 Humble 这条稳定线上省得半年后又被迫迁移一次。1.2 D435i 的选型思考D435 和 D435i 差在哪RealSense 家族里 D435 和 D435i 外观几乎一样核心差别就是 D435i 多了一颗 IMU 惯性测量单元。这颗 IMU 提供加速度计和陀螺仪数据对做 VIO、视觉惯性导航、里程计融合的人来说是刚需。如果没有 SLAM 或姿态估计需求只做单纯的深度测量D435 就够用一旦涉及机器人移动、无人机悬停、AR 设备姿态追踪IMU 能省掉很多后期硬件改造的工夫。D435i 本身的深度原理是主动红外立体视觉左右两个红外相机拍下带结构光纹理的图像通过视差计算深度。它不像 ToF 方案那样对强光敏感室内环境非常稳室外阳光直射下会受影响但绝大多数机器人场景都在室内或半室内这个特性完全够用。加上官方驱动开源、issue 区活跃、社区资料密集踩坑时基本都能搜到答案对个人开发者非常友好。1.3 ROS1 转 ROS2 你需要重新认识的几个点如果你以前熟悉 ROS1切到 ROS2 后有几个地方必须重建习惯。首先是工具的差异rosrun变成了ros2 runroslaunch变成了ros2 launchrostopic变成了ros2 topic。看着区别不大实际用法差别不小。其次是编译系统ROS1 用 catkinROS2 用 colcon工作区结构不变但编译命令和 package 配置逻辑完全不同。最核心的变化是底层通信从自研的 TCPROS 换成了 DDS。DDS 这套东西引入话题发现、QoS 策略等概念最直观的影响是节点发现变慢、网络环境复杂时可能互相找不到。用 D435i 驱动时如果同一台机器上多个节点通信异常多半不是相机问题而是 QoS 不匹配。对这些差异有心理准备后面排错会省很多力。2. 从零部署系统装上 ROS2 Humble 的过程与验证2.1 系统与基础工具准备安装 Ubuntu 22.04 时建议给根分区留出至少 80GB。编译 librealsense 和 realsense-ros2 都需要大量临时空间源码加中间产物动辄几十 GB磁盘不够会出现一些非常诡异的编译报错。内存最好 16GB 起步8GB 也能跑但编译时make的并发数要保守否则分分钟被系统 OOM 杀掉。装完系统后先把基础工具补齐sudo apt update sudo apt install -y git cmake build-essential curl \ libssl-dev libusb-1.0-0-dev pkg-config \ libgtk-3-dev libglfw3-dev libudev-dev \ libpython3-dev python3-pip这些包里面libusb和libudev是相机底层通信和权限管理的关键libgtk和libglfw是给后面的 realsense-viewer 图形界面用的。缺了它们编译时不会立刻报错但程序运行或某些功能会异常所以一次装齐最省事。2.2 安装 ROS2 Humble 的完整步骤ROS2 官方文档给的流程是标准的我实际执行时稍微调整了顺序避免后面的权限问题。先添加 ROS2 软件源和 GPG 密钥sudo apt install software-properties-common sudo add-apt-repository universe sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null sudo apt update然后安装桌面版完整套件sudo apt install -y ros-humble-desktop python3-colcon-common-extensions python3-rosdepros-humble-desktop包含了常用工具、可视化、仿真和示例节点对大多数用途来说完全够。装完之后把环境变量写进 bashrc否则每次新开终端都要手动 sourceecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrcrosdep 是后面编译依赖的工具初始化一下sudo rosdep init rosdep update2.3 快速验证talker 和 listener环境装没装好用官方的 demo 节点验证最快。开两个终端终端一执行ros2 run demo_nodes_cpp talker终端二执行ros2 run demo_nodes_cpp listener如果能看到终端一持续发布Publishing: Hello World、终端二不断接收打印说明 ROS2 核心通信已经正常。这一步一定要做因为后面启动相机驱动时如果 ROS2 本身有问题你会分不清是相机的问题还是系统的问题。3. 编译 librealsense 与固件升级让相机先被系统看见3.1 从源码编译 librealsense 的前因后果ROS2 的 realsense-ros2 驱动本身不直接跟硬件通信它依赖底层的 SDK 库。Ubuntu 官方源里其实有 librealsense 的二进制包但版本通常偏旧。我在实际项目里遇到过旧版 SDK 不认新固件相机的情况表现为设备能枚举但打开摄像头流失败。所以最稳的方案是直接克隆官方仓库从源码编译锁定的 SDK 和固件版本可以完全自己控制。也有人用 apt 装librealsense2-dkms来省事但 DKMS 模块的灵活度有限而且你需要自己额外配 ROS2 包装层。相比之下源码编译并不复杂一次装好长期稳定遇到问题也更容易定位。3.2 编译安装的完整流程克隆官方 SDK 仓库git clone https://github.com/IntelRealSense/librealsense.git cd librealsense进入目录后执行mkdir build cd build cmake ../ -DBUILD_EXAMPLEStrue -DBUILD_GRAPHICAL_EXAMPLEStrue sudo make install这里有两个细节值得说清楚。第一cmake时我打开了示例和图形工具的编译开关这会多编译 realsense-viewer、rs-enumerate-devices 等工具后面测试和查错都要靠它们。如果磁盘紧张至少保留BUILD_EXAMPLEStrue。第二make的并发数要看你机器配置我自己的机器是 16GB 内存直接make -j$(nproc)编译到一半被 OOM 杀过后来老实改成sudo make -j4 install如果你内存不大-j2更稳妥。编译时间大概 10 到 20 分钟取决于硬件。编译完可以用内置工具验证 SDK 是否认识相机realsense-viewer插上 D435i界面里应该能看到设备型号、固件版本、序列号并且能实时打开 RGB、深度和红外流。到这一步相机在 Linux 层已经被正确识别了。3.3 udev 权限规则与固件升级普通用户插上相机后打开 viewer 经常提示找不到设备原因基本是权限问题。RealSense SDK 仓库里带了一个现成的规则脚本执行一下cd librealsense sudo ./scripts/setup_udev_rules.sh脚本会往/etc/udev/rules.d/写入设备和权限规则然后重新插拔 USB 即可。如果不执行这一步ros2 launch启动驱动时大概率会报No device detected即使设备能够被系统枚举。固件版本方面新出厂的 D435i 固件一般不会太老但二手设备和长期搁置的库存机就需要检查。viewer 的左上角设备信息里能看到当前固件版本如果低于官方对最新 SDK 的支持范围建议升级。升级路径有两条一是直接从 viewer 的界面点击升级会提示下载对应 bin 文件二是用命令行工具rs-fw-update -f 固件文件路径升级固件时务必保证供电稳定最好用原装线直连主板 USB 口不要通过扩展坞。我见过升级过程中断电把相机变砖的案例虽然不是完全无法恢复但折腾起来非常痛苦。4. 编译 realsense-ros2在 ROS2 里点亮相机4.1 创建 ROS2 工作空间并拉取驱动源码SDK 搞定后真正接入 ROS2 还需要驱动包。创建工作空间并克隆驱动源码mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src git clone https://github.com/IntelRealSense/realsense-ros2.git克隆完成后用 rosdep 检查缺什么依赖cd ~/ros2_ws rosdep install --from-paths src --ignore-src -r -yrosdep 会把 launch 文件、消息包、依赖库一次性列出并尝试安装。如果这一步报错某个 rosdep 找不到多刷几次rosdep update基本能解决。4.2 colcon 编译和启动相机依赖齐了就可以编译cd ~/ros2_ws colcon build --symlink-install source install/setup.bash--symlink-install是为了开发期间改 Python 脚本或 launch 文件不用重新编译对日常调参来说很实用。编译完成后启动相机ros2 launch realsense2_camera rs_launch.py正常启动的话终端会打印设备信息、各流开启状态然后你可以打开另一个终端查看话题ros2 topic list应该能看到类似这些话题/camera/color/image_raw /camera/depth/image_rect_raw /camera/depth/color/points /camera/infra1/image_rect_raw /camera/infra2/image_rect_raw /camera/imu看到这些话题说明驱动已经正常把相机数据发到 ROS2 里了。4.3 launch 参数详细解读rs_launch.py 有很多参数可以用来控制相机行为。我在实际项目里经常改的几个如下参数作用我的建议值depth_module.depth_profile深度流分辨率和帧率640x480x30别盲目上 1280x720rgb_camera.color_profileRGB 流分辨率和帧率640x480x30够用且资源占用小pointcloud.enable是否开启点云需要点云时设为truealign_depth深度图是否对齐到彩色图做图像融合时设为trueenable_imu是否开启 IMU需要 IMU 时设为trueserial_no指定多相机中的某一台多相机时必填比如我需要同时开启点云和深度对齐会这样启动ros2 launch realsense2_camera rs_launch.py \ depth_module.depth_profile:640x480x30 \ rgb_camera.color_profile:640x480x30 \ pointcloud.enable:true \ align_depth:true注意参数名的层级关系。depth_module.前缀对应的是相机节点的私有参数align_depth这类顶层参数对应驱动的高级开关。写错层级不会报错但参数不生效调试时容易产生困惑。4.4 RViz 里看点云数据有没有真的出来用 RViz 看一眼最直观。启动 RVizrviz2左侧面板点击Add按By topic找到/camera/depth/color/points把Fixed Frame设置为camera_link或者camera_depth_optical_frame。如果点云没显示九成是坐标系没设对。彩色点云的显示需要把Color Transformer改为RGB8Size调小一点点云细节就出来了。第一次在 RViz 里看到 D435i 实时重建的桌面点时整个环境基本算验收通过了。5. 深度对齐、点云与 IMU三个核心能力的实战用法5.1 深度图与彩色图对齐为什么要对、怎么对D435i 的深度相机和彩色相机在物理上是两个镜头成像的视野和原点都不完全一致。深度图上的某个像素点坐标和彩色图上同一个物体的像素坐标是有偏差的。做目标检测后取深度、或者做图像分割结合深度信息时这种偏差会直接导致测距错误。解决方式就是把深度图对齐到彩色图。启动时加上align_depth:true会出现新话题/camera/aligned_depth_to_color/image_raw这个话题里的深度图像素坐标系和彩色图严格对应。你可以简单理解成两张图像先做了一次坐标系变换然后叠在一起每个像素都能直接互相查。实测下来对齐后深度图和彩色图的边缘误差能控制在几个像素以内对大部分应用足够了。5.2 点云输出与保存思路开启pointcloud.enable:true后驱动会发布/camera/depth/color/points类型是sensor_msgs/msg/PointCloud2。在机器人导航里这个点云可以直接交给后续的障碍物检测、地面分割、3D 重建模块。如果你想把点云保存下来做离线分析最简单的办法是用 ROS2 bag 录制ros2 bag record /camera/depth/color/points录制生成的 bag 可以用 rosbag2 工具离线回放配合 PCL 库再做转换和保存 PCD 文件。实时保存 PCD 也不难写一个订阅PointCloud2的 Python 节点用sensor_msgs_py转成 numpy 数组再写文件即可。点云话题数据量很大长时间录制注意磁盘占用我建议按需录制别一直开。5.3 IMU 数据读取与应用D435i 的 IMU 数据在驱动启动后自动发布话题是/camera/imu类型是sensor_msgs/msg/Imu里面包含了四元数姿态、角速度、线性加速度。取消 IMU 可以用参数enable_imu:false需要时再开。在视觉惯性里程计里IMU 数据通常和图像数据做时间戳对齐后一起送入状态估计器。值得注意的一点是D435i 的 IMU 输出频率可以在驱动内配置默认是 200Hz 左右实际使用时我一般配合算法需求调成 100Hz 或 400Hz。具体参数是imu_frequency单位 Hz根据需要设置。如果只是拿来做简单的姿态判断可以订阅/camera/imu里的四元数但要注意原始 IMU 数据没有经过滤波静止时也会有小幅漂移。想要准确姿态需要做静态初始化、零偏估计和标定。D435i 出厂有基本标定但每次装机后做一次快速标定能把数据质量提升不少。5.4 一个实用的小综合用对齐深度辅助目标测距深度对齐带来的最直接好处是可以在目标检测框内直接取深度值做测距。比如我用 YOLO 检测到一个目标拿到了它在彩色图上的像素坐标这时候订阅/camera/aligned_depth_to_color/image_raw取出该坐标下的深度值转成三维点就可以得到目标距离。具体计算时要注意深度图某些位置可能是 0 或无效值取检测框中心点不一定可靠。我的做法是取检测框内所有有效深度值的中位数去掉异常点后稳定很多。这个思路在机械臂抓取、巡检机器人避障里都实用能快速得到目标空间位置而不用额外做复杂的标定和变换。6. 高频问题排查权限、带宽、固件与多相机6.1 常见报错与排查速查表下面是这段时间使用中沉淀出来的问题速查表基本覆盖了新手阶段能遇到的大多数坑现象可能原因解决方式No device detected没有刷 udev 规则执行./scripts/setup_udev_rules.sh后重新插拔viewer 打不开相机流固件过老检查并升级固件版本画面帧率比设置的低很多USB 接口是 2.0换成主板 USB 3.0 蓝色接口点云在 RViz 不显示Fixed Frame 错误改为camera_link或camera_depth_optical_frame多个话题 QoS 不匹配订阅端 QoS 策略错误让订阅端使用相机的 QoS 策略或改为BEST_EFFORTlong 时间运行后掉帧温度和 USB 带宽降分辨率、检查散热、加 USB 外设供电ros2 launch卡住不动ROS2 daemon 状态异常ros2 daemon stop ros2 daemon start重试6.2 USB 带宽与接口问题D435i 对 USB 线路质量非常敏感。我一开始用笔记本右侧的 USB 口连接深度和 RGB 都设置 640x480x30偶尔出现掉帧和花屏换了左侧直连主板的口之后一切正常。D435i 是 USB3.0 设备默认以 5Gbps 带宽工作如果插在 USB2.0 口上虽然也能识别但帧率和分辨率会被显著限制画面卡顿到没法用。另外延长线和扩展坞尽量别用。USB3.0 对线材的质量要求很高劣质延长线会导致传输不稳定出现图像撕裂或者设备反复断开重连。如果线材必须很长建议用带芯片的主动延长线别贪便宜。6.3 多相机同时运行的配置一台机器带两台 D435i 时最关键的是用序列号区分设备。用下面的命令查看设备序列号rs-enumerate-devices拿到序列号后分别启动两个驱动实例ros2 launch realsense2_camera rs_launch.py camera_name:camera1 serial_no:xxxx ros2 launch realsense2_camera rs_launch.py camera_name:camera2 serial_no:yyyycamera_name参数会改变话题前缀。如果不设置两个驱动节点都叫camera话题互相覆盖数据混乱。我调试多相机时还注意到两台相机的红外发射器可能互相干扰如果深度效果不好可以把其中一台的emitter_enabled设为 0 再观察。6.4 Docker 容器内访问相机很多项目把环境封装成 Docker 镜像容器里访问 D435i 需要注意设备映射。最省事的启动参数是docker run -it --privileged --networkhost my_image--privileged虽然给了容器完全权限但对相机这种 USB 设备是最直接的解决办法适合个人开发场景。更规范的做法是映射/dev/bus/usb挂载进去docker run -it --device/dev/bus/usb:/dev/bus/usb my_image容器里需要安装相同版本的 librealsense SDK并保证 udev 规则在主机侧生效。我在容器内跑 ros2 launch 时遇到过设备枚举问题后来发现是主机没刷 udev 规则容器怎么映射都没用先检查主机侧。7. 调参与长期运行经验这台相机的脾性我摸得差不多了7.1 推荐参数组合与调参心得日常使用我固定采取这样一套参数depth_module.depth_profile:640x480x30 rgb_camera.color_profile:640x480x30 pointcloud.enable:true align_depth:true enable_imu:true640x480 在多数机器人导航任务里足够用而且能稳定跑 30 帧CPU 占用也可控。分辨率跳到 1280x720 后视觉质量确实提升但点云同步开启时 CPU 和带宽压力成倍增加换来的收益不明显。所以除非确实需要高密度点云做建模否则尽量保持在 VGA 级别。自动曝光方面D435i 的深度模块有enable_auto_exposure参数默认开启。如果测试环境光照稳定手动固定曝光值反而能减少输出噪声。我在一个室内走廊测试时就遇到自动曝光导致深度图亮度飘忽的问题固定曝光后点云干净了很多。7.2 发热、掉帧与稳定性维护D435i 长时间运行后外壳温度很高这是正常现象不会立刻损坏但高温会影响深度质量和长期可靠性。在机器人上安装时别把它包在密封舱里尽量保证散热通风。我曾经把相机用扎带固定在狭小的云台内部跑半小时后深度图开始出现条纹拆掉外壳散热后问题消失。数据流稳定性方面当点云、彩色、深多路同时开启CPU 单核容易冲高。此时可以把点云发布频率调低或者关掉不需要的红外流。驱动里默认会开启红外图和 RGB 等多路流实际用不到的流可以用enable_infra1:false和enable_infra2:false关掉能省出不少资源。最后说一个每次结束时的习惯跑完 launch 后直接CtrlC结束偶尔会出现节点没退干净的情况重新启动时报端口被占用。这时候执行一下ros2 daemon stop清理速度比你手动 kill 进程快得多。这些看起来都是小事但积累起来就是每天调试的效率差距。D435i 是一个上限很高、下限也不低的设备和 Ubuntu 22.04 ROS2 Humble 这套环境磨合好之后它会成为你机器人视觉开发里最趁手的传感器之一。
RELATED

相关推荐

降AI率不是玄学:三步加工法把AI内容变成自己的论文

降AI率不是玄学:三步加工法把AI内容变成自己的论文

最近一段时间,私信里被问得最多的一件事,就是“2025届毕业生推荐的降AI率方案”到底靠不靠谱。不少同学正处在毕业论文初稿刚写完、准备降重的阶段,结果用AI查了一遍,跳出来一个刺眼的“高概率AI生成”提示,整个人就慌…

📅 2026/10/24 6:51:00
Linux 高性能网络:NtyCo 协程实现百万 TCP 并发连接

Linux 高性能网络:NtyCo 协程实现百万 TCP 并发连接

NtyCo 这样的协程库,究竟能不能在客户端和服务端之间维持百万级 TCP 连接?协程在高并发服务端中能带来什么好处?Linux 内核需要怎样调优?出现 OOM 时,又应该从哪里定位和优化? 本文以一次 NtyCo 百万连接实…

📅 2026/10/24 6:46:00
12. Agent 记忆压缩通常有哪些方法?

12. Agent 记忆压缩通常有哪些方法?

12. Agent 记忆压缩通常有哪些方法?

📅 2026/10/24 6:46:00
MORE NEWS

更多资讯

📰

PaddleOCRv5离线识别全场景多语种验证码:TaoToken统一Key接入与onnxruntime本地推理验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

YOLOv5手势识别实战:从数据标注到模型部署的完整链路与TaoToken API接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

从简历词到真实力:技能构建、刻意练习与组合优势

去年在团队内部做技术评审的时候,我发现一个特别普遍的现象:很多人在聊“skills”这个词的时候,其实都是在聊简历上那一串工具名。你说你会某门语言,结果一追问底层机制,答不上来;你说你熟悉某个平台&#…

📰

技术人如何构建可迁移的技能体系:从问题排查到刻意练习的深度拆解

1. 从“skills”这个标题说起:一个被严重低估的硬核话题“skills”这个词,放在任何技术社区里都显得平平无奇。它不像“高并发”“分布式”“大模型”那样自带流量,也不像“从零手写”“万字长文”那样有标题党潜质。但恰恰是这个看起来最普通…

📰

SpringBoot社区老年康养系统开发与智能提醒实现

1. 项目概述:社区老年康养管理系统的核心价值这个基于SpringBoot的社区老年康养管理系统,是我在参与某社区智慧养老项目时的实战成果。系统最核心的创新点在于"个性化智能提醒"功能模块——它不仅仅是简单的健康档案管理,而是通过算…

📰

基于双口RAM的FPGA计数器设计:原理、实现与仿真验证

简介:这是一份FPGA课程设计报告,围绕“采用RAM实现计数器”展开,面向学习Verilog HDL、Quartus II与Modelsim的数字电路设计者。任务要求用108双口RAM完成10个8位计数器,初值1~10,主时钟50MHz经分频得到1MHz与1Hz计数时…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬