ARTICLE DETAIL

资讯详情

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

Realsense D435i + VINS-Fusion 视觉惯性SLAM建图实战:从环境配置到避坑指南

Realsense D435i + VINS-Fusion 视觉惯性SLAM建图实战:从环境配置到避坑指南 老早就想写这一篇了。Realsense D435i配合VINS-Fusion做建图是我在Ubuntu 18.04 ROS Melodic环境下完整跑通的经典组合。VINS-Fusion是港科大开源的多传感器融合里程计框架D435i则集成了双目相机、红外深度模组和IMU两者搭在一起正好满足视觉惯性SLAM的输入需求。这篇博客我会从环境配置、驱动安装、参数修改到实跑建图把整个链路里容易踩的坑全部摊开来讲给准备入坑视觉SLAM或者想用D435i做定位建图的朋友一份可以直接照做的实战手册。先说明白这篇文章不是贴一遍官方README就完事而是把我实际编译、调参、跑通时遇到的所有问题包括为什么会出那些错误、应该怎么排查都整理出来。无论你是刚装好Ubuntu 18.04的小白还是已经折腾过一段时间、卡在某个环节的老手顺着这篇文章走一遍大概率能省下一整周的搜索时间。1. 项目概览与环境版本选择1.1 为什么选D435i作为视觉传感器D435i是Intel RealSense家族里很特殊的成员。普通D435只有双目加主动红外而D435i在硬件上多了一颗BMI055六轴IMU这颗IMU直接决定了它在VINS-Fusion这类视觉惯性系统里的地位。VINS-Fusion的核心思路是用相机图像估计运动再用IMU数据做帧间预测和优化约束两者互补相机在纹理丰富时精度高IMU在快速运动或短暂遮挡时扛得住。没有IMU纯视觉方案遇到快速旋转基本就崩了有了IMU系统的鲁棒性会上一个台阶。另外一个非常现实的原因是D435i的ROS驱动已经非常成熟。官方realsense-ros封装好了彩色图、深度图、IMU话题你只需要在VINS-Fusion的配置里把话题名和参数填对就能直接跑起来。相比需要自己折腾驱动、同步时间戳的各种DIY相机方案D435i是现阶段视觉SLAM入门和做产品原型最省心的选择。1.2 Ubuntu 18.04 ROS Melodic 的搭配逻辑很多人会问现在都装到Ubuntu 22.04了为什么还用18.04我的答案是稳定性和生态匹配比版本新旧更重要。VINS-Fusion的依赖栈里面Ceres Solver、OpenCV、Eigen等组件在18.04环境下的编译链是公认最顺的网上能找到的教程、踩坑记录也最全。而ROS Melodic作为18.04的原生版本安装简单realsense-ros和VINS-Fusion都有对应的Melodic分支省去了自己改CMakeLists的麻烦。在版本选择上我建议不要随意混搭。比如Ubuntu 20.04配ROS Noetic也能跑但realsense-ros和VINS-Fusion在新系统上偶尔会遇到OpenCV版本冲突或C标准问题排查成本很高。既然是做建图实战把精力放在算法和数据上而不是和编译环境搏斗这才是聪明做法。组件推荐版本备注操作系统Ubuntu 18.04.5/18.04.6 LTS内核4.15稳定可靠ROS发行版ROS Melodic对应Ubuntu 18.04librealsensev2.50.0前后与realsense-ros配套realsense-rosmelodic分支与ROS版本对应Ceres Solver1.14.0VINS-Fusion依赖VINS-Fusion官方master编译前确认依赖完整2. 环境基础搭建系统准备与工具链2.1 安装Ubuntu 18.04后的基础配置拿到一台新机器装完系统第一件事是把基础工具补齐。我习惯先执行一轮系统更新再把编译需要用到的软件包装好。注意不要只顾着装ROS后面编译librealsense和VINS-Fusion还依赖很多基础包提前装好免得反复折腾。sudo apt update sudo apt upgrade -y sudo apt install -y git cmake build-essential pkg-config \ libgtk-3-dev libusb-1.0-0-dev libglfw3-dev libssl-dev \ python python-dev python-tk python3 python3-pip \ vim net-tools htop这些包分几类git和cmake是拉代码和构建项目的libusb和libglfw是librealsense编译时的硬依赖python系列工具是为了后面跑标定脚本方便。如果某些包在你的源里找不到先确认一下是不是没有启动universe软件源。2.2 安装ROS MelodicROS Melodic的安装步骤已经非常成熟网上也有大量教程。我这里把最关键的几步列出来并且标注几个容易卡住的地方。sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-melodic-desktop-full安装完成后需要初始化rosdep。这一步经常因为网络问题失败我的经验是如果失败就多试几次不要急着换源或者跳过。rosdep不初始化好后面编译工作区时依赖检测会报各种奇怪的错误。sudo rosdep init rosdep update echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc最后别忘了安装rosinstall等常用工具方便后续创建和管理工作区。sudo apt install -y python-rosinstall python-rosinstall-generator python-wstool build-essential2.3 编译Ceres Solver依赖VINS-Fusion的后端优化严重依赖Ceres Solver。这个库负责求解非线性最小二乘问题视觉重投影误差、IMU预积分误差都要靠它来优化。librealsense虽然不依赖Ceres但VINS-Fusion编译时找不到Ceres会直接报错所以提前装好非常关键。Ceres的依赖有glog、gflags、suitesparse等。推荐通过apt安装大部分依赖然后源码编译Ceres 1.14.0这个版本和VINS-Fusion的兼容性最好。sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev \ libeigen3-dev libsuitesparse-dev liblapack-dev libblas-dev cd ~/Downloads git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 1.14.0 mkdir build cd build cmake .. make -j4 sudo make install这里提醒一句不要用太新的Ceres版本。我实测过Ceres 2.x和VINS-Fusion源码搭配会出现接口不兼容的编译错误排查起来非常头疼。老老实实用1.14.0一次过。3. Realsense D435i驱动安装与调试3.1 编译librealsense SDKD435i要正常工作必须安装Intel官方SDK。这里说的不是Ubuntu软件源里的旧版本而是从GitHub拉的最新源码编译安装。编译librealsense之前需要先准备一些依赖同时要特别注意内核模块补丁的问题。可以说librealsense的“内核补丁”是D435i在Linux下工作的核心。D435i依赖uvcvideo驱动和hid_sensor的IMU支持Intel官方准备了patches脚本在编译前需要打上补丁否则IMU数据无法正常读取。如果你用的内核版本较新官方脚本可能无法直接打补丁这时候要么换回支持的内核要么就用最新版librealsense带的适配脚本。18.04自带内核一般会顺利一些。cd ~/Downloads git clone https://github.com/IntelRealSense/librealsense.git cd librealsense git checkout v2.50.0 # 安装依赖 sudo apt install -y libudev-dev libdrm-dev libx11-dev libxrandr-dev \ libxinerama-dev libxcursor-dev libxi-dev mesa-common-dev # 更新固件需要的工具 sudo apt install -y dfu-util # 拷贝udev规则并重新加载 sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger接下来推荐运行Intel官方的内核模块配置脚本。这一步会检查uvcvideo模块的兼容性如果提示需要打补丁可以按脚本提示操作。如果选择“打补丁”方式要重新编译内核模块整个过程稍长如果不想折腾内核也可以直接使用脚本内的“modprobe”方式加载补丁模块。之后就可以正式编译SDK了mkdir build cd build cmake ../ -DCMAKE_BUILD_TYPERelease -DFORCE_LIBUVCtrue make -j4 sudo make installCMake参数里FORCE_LIBUVCtrue表示强制使用libuvc后端。这个参数能绕开很多摄像头驱动兼容性问题是官方推荐的。3.2 配置udev规则与IMU模块编译完成之后先用realsense-viewer程序验证一下相机能否正常识别、深度和RGB图像是否正常输出。realsense-viewer这一步如果出现了图像窗口说明SDK安装成功。此时打开摄像头设置面板把IMU选项勾上确认IMU数据也在刷新。D435i的IMU输出包含加速度计和陀螺仪两组数据如果这里读不到IMU后面VINS-Fusion就没有惯性数据可用整个视觉惯性系统的优势就没了。一个常见的坑是USB端口供电不足。D435i对USB带宽和供电比较敏感插在USB 2.0口上或者前置面板的弱供电口上经常出现掉帧、识别不到设备的问题。我的建议是尽量用主机背部直连的USB 3.0口并且不要通过USB Hub转接。3.3 安装realsense-ros并测试话题SDK正常以后还需要把D435i的数据桥接到ROS话题上这一步用到realsense-ros功能包。用catkin工作区来管理。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/IntelRealSense/realsense-ros.git cd realsense-ros git checkout melodic cd ~/catkin_ws catkin_make echo source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc启动相机时推荐先看一下官方默认配置一般用rs_camera.launchroslaunch realsense2_camera rs_camera.launch启动成功后用rostopic list查看话题重点确认这几个话题存在/camera/color/image_raw /camera/depth/image_rect_raw /camera/imu如果IMU话题不存在多半是realsense-viewer里没开启IMU或者SDK版本太老。如果彩色图话题没有检查一下启动参数里的enable_color是否设成了false。另一个高频问题是时间戳错乱表现为话题等待几秒才有数据这个可以先记录下来后面单独排查。4. VINS-Fusion编译与参数适配4.1 获取源码与编译依赖VINS-Fusion的源码结构不复杂核心功能包是vins_estimator另外还有camera_models、global_fusion等辅助包。把源码放进工作区然后整体编译。cd ~/catkin_ws/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ~/catkin_ws catkin_make第一次编译如果报错90%的原因是Ceres、Eigen、OpenCV版本不匹配。Eigen建议用18.04自带或者3.3.x版本不要用4.xOpenCV就用系统源的3.2版本完全兼容。还有一点别忘VINS-Fusion的配置文件里写了#include opencv2/...如果机器上同时装了多个OpenCV版本编译时可能链接到错误的库。稳妥做法是先查看pkg-config --modversion opencv确认版本如果不对就先卸载多余版本。4.2 相机与IMU参数修改这是整个流程里最核心也最容易翻车的一步。D435i出厂时厂家已经标定好了内参但在VINS-Fusion里你可以直接用官方默认的realsense参数文件对大多数情况来说已经能跑出像样的结果。不过如果你追求精度或者发现轨迹发飘就需要用自己标定的参数替换。先看VINS-Fusion自带的D435i配置通常位于VINS-Fusion/src/VINS-Fusion/config/realsense/realsense_d435i.yaml。文件里需要关心的几个关键字段imu_topic: /camera/imu image_topic: /camera/color/image_raw # 图像尺寸 640x480 image_width: 640 image_height: 480 # 相机内参 focal_length: x: 615.0 y: 615.0 center: x: 320.0 y: 240.0 # IMU噪声参数 acc_n: 0.02 gyr_n: 0.02 acc_w: 0.002 gyr_w: 0.002image_topic和imu_topic必须和realsense-ros实际发布的话题一致否则VINS会一直等待数据。相机内参如果不自己做标定可以先填一个近似值跑起来如果做精确标定可以用Kalibr结合D435i录制的bag数据离线求解把得到的fx、fy、cx、cy替换进文件。IMU噪声参数acc_n、gyr_n的单位分别是加速度计和陀螺仪的噪声密度数值越小代表IMU越“信任”自身测量。D435i自带的BMI055在中低端IMU里算不错的我用默认值0.02跑室内场景没问题。如果发现估计出的轨迹抖动明显可以稍微调大噪声让系统更依赖视觉。4.3 D435i数据输出频率设置与话题对齐VINS-Fusion对IMU频率比较敏感太高太低都不好。D435i的IMU理论上可达400Hz但实际我用200Hz就足够了太高反而增加CPU负担。图像方面彩色图30Hz、分辨率640x480是VINS-Fusion最舒服的组合既不会太卡也能保证足够多的视觉特征。如果通过realsense-viewer把相机参数改乱了可以用rs-enumerate-devices工具查看当前支持的流rs-enumerate-devices | grep -A 30 Stream Profiles这里能看到相机支持的所有分辨率、帧率和格式组合。然后回到realsense-ros的启动参数保证VINS订阅的彩色图像话题确实是30Hz、640x480。假如你修改了分辨率比如改成1280x720那么VINS配置里的image_width和image_height也要同步改否则图像尺寸和实际输入不一致程序要么崩溃要么输出乱码。5. 建图实操与Rviz观测5.1 启动VINS-Fusion进行建图环境就绪后启动分两步。第一步先启动realsense-ros发布传感器数据第二步启动VINS-Fusion的估计节点。# 终端1启动相机 roslaunch realsense2_camera rs_camera.launch # 终端2启动VINS roslaunch vins_estimator realsense_color.launchrealsense_color.launch默认会加载realsense_d435i.yaml并且会启动Rviz的VINS可视化配置。如果你在Rviz里看不到图像和轨迹检查一下Fixed Frame是否设成了world以及PointCloud2、Path等话题是否显示正确。VINS-Fusion默认会将位姿发布到/vins_estimator/odometry轨迹发布到/vins_estimator/path稀疏点云发布到/vins_estimator/point_cloud。启动之后拿着相机慢慢在室内走动注意保持光线充足、纹理清晰避免正对纯白墙壁或者快速甩动相机。VINS初始化需要一点时间通常前几十帧图像会显示“waiting for feature points”之类的状态当过一阵子检测到足够特征并完成IMU初始化后轨迹就开始延展了。5.2 建图效果与点云输出验证很多新手会把VINS-Fusion理解成和Cartographer、LOAM一类的“建图工具”其实它本质上是视觉惯性里程计VIO输出的是高频位姿和局部点云。在Rviz里看到的/vins_estimator/point_cloud是当前帧的稀疏特征点云并非全局稠密地图。如果你需要类似激光SLAM那样的完整地图一般有两种思路一是用VINS的位姿去拼接深度相机输出的深度点云二是把VINS作为前端里程计配合RTAB-Map这类建图后端做全局优化和回环。不过这不代表VINS“不能建图”。在路径规划、自主导航、巡检这类应用里VINS输出的6自由度轨迹本身就是一种拓扑地图配合局部点云可以用于障碍物感知。我跑通之后习惯在终端里确认输出频率rostopic hz /vins_estimator/odometry正常室内场景下位姿输出频率应该在20Hz以上。如果只有几Hz要么是图像特征太少要么是IMU初始化没完成需要检查参数。5.3 回环检测与轨迹优化VINS-Fusion的一大卖点是支持回环检测。回环检测的意思是当相机再次回到曾经到过的位置时系统识别出这个位置并在后端优化中重新建立约束从而消除累计漂移。这在长距离建图时非常重要比如走一个方形路径回到起点没有回环的轨迹终点会偏离起点一大截触发回环后会明显修正。启动回环检测需要跑一个独立的节点roslaunch loop_fusion loop_fusion.launch注意loop_fusion需要和vins_estimator配套运行并且共用同一份配置。它的启动节点会把话题名改为/vins_estimator/pose等前缀所以如果看不到回环修正效果先确认Rviz里的Path话题选的是/loop_fusion/path而不是/vins_estimator/path。触发回环时Rviz里会出现绿色的匹配连接线轨迹也会有一次明显的“跳变”或修正这就是回环约束生效的表现。6. 常见问题与排查技巧实录6.1 典型错误与解决方案速查表以下是我在多个环境里实测踩过、也帮别人解决过的典型问题整理成表格方便你直接对照问题现象可能原因解决方案VINS启动后一直等数据imu_topic或image_topic不匹配用rostopic list核对话题名彩色图正常但没有IMU话题相机端没启用IMU在realsense-viewer勾选IMU重启launch编译VINS时报找不到CeresCeres版本过旧或没装源码编译Ceres 1.14.0并sudo make install跑了十几秒后轨迹乱飘相机内参不准或IMU未初始化启动后静止1到2秒让IMU充分初始化回环检测触发后反而变差相机尺度漂移严重回环匹配错误检查图像曝光和纹理避免快速移动USB识别不到相机供电不足或USB协议问题换机器背部USB 3.0口不用HubROS话题频率不稳定USB带宽被占满降低深度流分辨率或关闭深度流Rviz无点云显示没选对PointCloud2话题确认选择/vins_estimator/point_cloud6.2 独家避坑经验在这里分享几个常规教程不会写到的细节。第一D435i的IMU方向问题。VINS-Fusion默认假设IMU的加速度计和陀螺仪的轴方向与相机坐标系一致但D435i的IMU坐标系和相机坐标系并不是完全同向的。如果跑出来轨迹总是往一个方向偏比如严重的Roll漂移可以考虑在配置里给IMU数据做坐标变换或者换用别人验证过的D435i配置模板。部分版本用官方模板直接跑就能出效果但别在轴上钻牛角尖先看看是不是IMU频率太低。第二IMU初始化期间务必保持相机静止。VINS启动后最初1到2秒是IMU初始化窗口这个阶段如果拿着相机乱动重力方向估计会出偏差后面轨迹会整体倾斜。我自己的习惯是启动节点后先让相机平放在桌上静止几秒听到Rviz里出现轨迹线后再开始移动。这个习惯能明显提高初始化成功率。第三录bag回放时要加--clock并设置use_sim_time。如果你用rosbag录了一段数据用于离线建图回放时VINS会等待对应的ROS Time如果不启动roscore并设置/use_sim_time为true经常出现话题时间戳不匹配、数据全都对不上等问题白白浪费一天时间。6.3 性能调优建议如果发现实时性不够优先降低点云密度和图像分辨率。VINS-Fusion配置里有个MAX_CNT参数默认一段时间内最多提取150个特征点这个数值在室内足够如果场景纹理特别丰富可以适当降一点。另外摄像头如果不需要深度图可以在realsense-ros的启动参数里把depth模块关掉减少USB带宽占用图像和IMU的实时性会更稳。CPU占用方面I5处理器跑VINS-Fusion基本还能保持实时但如果你同时开Rviz三维渲染和回环检测负载会比较高。建议在终端用htop看看哪个进程占用过高一般vins_estimator会占40%到70%这是正常的不需要担心。最后再分享一个小技巧正式建图前先快速走一遍小范围路径确认轨迹没有断、没有明显漂移再开始长距离正式采集。这样能避免录制了大量无效数据后期回来处理才发现环境纹理不足或者初始化失败又得重录一遍。跑VINS这类项目前期多花十分钟验证配置比后期返工省心得多。
返回列表