ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Intel RealSense D455实测:三大SLAM方案对比与调优指南

Intel RealSense D455实测:三大SLAM方案对比与调优指南 这几年做室内移动机器人和AR场景感知的项目深度相机的选型绕不开 Intel RealSense 家族。手头这台 D455 我用了大半年从最开始接 rtabmap 做实时建图到后来折腾 ORB-SLAM3 做轻量级视觉里程计再到为了融合 IMU 上了 VINS-Fusion几乎把三种典型方案都走了一遍。这篇文章没有任何广告成分纯粹记录同一台 D455 在三条技术路线下的实际表现、参数调整和踩坑经历给想入坑或者正在纠结的人一个参考。先说结论D455 不是最便宜的深度相机像 D435i 在某些渠道更便宜而且同样带 IMU但 D455 在深度精度、双目基线长度和测距范围上确实做了取舍。D435i 的基线太短近距离精度尚可中远距离深度噪声偏大D455 的基线加长到了 95mm配合全局快门传感器在 0.48m 到 6m 范围内都能输出合理深度。对于室内建图和视觉SLAM来说这个范围刚好覆盖了最常用的工作距离。很多人纠结这三个方案到底选哪个。我的答案是没有绝对最优只有场景匹配。rtabmap 适合快速拿到彩色稠密点云和可导航的 2D/3D 栅格地图开箱即用ORB-SLAM3 在特征丰富环境下轨迹精度高但稀疏点云对后续导航帮助有限VINS-Fusion 则特别适合无人机或者移动机器人这种对实时位姿平滑度要求高的场景IMU 补足了纯视觉在快速运动时的短板。文章下面我会先从 D455 的选型逻辑说起再分别讲三条路线怎么接、怎么调、效果如何。1. 选型逻辑为什么最终留下的是 D455 而不是更便宜的 D435i1.1 D455 的参数细节与真实体验D455 的核心硬件参数我在选型阶段反复研究过这里给出一份可直接对照的表参数项D455D435i实际影响深度视场角87° × 58°86° × 57°差距很小深度范围0.48m - 6m0.28m - 3m中远距离感知差距明显双目基线95mm50mm距离越远越需要长基线RGB 分辨率1280 × 800 30fps1920 × 1080 30fps彩色流两者都够用深度分辨率1280 × 720 90fps1280 × 720 90fps相同内置 IMUBMI055BMI055两者都有供电接口USB 3.0 Type-CUSB 3.0 Type-C注意供电稳定性即可实测下来D455 在 3m 以上的深度明显比 D435i 稳。我在走廊里对比过同时用两台相机拍同一面墙D435i 在 4m 处已经开始出现大量黑色空洞D455 还能保持基本完整的深度平面。这个差异来自基线长度的物理限制双目视差在小基线下对远处目标的分辨率天然不足长基线加长之后同样的物体在图像上的视差更大深度精度自然更高。不过反面也有代价D455 的近距离最小工作距离是 0.48m比 D435i 的 0.28m 差不少。如果你需要贴着物体表面重建D455 反而不合适。我一开始没注意这个参数拿着相机去扫桌面上的小物件结果 30cm 左右深度全部消失。1.2 为什么这套方案里 IMU 显得重要D455 内置的 BMI055 IMU 提供了 6 轴数据三轴加速度计加三轴陀螺仪这在 VINS-Fusion 的融合方案里是刚需。但 IMU 不是插上就有稳定数据需要使用官方 realsense-ros 驱动并正确启动否则在 ROS 里只会看到摄像头输出的图像话题。具体来说安装 realsense-ros 后启动相机的命令通常是roslaunch realsense2_camera rs_camera.launch \ unite_imu_method:copy \ enable_gyro:true \ enable_accel:trueunite_imu_method这个参数很多人不管默认值会输出分开的/camera/gyro/sample和/camera/accel/sample如果你用的框架需要单一 IMU 话题就得像上面那样合并成/camera/imu。VINS-Fusion 标准的配置是订阅单一 IMU 话题。另外提醒一点IMU 的坐标系和相机坐标系不是同一个原点严格使用 VINS-Fusion 前需要做外参标定。但如果你只是先跑通 pipeline用官方手册里的默认外参也能转起来精度会有一定损失。后面我会专门讲 VINS-Fusion 的标定细节。2. rtabmap 建图开箱即用的图优化方案与点云落地效果2.1 从零启动 rtabmap 的完整流程rtabmap 的全称是 Real-Time Appearance-Based Mapping核心思路是通过视觉词袋模型检测闭环再用图优化方式消除累计误差。它和 D455 的配合算是生态内最顺滑的组合因为两者都在 ROS 生态里直接启动 launch 文件即可。如果你是第一次接触建议不要用官方 rtabmap.launch 里的复杂参数先跑通最基本的 RGB-D 模式roslaunch realsense2_camera rs_camera.launch \ align_depth:true \ united_imu_method:copy roslaunch rtabmap_ros rtabmap.launch \ rtabmap_args:--delete_db_on_start关键是align_depth这个参数。D455 的深度图和 RGB 图原始视场有差异必须开启深度对齐到彩色坐标系否则后续 rtabmap 处理时深度和彩色像素对不上重建出来的点云会出现边缘重影。官方 realsense 的 align 机制是基于硬件同步和标定结果做的比自己手工对齐可靠得多。启动之后如果没有报错终端会滚动显示当前帧率、特征点数、闭环检测状态。如果看到RGB-D stream is not being synchronized或者TF not found之类的提示多半是 TF 树没有配置完整。我在实践里遇到最常见的问题是/camera_link到/map的 TF 缺失解决办法是额外发布一个静态 TFrosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 map camera_link这只是暂时绕开真正部署时应该把 TF 写进 URDF。2.2 调参重点地图密度与回环检测rtabmap 有几个参数对最终建图质量影响很大参数位置作用我的推荐值RGB-D/MaxFeaturesrtabmap 内参每帧提取的特征点数上限600RGB-D/BowMinInliers闭环检测判定闭环成立的最小内点0.3RGB-D/MaxDepth深度过滤最大有效深度4.0Grid/MaxDepth栅格地图栅格化时远距离点过滤4.0MaxFeatures不是越大越好。我在 D455 上试过 1000 个特征点帧率下降明显而且大量特征点集中在纹理丰富的局部区域对闭环检测没有好处降到 600 后帧率稳定在 30fps闭环召回率没有明显变化。MaxDepth我建议设置成 4.0 而不是默认的 6.0因为 D455 在 4m 以外的深度虽然还有输出但噪声方差明显增大这些远距离点会污染地图的平整度。如果你建图场景是个小房间距离不超过 3m甚至可以设到 3.0。闭环检测是 rtabmap 的强项BowMinInliers控制闭环确认的严格程度。调太大会漏检闭环调太小会出现假闭环导致地图漂移开裂。实测 0.3 是个平衡值如果环境里相似结构很多比如长走廊或者同款隔断可以升到 0.4。2.3 rtabmap 的产出和实际效果rtabmap 完整跑下来的产出有三类稠密彩色点云适合可视化展示和后续点云处理。2D/3D 栅格地图适合导航路径规划。相机轨迹位姿文件。实际用 D455 在一个约 8m × 10m 的办公室环境里走了两圈rtabmap 生成的稠密点云墙面平整度相当好天花板和地板区域因为有大量平面的原因重建效果明显优于只跑 ORB-SLAM3 得到的稀疏点云。唯一让我不太满意的是 CPU 占用率。因为 rtabmap 还要跑词袋模型和回环检测在 i7-10750H 笔记本上占到 60% 左右如果用的机载电脑性能弱一些需要考虑降分辨率或者降帧率。3. ORB-SLAM3 适配 D455特征点法在深度数据上的边界3.1 编译和依赖链的准备工作ORB-SLAM3 是一个学术风格很浓的项目编译体验和 rtabmap 差距巨大。它依赖 Pangolin、OpenCV、Eigen3、DBoW2 和 g2o其中 DBoW2 和 g2o 是内置在 Thirdparty 目录下单独编译的。整条链踩下来最麻烦的是 Pangolin版本太新会引入大量 API 变化版本太旧又编译不过。我的建议是直接使用 GitHub 上 ORB-SLAM3 官方 README 里指定的依赖版本范围Ubuntu 20.04 ROS Noetic 环境下了 Pangolin 0.6 这类的稳定版本。编译命令顺序cd Thirdparty/DBoW2 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j8 cd ../../g2o mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j8 cd ../../../ mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j8顺利的话整个编译半小时左右能完成。如果卡住优先排查 OpenCV 版本导致的头文件路径问题。3.2 RGB-D 模式下的相机模型配置ORB-SLAM3 跑 RGB-D 模式需要准备一个相机配置文件里面包含内参、畸变系数和深度因子。D455 的内参可以通过 realsense-viewer 或者官方rs-enumerate-devices命令导出也可以直接从 dynamic_reconfigure 的话题读取。一个典型的 D455 RGB-D 配置文件关键部分是Camera.fx: 380.0 Camera.fy: 380.0 Camera.cx: 320.0 Camera.cy: 240.0 Camera.k1: 0.12 Camera.k2: -0.30 Camera.p1: 0.0 Camera.p2: 0.0 Camera.k3: 0.10 Camera.width: 640 Camera.height: 480 Camera.fps: 30 Camera.RGB: 1 DepthMapFactor: 1000.0这里的 fx、fy、cx、cy 只是示例值每台相机的实际内参都有细微差别一定不要直接照抄。D455 出厂虽然在硬件层面做了 RGB 和深度对齐但出厂内参和实际装机后的值仍会有差异尤其是温度变化后镜头的微小形变都会影响精度。DepthMapFactor是另一个容易踩坑的地方。realsense 输出的深度图单位是毫米而 ORB-SLAM3 期望的深度图单位是米所以因子是 1000.0。如果设成 1整个地图的尺度会变成实际尺度的一千倍点云直接飞到天上去。这个错误我第一次跑就遇到了检查地图时发现特征点全飘在天花板上方花了半个小时才想起来是这个因子的问题。3.3 ORB-SLAM3 在 D455 上的表现和调优经验ORB-SLAM3 跑出来的地图是稀疏特征点云无法用于导航避障但其轨迹精度在特征丰富场景下非常惊人。我用 D455 在同一个办公室场景下采集了一段 90 秒的 RGB-D 数据用官方评估工具对比动捕系统给的轨迹ORB-SLAM3 的平移误差在 1.5% 左右比 rtabmap 的约 3% 好了不少。调优方面最重要的参数是ORBextractor.nFeatures和特征金字塔层数。D455 的镜头视角偏大画面中同一个物体的像素面积相对较小提高金字塔层数有助于在不同尺度下都能提取到关键点。默认 8 层我觉得偏少在场景尺度变化明显的走廊里建议调到 10 层ORBextractor.nFeatures: 1200 ORBextractor.nLevels: 10另外注意 D455 的 RGB 图在弱光环境下噪声比较明显这会直接影响 FAST 角点的提取稳定性。我的习惯是开启自动曝光并且限制最大曝光时间避免运动模糊Camera.AutoExposure: 1 Camera.MaxExposureTime: 204. VINS-Fusion 实战D455 内建 IMU 带来的紧耦合空间4.1 为什么深度相机要接 VINS-FusionVINS-Fusion 来自香港科技大学核心是紧耦合的滑动窗口优化把图像特征和 IMU 数据放进同一个优化问题里。D455 自带 IMU 让这条方案变得非常可行不需要外部再挂一块 IMU省下了不少硬件和标定工作。纯视觉方案最大的问题是快速运动和弱纹理场景下容易丢。D455 的深度虽然能提供尺度信息但单独跑 ORB-SLAM3 时一旦相机快速旋转特征点瞬间出视野位姿直接卡死或者跳到错误位置。VINS-Fusion 里 IMU 提供的加速度和角速度数据可以预测帧间运动即使视觉短暂失效系统也能维持一段时间的合理位姿估计。这本质上是传感器冗余的优势不是某个算法单独能做到的。4.2 配置和标定时间同步与外参VINS-Fusion 跑起来之前有两个关键步骤时间同步和相机-IMU 外参标定。时间同步上realsense-ros 驱动里 D455 的 IMU 和图像数据有硬件时间戳但两者不一定能精确对齐到同一时刻。VINS-Fusion 订阅的话题类型是 sensor_msgs/Image 和 sensor_msgs/Imu需要在 launch 文件里设置时间容差。如果时间戳偏差过大IMU 预积分会变得不稳定导致估计轨迹出现周期性抖动。外参标定方面推荐使用Kalibr工具。虽然 D455 官方文档给了 IMU 和相机之间的位移旋转关系但实际装配公差会导致偏差。用 Kalibr 走一遍完整标定的流程大概是打印一张高对比度棋盘格测量格子边长。拿着设备在静止状态下采集 2-3 分钟 IMU 数据用于加速度计和陀螺仪的 bias 估计。然后缓慢移动设备保证棋盘格一直在视野内采集约 3-5 分钟数据。使用 Kalibr 同时估计相机内参、IMU 内参、相机到 IMU 的外参和时间偏移。这一步看起来很繁琐但如果你跳过了后面 VINS-Fusion 跑出来的轨迹会明显打卷。我实测过直接用默认外参和标定后外参跑同一条路径轨迹终点误差差了接近 40%。对于 D455 这种自带 IMU 的设备这一点特别容易被忽略因为官方把数据格式都给你准备好了容易让人误以为所有外参都是现成的。4.3 VINS-Fusion 的配置文件调整VINS-Fusion 的配置主要集中在 YAML 文件里最核心的几项参数名推荐值说明imu_topic/camera/imu对应 unite_imu_methodcopyimage_topic/camera/color/image_raw彩色图做特征提取freq10-30Hz控制关键帧频率body_T_camKalibr 标定结果不要用默认值max_solver_duration0.04给实时性留余量VINS-Fusion 也支持直接使用深度图作为额外约束不过 D455 的深度在近距离和透明物体上表现不佳我建议在室内环境里只用单目 IMU 的配置避免深度噪声引入额外误差。如果一定要用双目 IMU 模式那需要使用左右两个相机流D455 的深度是由双目计算出来的没有硬件上的左右目输出所以这里 D455 反而不适合走 VINS-Fusion 的双目模式。4.4 实际运行中的效果观察在室内走廊快速走动时VINS-Fusion 的轨迹平滑度明显好于 rtabmap 和 ORB-SLAM3。这是因为 IMU 预积分提供了帧间高频运动约束优化后的轨迹不会出现明显跳变。我用一个手持 D455 绕办公区一圈约 300 米回来后终点误差在 2 米左右相对于总里程已经算是可用的水平。但 VINS-Fusion 一个月内我遇到的最大问题是初始化阶段的敏感度。启动时如果相机处于运动状态初始化窗口里的 IMU 数据不满足可观测性要求系统会长时间停留在未初始化状态。解决办法是启动后先保持设备静止 3-5 秒让加速度计计算出重力方向再缓慢开始运动。这个习惯几乎解决了所有初始化失败的问题。5. 建图方案横向对比同一台设备、三条技术路线5.1 轨迹精度、地图形式与资源占用把三条路线放在同一个表格里对比会更直观对比项rtabmapORB-SLAM3VINS-Fusion地图形式稠密点云 栅格稀疏特征点云稀疏特征点云是否依赖深度图是强依赖可选 RGB-D可选推荐单目IMU轨迹精度中高中高闭环能力强主动回环检测强基于词袋模型一般初始化难度低中高CPU 占用高中中适合场景实时建图、导航地图轨迹精度要求高的视觉定位快速运动下的位姿估计rtabmap 的优势是可以直接输出一个能用于导航的地图。ORB-SLAM3 的定位精度最高但地图除了用来做人机交互或者可视化之外对实际避障帮助有限。VINS-Fusion 在快速运动和弱纹理环境里表现最好但闭环能力不如前两者长时间运行会出现逐渐漂移的问题。5.2 从工程角度看选型如果项目目标是一个需要稳定导航的移动机器人我的建议是 rtabmap 打底把稠密地图作为导航输入同时也可以把 ORB-SLAM3 或 VINS-Fusion 的位姿输出作为里程计冗余用卡尔曼之类的方式做 sensor fusion。如果是一个纯视觉定位任务比如 AR 眼镜里的姿态跟踪VINS-Fusion 或者 ORB-SLAM3 更有优势前者强在快速运动后者强在长期回环修正。从我个人的项目经验来看不要在一个方案里无限调参而是先根据项目落地的直接产出物倒推需要哪种地图。目标导向选型远比自己造轮子来得有效。6. 调优与避坑D455 在实际建图中的细节记录6.1 深度失效场景的边界认知D455 的深度失效集中在三类场景透明物体、高反光表面和户外强光。透明玻璃杯、镜面桌面这些材料会让红外结构光或者立体匹配崩溃深度图上出现大片空洞。如果建图环境里有这类物体方案上可以提前排除区域或者在视觉里程计中加入语义分割过滤掉玻璃、镜面区域的特征点。我在办公室建图时就发现角落里的饮水机因为亚克力面板导致深度图中间一块完全缺失不处理的话 rtabmap 会把墙面重建出凹陷效果。户外强光场景下D455 的红外投影仪和双目匹配都可能受到阳光中红外成分干扰。实测在正午阳光下有效深度距离缩短了一半而且深度噪声显著增大。如果必须户外使用建议加装红外滤光片或者在算法里增加置信度阈值。6.2 USB 供电与带宽问题D455 满载时对 USB 3.0 供电稳定性很敏感。我试过通过普通 USB Hub 串联结果深度图频率掉到 15fps 左右IMU 数据也开始出现丢包。直接把 D455 插到主板原生 USB 3.0 接口或者带独立供电的 Hub 上问题立刻消失。另外如果同时开启 RGB、深度、IMU 三个流并且没有限制分辨率USB 带宽会被打满。用rs-enumerate-devices可以看到当前带宽占用。我一般将 RGB 限制在 640 × 480 30fps深度也限制为 640 × 480 30fps这样带宽占用降到很低也足够 SLAM 算法使用。6.3 时间戳同步的隐藏坑realsense-ros 驱动默认会对硬件时间戳做处理但如果你使用的是 ROS 的bag录制后再跑算法需要确保 bag 里的时间戳没有因为录制机器负载过高而出现跳变。我在录制长时间 bag 时发现如果同时用高频 IMU 和图像某些帧的 IMU 数据的时间戳偶尔会比图像还晚这会导致 VINS-Fusion 的预积分计算出现异常表现为轨迹突然跳变。解决办法有两个。一是录制时把unite_imu_method设置为copy让 IMU 数据在底层按时间戳合并后再发布二是如果 bag 已经录好了在 VINS-Fusion 启动时设置just_synced相关参数让它寻找最近的匹配帧而不是严格排序。实测下来前者更可靠。6.4 反复踩过之后我总结的动态调参建议同一台 D455在不同光照和运动速度下的最优参数是不一样的。我给自己的机器写了一个简单的动态参数调整流程静态场景中把Camera.AutoExposure打开最大曝光时间限制在 30ms 以内避免运动模糊。运动速度较快时降低图像分辨率到 640 × 480并提高 IMU 权重让视觉特征点更快离开视野也不影响位姿预测。弱纹理环境比如纯白墙走廊里ORB-SLAM3 的 nFeatures 提到 1500或者切换到 VINS-Fusion靠 IMU 顶住视觉匹配不足的时段。每次换环境跑之前先录 30 秒数据回放观察深度图空洞比例和特征点数量一切正常再正式采集。这个小习惯帮我省下了大量后期排查时间。这套方法不局限于 D455同样适用于 D435i 或者带 IMU 的其他深度相机。设备只是载体真正花时间的还是对传感器特性的理解和针对算法流程的适配。希望这篇文章能帮你少走些弯路。
返回列表