
RealSense D435i 与 librealsense SDK从测距到深度滤波的实践手册【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsenselibrealsense 是 Intel RealSense 深度相机的官方 SDKD435i 是其带 6 轴 IMU 的立体深度机型。它把深度流、RGB 流与惯性数据统一在一套 pipeline API 下适合要写机器人避障、三维测量、SLAM 前置模块的 C/C 开发者。能力速览项内容深度流立体双目 红外投影典型工作距离 0.3 m 至 6 m最高 1280×72090fpsRGB 流独立彩色摄像头可与深度对齐到同一视口IMU加速度计 陀螺仪每个样本携带深度传感器硬件时钟时间戳天然可与深度帧对齐后处理降采样、空间、时间、空洞填充等独立滤镜块可任意串联录制回放内建 recorder / playback 设备采集一次可离线复现不适合纯 2D 视觉检测场景直接用彩色摄像头即可超长距离激光级测距虚拟机内使用官方不支持 USB 3.0 透传三步装好 SDK 并跑通第一帧Ubuntu 20/22/24 LTS 的流程是装依赖、补 udev 规则、打内核补丁、cmake 构建。内核补丁必须做否则深度流不稳定。git clone https://gitcode.com/GitHub_Trending/li/librealsense cd librealsense ./scripts/setup_udev_rules.sh ./scripts/patch-realsense-ubuntu-lts-hwe.sh mkdir build cd build cmake .. -DBUILD_EXAMPLEStrue -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install装完用rs-enumerate-devices确认设备在列。最小程序 10 行以内就能读距离仓库内完整示例在 examples/hello-realsense/#include librealsense2/rs.hpp rs2::pipeline pipe; rs2::config cfg; cfg.enable_stream(RS2_STREAM_DEPTH); pipe.start(cfg); while (true) { auto depth pipe.wait_for_frames().get_depth_frame(); // 单位米无效像素返回 0 std::cout depth.get_distance(depth.get_width() / 2, depth.get_height() / 2) m\n; }wait_for_frames()阻塞到帧到齐get_distance(x, y)已把单位换算好返回米。要拿原始毫米值就自己读get_data()并乘以RS2_OPTION_DEPTH_UNITS。核心用法测距与两点距离单点距离用get_distance即可。两点间的真实三维距离要先反投影到 3D 再算欧氏距离仓库里的 examples/measure/ 做了完整的可拖拽标尺实现关键就三步rs2_intrinsics intr depth.get_profile() .asrs2::video_stream_profile().get_intrinsics(); float px[2], p3d[3]; rs2_deproject_pixel_to_point(p3d, intr, px, dist); // 两个像素各做一次再对 p3d 求欧氏距离深度滤波参数怎么调官方推荐链路与各滤镜参数如下完整可交互示例在 examples/post-processing/说明文档见 doc/post-processing-filters.md滤镜作用关键选项取值 / 默认decimation降采样顺手补小洞RS2_OPTION_FILTER_MAGNITUDE2–8默认 2disparity_transform转视差域再滤波远处噪声更均匀构造参数true/false—spatial保边平滑RS2_OPTION_FILTER_SMOOTH_ALPHA/RS2_OPTION_FILTER_SMOOTH_DELTA0.25–1 默认 0.51–50 默认 20temporal时间降噪依赖历史帧动态场景会拖影RS2_OPTION_FILTER_SMOOTH_ALPHA/RS2_OPTION_FILTER_SMOOTH_DELTA默认 0.4 / 20hole_filling用四邻补无效像素RS2_OPTION_HOLE_FILLING0–2默认 1取最远邻rs2::decimation_filter dec; rs2::spatial_filter spat; rs2::temporal_filter temp; spat.set_option(RS2_OPTION_FILTER_SMOOTH_DELTA, 20); rs2::frame out depth; out dec.process(out); out spat.process(out); out temp.process(out);注意滤镜对象在多线程间共享状态每台设备维护一条滤镜链temporal 换帧源会丢失历史效果直接失效。多流同步深度加 IMU深度、RGB 由 pipeline 自动打包进同一个framesetIMU 帧率远高于视频走单帧通道。用first_or_default按流类型取帧即可rs2::config cfg; cfg.enable_stream(RS2_STREAM_GYRO); cfg.enable_stream(RS2_STREAM_ACCEL); pipe.start(cfg); while (true) { auto set pipe.wait_for_frames(); if (auto g set.first_or_default(RS2_STREAM_GYRO)) rs2_vector v g.get_motion_data(); // 角速度 rad/s if (auto a set.first_or_default(RS2_STREAM_ACCEL)) // a.get_motion_data() 静止时 y 分量约 -9.8 }IMU 样本时间戳与深度帧同一时钟取frame.get_timestamp()相减就是真实时间差做运动补偿不需要校时。需要自定义多流合流规则时用rs2::syncer构造回调把pipe.start(syncer)的回调接到队列上低延迟场景整体换成回调模式参考 examples/callback/。生成点云rs2::pointcloud pc; pc.map_to(color); // 贴彩色纹理 auto points pc.calculate(depth); // points.get_vertices() 每 3 个 float 一个点完整渲染版在 examples/pointcloud/。生成点云前先对齐rs2::align的构造是重操作放在主循环外rs2::align align_to_depth(RS2_STREAM_DEPTH); rs2::frameset out align_to_depth.process(set);对齐是合成视口会引入采样和遮挡伪影examples/align/ 有双向对齐的可视化对比。调优与进阶按这个顺序调收益从高到低分辨率与帧率。CPU 不够就降深度分辨率或帧率别先加滤镜——滤镜是 CPU 开销大户。滤镜链路。CPU 吃紧时只开 decimation spatial追求平面平滑度再叠 temporal边缘毛刺多就把 spatial 的RS2_OPTION_FILTER_SMOOTH_DELTA调大默认 20上限 50空洞多再上 hole_filling。视觉预设。D400 系列支持RS2_OPTION_VISUAL_PRESET测距场景直接切高精度档auto sensor pipe.get_active_profile().get_device() .firstrs2::depth_sensor(); sensor.set_option(RS2_OPTION_VISUAL_PRESET, RS2_RS400_VISUAL_PRESET_HIGH_ACCURACY);高级模式。rs400::advanced_mode暴露约百个硬件参数可save_json/load_json序列化整套配置。改坏能退出高级模式恢复默认但深度质量与帧率不再保证。参数面板长这样深度质量工具。tools/depth-quality/ 内置 Z / Zi / ZPi 三类误差统计用它做参数调优的量化验收比肉眼判断可靠。实战场景场景一桌面式尺寸测量目标相机固定量取画面中两点间距离。步骤参考 examples/measure/ 起 pipeline深度 RGBA 彩色双流设RS2_RS400_VISUAL_PRESET_HIGH_ACCURACY滤镜链用 decimation(2) → spatial开RS2_OPTION_HOLES_FILL→ temporal避免标尺路径从洞里穿过去对鼠标两点反投影求 3D 距离。验证放一根已知长度的钢尺正对相机读数偏差应在 1–2 cm 内偏差大先检查相机是否水平再看 Z 误差统计。场景二录制一次、离线调参目标现场采集困难把数据带回办公室反复试验。步骤用 tools/recorder/ 或 recorder 设备录.bagIMU 流一并包含本地用 playback 设备打开 bagpipeline 代码不用改device.asrs2::playback()判一下即可在回放数据上迭代滤镜参数与高级 JSON 配置。验证回放帧的时间戳、分辨率、数据与原始采集逐位一致rs-replay可直接复放。完整 GUI 示例见 examples/record-playback/。排障速查现象可能原因处理rs-enumerate-devices列不出设备udev 规则未装 / 内核补丁未生效重跑./scripts/setup_udev_rules.sh与patch-realsense-ubuntu-lts-hwe.shsudo dmesg | tail -n 50查新 uvcvideo 驱动是否注册深度大面积空洞或全 0距离超量程 / 红外被强光压制 / 镜片脏拉近到 6 m 内遮避阳光直射用RS2_OPTION_LASER_POWER提功率IMU 静止时角速度非零、重力不等于 9.80665BMI055 出厂无内参校准跑 tools/rs-imu-calibration/结果写入设备 NVRAMSDK 自动读取帧率上不去总线带宽或 CPU 瓶颈降分辨率/帧率确认 USB 3.0 直连、未走虚拟机wait_for_frames报 profile 不匹配设备不支持该组合用rs-enumerate-devices核对可用流与帧率资源索引常用工具安装后即可全局调用工具用途rs-enumerate-devices列出设备与全部可用流realsense-viewer交互式查看器可视化 IMU 与深度rs-capture/rs-replay命令行抓帧 / 回放 bagrs-imu-calibrationIMU 内参校准深度质量工具tools/depth-quality/ 误差统计关键文档与示例坐标系与 IMU 集成doc/d435i.md滤镜说明doc/post-processing-filters.md高级模式doc/rs400/rs400_advanced_mode.md安装doc/installation.md录制回放doc/record-and-playback.md示例总目录examples/D435i 加上 librealsense深度、RGB、IMU 三路数据的时间对齐和坐标统一都已处理开发者剩下的工作集中在滤波链与业务逻辑上。建议从rs-enumerate-devices和 hello-realsense 起步再按本文的调优顺序逐步加滤镜。延伸阅读doc/stepbystep/getting_started_with_openCV.md 和 examples/sensor-control/ 中的传感器选项参考。【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考