尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows下RTAB-Map与RealSense T265三维建图实战指南

Windows下RTAB-Map与RealSense T265三维建图实战指南 在 Windows 10 上折腾 RTAB-Map 和 Intel RealSense T265 做三维建图确实是个有点门槛的活儿。网上能查到的资料大多默认你用的是 Ubuntu ROS1换个平台从环境构建到话题对齐全是坑。这篇文章把我实际跑通这套链路的过程整理出来包括方案选型、驱动安装、数据对齐、建图参数和排错记录给想在 Windows 下做 RGB-D SLAM 的朋友一条可以直接照抄的路径。先说结论T265 本身是视觉惯性里程计VIO它只输出位姿和鱼眼灰度图像不出深度图所以“单独用 T265 做稠密三维建图”这个说法严格讲不成立。真正合理的组合是T265 提供稳定的里程计RGB-D 深度相机提供彩色图和深度图RTAB-Map 在这两路输入上完成回环检测、图优化和点云地图构建。如果手头没有 RGB-D 相机也可以让 RTAB-Map 吃 T265 的双目灰度做立体匹配但效果和适用范围远不如配一个 D435i 来得踏实。1. 方案选型与整体思路1.1 T265 在系统里的真实角色先搞清楚每台设备的定位这一步决定了后面所有配置的走向。T265 内置了 Movidius Myriad 2 VPU双鱼眼摄像头加 IMU核心能力是把视觉信息和惯性数据融合输出 200Hz 左右的 6DoF 位姿。它不需要外接电脑做复杂的特征匹配和优化传感器端自己就把 SLAM 的前端——视觉惯性里程计——跑完了。这意味着即使在光照变化大、墙面纹理弱、快速旋转这些场景下只要还有一定的视觉特征它都能给出相对平滑的位姿估计这是很多纯视觉方案比不了的。但 T265 不输出深度也没有稠密重建能力。它只会告诉你“我在哪、朝哪看”不会告诉你“我面前的障碍物在空间里具体长什么样”。建图这个环节必须有一个能出深度数据的相机来补上。RTAB-Map 这种基于图优化的 SLAM 框架恰好可以把 T265 提供的里程计当作先验用深度相机的彩色图加深度图去增量构建三维占据网格和点云再通过回环检测修正历史轨迹。所以整套系统的数据流是这样的T265输出/odom里程计提供位姿先验。D435i / D435输出彩色图和深度图提供地图观测。RTAB-Map接收里程计 RGB-D 图像做特征提取、帧间匹配、回环检测、全局优化最终输出三维地图和优化后的轨迹。1.2 三种集成链路对比我在配置之前对比过几种常见的集成为案避免一开始就走偏。表格里是我实际测试后的感受直接贴出来省得你再踩一遍。方案里程计来源图像来源建图效果配置难度适用场景仅 T265 双目T265 自带 VIOT265 左右鱼眼灰度只有稀疏点云稠密重建基本不可用低位姿估计、轨迹记录T265 D435iT265 自带 VIOD435i 彩色 深度稠密点云和占据网格效果稳定中室内三维扫描、机器人建图仅 D435i 单目/深度RTAB-Map 自带 VOD435i 彩色 深度短轨迹尚可长距离容易漂移中简单场景、移动缓慢我最终选了第二行方案。原因很直接RTAB-Map 自带的视觉里程计在纹理稀疏环境白墙、走廊、玻璃幕墙很容易丢而 T265 内置了 IMU 紧耦合可以在这种环境下坚持更久。两条链路中间隔着时间同步和坐标变换配置上确实要费点功夫但换来的是建图稳定性这笔账很划算。如果你只有一个 T265想先验证一下整条链路能不能通也可以只启动 T265 的节点用 RTAB-Map 的rgbd_sync配合 T265 的灰度图跑一次立体匹配。具体做法后面会提一句但我不建议把这个当作主力方案立体匹配出来的深度噪声大相邻帧之间的一致性也差回环一触发地图容易散架。2. 环境搭建与工具链安装2.1 Windows 底层环境准备在 Windows 上跑 ROS2 RTAB-Map和 Linux 差不太多核心就是要有一套编译链和包管理工具。我按最省事的顺序列一下安装 Visual Studio 2019 或 2022一定记得勾选“使用 C 的桌面开发”工作负载后面编译 librealsense 和 rtabmap_ros 都依赖它。安装 CMake装的时候选“Add CMake to the system PATH”避免后续命令行找不到cmake。安装 Git for Windows默认选项即可。安装 Python 3.8 或 3.9ROS2 Foxy 在 Windows 上对 Python 版本比较挑剔我用的 3.8.10。用 Chocolatey 可以省很多事装完跑一句choco install cmake -y能直接把工具链补齐。提示别在普通 PowerShell 里直接编译 ROS2 项目ROS2 官方要求在 “x64 Native Tools Command Prompt for VS 2019” 里操作环境变量和 MSVC 编译器的路径才正确。我第一次就是在这个细节上卡了半个多小时。2.2 librealsense SDK 与 T265 固件检查RTAB-Map 本身不直接访问 T265它是透过 ROS2 的 RealSense 驱动拿数据所以要先装 Intel RealSense SDKlibrealsense。推荐的方式是用官方安装包或者自己从源码构建。我图省事直接用最新 release 的Intel.RealSense.SDK.exe安装完把C:\Program Files\Intel RealSense SDK 2.0\bin\x64加入 PATH然后打开 RealSense Viewer 验证连接 T265确认固件版本能被 SDK 识别。观察是否有左右鱼眼图像流。在 3D View 里看位姿是否随设备移动发生变化。这步很关键。T265 长期不用可能固件停留在早先版本最好在 Viewer 里直接升级到官方最新固件否则后面跑 ROS2 驱动时会出现不识别或数据异常的问题。2.3 ROS2 发行版选型与安装Windows 上官方支持的是 ROS2 Foxy 和 Humble。Foxy 出来时间早社区踩坑资料多rtabmap_ros 对它的兼容性验证也最充分我建议用 Foxy。Humble 虽然新但在 Windows 上动不动就从源码构建成本会高不少。下载 ROS2 Foxy 的 Windows 二进制包地址是 ROS2 官方 release 页面装完以后把环境变量配进系统C:\dev\ros2_foxy\local_setup.bat每次开新的编译窗口都要先跑一次这个脚本或者直接把整行命令加到系统环境变量里的自动化脚本里省得老记着。注意ROS2 在 Windows 上的 DDS 默认实现是 Fast DDS如果后面出现两个节点互相发现不了的问题先检查 Windows 防火墙有没有放行 UDP 7400 到 7500 端口或者临时把防火墙关掉验证。这个问题非常典型十个人里至少有四个人会撞上。3. 驱动数据链路与相机配置3.1 启动 T265 节点并验证数据装好 librealsense 和 ROS2 之后进入 x64 Native Tools Command Prompt先执行call C:\dev\ros2_foxy\local_setup.bat然后从源码编译 RealSense ROS2 Wrapperrealsense-ros。直接 clone 官方仓库到工作空间用colcon build编一次就行依赖项只有 cv_bridge、image_transport 这些 ROS2 标准库半小时内能编完。编译好后启动 T265 节点ros2 launch realsense2_camera rs_launch.py camera:t265注意这里camera:t265是给节点起的名字前缀跑完以后 T265 的话题都会带/t265/前缀避免和后面加入的 D435i 冲突。开另一个窗口验证话题列表ros2 topic list你应当看到类似这样的核心话题/t265/camera/odom/sample /t265/camera/fisheye1/image_raw /t265/camera/fisheye2/image_raw再打印一下里程计数据ros2 topic echo /t265/camera/odom/sample --once如果输出的是nav_msgs/Odometry类型并且pose.pose.position和twist.twist.angular都有合理数值说明 T265 已经在正常出数据了。拿在手里轻轻晃动数值要有明显变化才算通。3.2 加入 RGB-D 深度相机我这里用 D435i 作深度相机理由很单纯D435i 和 T265 都走 RealSense 驱动协议和处理方式一致一台电脑上同时插两个 RealSense 设备驱动不会打架。启动 D435i 节点的命令和 T265 类似换一个相机名前缀ros2 launch realsense2_camera rs_launch.py camera:d435i启动后重点确认这几个话题/d435i/camera/color/image_raw /d435i/camera/depth/image_rect_raw /d435i/camera/color/camera_info如果你的 D435i 是默认出厂参数深度图话题可能是depth/image_rect_raw这和 RTAB-Map 需要的输入名对应。实际名字以你机器上ros2 topic list输出为准别照抄我的。3.3 数据同步与坐标变换对齐T265 和 D435i 是两个独立的设备时间戳没有硬件同步帧率也可能对不齐。RTAB-Map 默认的rgbd_sync用的是精确同步策略也就是彩色图、深度图、相机内参必须在时间戳完全一致时才打包成一个 RGB-D 图像。跨设备场景下这个要求太苛刻了所以要用近似同步approx sync。我不喜欢在这个环节盲目堆命令先讲清原理RTAB-Map 的输入本质上是一个“RGB-D 图像 里程计”的数据对。RGB-D 图像必须包含彩色图、深度图和相机内参缺一不可里程计则可以用 T265 的输出。如果两个相机的时间戳天然差 10 毫秒精确同步会丢掉大量数据建图帧率会掉到惨不忍睹。这里给出我实际用的启动命令参数写在 launch 文件里比命令行长传要清晰得多。下面是rtabmap.launch.py的核心片段from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagertabmap_ros, executablergbd_sync, namergbd_sync, parameters[{ approx_sync: True, rgb_topic: /d435i/camera/color/image_raw, depth_topic: /d435i/camera/depth/image_rect_raw, camera_info_topic: /d435i/camera/color/camera_info, }], ), Node( packagertabmap_ros, executablertabmap, namertabmap, parameters[{ frame_id: camera_link, odom_topic: /t265/camera/odom/sample, subscribe_rgbd: True, approx_sync: True, }], ), ])这里有两个点要重点解释。第一frame_id我填的是camera_link这个值要和 T265 TF 树里的camera_pose_frame或者 D435i 的camera_link对应。如果 T265 和 D435i 没有做外参标定那你至少要让 T265 的里程计坐标系和 RGB-D 相机的坐标系在 TF 树里能连起来否则 RTAB-Map 会一直报“找不到从 map 到 camera_link 的变换”。我自己的做法是先只让 T265 发布 TF让 RTAB-Map 在 T265 的坐标系下建图D435i 的位置用静态变换写死。第二approx_sync必须为 True。这个参数的实质是允许把时间戳差在一定阈值内的消息打包在一起默认阈值是 0.02 秒T265 和 D435i 之间完全够用。如果时间差偏大可以给rgbd_sync传qos:1或者手动调max_interval参数避免刚启动相机时因为时间戳跳变丢掉前几帧。4. RTAB-Map 建图实操4.1 从源码构建还是直接用预编译包RTAB-Map 在 Windows 上有点特殊。它官方提供了一个独立的 Windows 安装程序包含 RTAB-Map 数据库查看器和建图主程序但这个程序不直接接收 ROS2 话题。如果你坚持走 ROS2 链路就必须从源码构建rtabmap_ros。构建步骤大体是下载 rtabmap 源码C 核心库。用 CMake 编译安装 rtabmap 核心依赖项包括 PCL、OpenCV、G2O、GTSAM、Qt5。Windows 下我建议用 vcpkg 装这些依赖一次能装全比手动找 DLL 省心太多。下载 rtabmap_ros 源码放进 ROS2 工作空间的src目录。在 x64 Native Tools Command Prompt 里执行colcon build --packages-select rtabmap_ros成功后. install/setup.bat。我实测下来如果依赖库已经用 vcpkg 装好rtabmap_ros 的构建其实不慢也就是十几分钟的事。真正的坑在 OpenCV 版本和 PCL 版本冲突上——vcpkg 默认版本有时和 ROS2 Foxy 自带的 OpenCV 不一致构建时提示各种找不到头文件。解决办法是把系统 PATH 里的 OpenCV 路径先去掉让 colcon 统一使用 vcpkg 编译出来的版本。如果是第一次搭建环境或者没有耐心从源码折腾还有一个退路用 WSL2 Ubuntu usbipd-win 把 T265 和 D435i 透传到 Linux 子系统里然后在 WSL2 里用官方 Ubuntu 源装的 ROS2 和 rtabmap_ros。这条路我在另一台机器上验证过稳定性甚至比原生 Windows 还好缺点是 USB 透传会引入一点延迟对高速运动场景稍有影响。如果你只是为了学 SLAM 流程直接 WSL2 反而省心。4.2 启动建图完整命令与参数解读假设你已经编译好了 rtabmap_ros启动建图只需要两条命令终端一启动相机与驱动ros2 launch realsense2_camera rs_launch.py camera:t265 ros2 launch realsense2_camera rs_launch.py camera:d435i终端二启动同步与建图ros2 launch my_rtabmap_bringup rtabmap.launch.py其中my_rtabmap_bringup是你自己建的功能包里面的 launch 文件就是上面那个rtabmap.launch.py的完整版再加一点参数调节。几个直接影响建图质量的参数我给你解释清楚Rtabmap/TimeThrRTAB-Map 会以“节点”为维度管理地图每个节点代表一帧关键帧。TimeThr控制每隔多少秒必须创建一个新节点默认是 100 毫秒。如果设备移动慢、场景变化小可以调到 300 毫秒减少冗余节点后端优化更快。RGBD/LinearUpdate和RGBD/AngularUpdate分别控制机器人在空间里移动多远、旋转多少度才创建一个新节点。我按室内扫图场景设为 0.3 米和 15 度这样既能保证足够的帧间重叠度又不至于让地图节点堆积如山。Rtabmap/MemoryThr内存阈值决定短期记忆里最多保存多少节点。默认 1000如果建的图很大节点数接近阈值时 RTAB-Map 会把旧节点丢进长期记忆回环检测仍然有效但局部地图优化会受影响。我一般设置 2000配合 32G 内存完全没压力。Vis/MinInliers回环检测确认时要求的最小内点数量默认是 20 左右。如果场景纹理过于单一比如空房间白墙可以把这个值降到 12代价是回环检测的误报率会上升。反过来在特征丰富的场景下保持默认就好。RGBD/ProximityBySpace这是一个非常实用的功能它能让 RTAB-Map 不只是依赖闭环检测来优化地图还会在空间位置接近的地方主动做局部匹配。刚才把LinearUpdate调大的时候这个参数尤其重要建议设为 True不然节点间的累积误差会变大。在启动建图节点之后建议开第三个终端实时监控ros2 run rviz2 rviz2在 RViz 中增加一个MapCloud话题并订阅/rtabmap/cloud_map如果有数据持续增长说明建图链路已经通了。也可以订阅/rtabmap/odom看轨迹如果轨迹平滑且在回环处有明显闭合基本就成功了一大半。4.3 地图保存与离线优化在线建图只是在内存里维护地图断电就丢。RTAB-Map 提供了一整套数据库机制你要养成随时保存的习惯。保存当前会话到数据库ros2 run rtabmap_ros rtabmap_save --database rtabmap.db这个命令会把整个图结构、关键帧、词袋、最终点云都写进rtabmap.db。后续想离线查看或重新优化用独立数据库查看器打开rtabmap-databaseViewer rtabmap.db在查看器里可以做三件重要的事发布优化后的路径和地图方便再回到 RViz 中核验。导出点云为.ply或.pcd文件用 CloudCompare 或 MeshLab 做后期处理。检查回环闭合的质量如果某处回环被判定为误报可以直接在查看器里禁用那条边重新优化整个图。我自己的习惯是扫描结束先在 RTAB-Map 查看器里“文件 - 输出 - 所有点云”导出不带颜色的.ply和白模点云再进 CloudCompare 做降采样和封装。数据库文件本身可以一直留着随时回去重新优化不需要从头再扫一遍。5. 常见问题与排查经验5.1 DDS 节点互相发现不了这是 Windows 平台上的头号问题。具体表现是两个终端都启动了 ROS2 节点ros2 node list各只能看到自己。排查顺序是这样的先确认两个终端的ROS_DOMAIN_ID相同默认都是 0。检查 Windows 防火墙临时关闭防火墙测试一次最快。设置环境变量ROS_LOCALHOST_ONLY1让 DDS 只在本地回环上通信两个终端都在同一台机器时这个办法最有效代价是不能跨机器通信。如果还不行看 DDS 实现是不是变成了 CycloneDDS 或 ConnextFast DDS 在 Windows 上的默认端口区间是 7400 到 7500防火墙放行或彻底关闭就能解决。5.2 里程计出现漂移或丢帧T265 本身很稳但它的 VIO 算法对初始化条件有要求。刚插上设备后拿着相机缓慢移动十秒左右让它完成加速度计和陀螺仪的收敛然后再开始正式扫描。如果一上来就快速晃动前端位姿优化容易跑飞后面 RTAB-Map 再强也拉不回来。还有一种情况是 T265 长时间运行后设备温度过高内部 Myriad 2 降频里程计输出出现间歇性 dropout。观察方式是在终端订阅/t265/camera/odom/sample如果一段数据后没有持续输出就是过热了。加一个主动散热风扇或者停止设备冷却五分钟就能恢复。5.3 TF 树不连续导致建图卡死报错信息通常是“Could not get transform from map to camera_link”之类。这是因为 RTAB-Map 要维护map - odom - base_link/camera_pose_frame - camera_link这条 TF 链路。T265 只发布自身的 TFD435i 发布的 TF 又是独立的两部分拼不在一起。最简单的处理方式是在启动建图前发布一个静态变换把 D435i 的camera_link和 T265 的camera_pose_frame关联起来。用一条 ROS2 命令就能完成ros2 run tf2_ros static_transform_publisher 0.0 0.0 0.0 0 0 0 camera_pose_frame camera_link这里三个平移和三个旋转填的是 T265 和 D435i 的实际外参如果两个相机固定在同一块结构件上先用尺子量个大概就行。注意要让这条命令在 RTAB-Map 启动之前或者至少在工作期间一直运行不然 TF 断链照样报错。5.4 深度图大量空洞或边缘黑边T265 不负责深度这块完全由 D435i 决定。深度空洞通常在以下情况最严重近距离物体、透明物体、高反光表面、过暗环境。RTAB-Map 内置的深度滤波只在图像同步层处理不会修复硬件层面的盲区。能做的就是先调整 D435i 的深度参数把depth_width和depth_height设为 640x480帧率 30Hz打开enable_ir_auto_exposure把visual_preset改为High Accuracy。如果场景光照太暗打开相机上的 RGB 补光不太现实但可以引入外部光源D435i 的红外投影仪在室内中距离的补强效果其实很明显。如果空洞还是影响建图可以在 RTAB-Map 的rgbd_sync节点里开启decimation把深度图降采样到 320x240。虽然降低了分辨率但深度图的空缺区域会显著减少因为相邻像素的距离噪声被平均掉了对回环检测反而是好事。5.5 地图重影与回环不闭合这是 RTAB-Map 老用户最常见的抱怨。重点排查以下几点如果回环已经检测到但优化后地图两端对不齐多半是里程计漂移超出了回环纠正能力回到参数章节里提到的Vis/MinInliers以及 T265 的初始化质量。如果回环根本没触发先确认当前场景的视觉特征是否足够。纯白墙或长走廊场景特征检测器找不出足够的关键点回环自然无从谈起。这时候可以降低Rtabmap/LoopThr让回环判定更宽松或者用Rtabmap/RGBDProximityBySpace辅助匹配。还有一个常见陷阱两个相机的时间戳没有真正同步好。用rgbd_sync的approx_sync时如果时间差超过阈值RTAB-Map 会拿错帧去建图地图重影就是必然结果。你可以订阅/rtabmap/rgbd_image和/rtabmap/odom话题做对比如果 odom 消息和 rgbd 消息的时间戳差大于 50 毫秒就要到rgbd_sync里调大近似同步的容忍范围。5.6 构建 rtabmap_ros 时找不到 OpenCVWindows 源码构建的经典坑。症状千奇百怪但根因无非两个vcpkg 装了多个 OpenCV 版本或者系统 PATH 里残留了旧版 OpenCV 的 DLL。我的建议是统一用 vcpkg 安装 OpenCV 3.4.16和 ROS2 Foxy 的 cv_bridge 兼容性最好。装完后在colcon build前执行set OpenCV_DIRC:\vcpkg\installed\x64-windows\share\opencv把OpenCV_DIR指定到 vcpkg 的 CMake 配置文件目录。如果还报版本错误打开 CMakeCache.txt 确认OpenCV_VERSION是不是 3.4 系列不是你预期的 4.x做一遍硬清理重新 build。6. 实操总结与点睛经验整套流程跑下来我的最大体会是Windows 上的 SLAM 调试真正难的不是 SLAM 算法本身而是环境配置、DDS 通信和时间戳同步这些“外围设施”。一旦 T265 的里程计话题能稳定输出D435i 的深度图像能在 RViz 里连续显示剩下的建图参数调节本质上是一个耐心活慢慢推进相机观察回环触发地图自然就越建越完整。最后分享一个小技巧不要在刚启动设备的前几秒就急着建图。每次插上 T265先掏出相机在房间里慢速绕一圈让它的 VIO 完成初始化再回到起点开始正式扫描。这样做有两个好处一是给 RTAB-Map 积累了足够多的初始特征点二是让 T265 在正式扫描前就建立起准确的初始刻度后续回环误差会小很多。这套配置里T265 已经停产的硬件不用过多纠结只要固件正常它作为 VIO 里程计的角色放到今天依然非常能打。如果你手头有其他视觉惯性设备比如拿着 D435i 只是做普通 RGB-D 建图也可以沿用同样的链路把odom_topic换成对应设备的话题RTAB-Map 的建图流程完全不受影响。再往后想扩展可以接激光雷达做 2D 栅格地图或者把多传感器标定做扎实让 T265 和 D435i 的 TF 树完全融合能做的东西会更多。
返回列表