ARTICLE DETAIL

资讯详情

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

基于EuRoc的视觉惯性SLAM实战:VINS-Fusion配置与轨迹评估

基于EuRoc的视觉惯性SLAM实战:VINS-Fusion配置与轨迹评估 1. 动手之前先搞清楚EuRoc数据集的家底1.1 这是一套什么数据ASL无人机实验平台经常有人在群里问为什么我照着网上教程跑EuRoc明明每一步都做了最后轨迹还是飘得没法看我一般先反问一句你下载的是MH_01_easy.bag还是自己录的数据你知道EuRoc里的IMU频率是多少、相机是多少Hz、外参文件放在哪吗大部分人来来回回只是跑起来了或者没跑起来根本没动过想搞清楚数据集本身的念头。EuRoc全称是EuRoC MAV Dataset是苏黎世联邦理工ASL实验室放出来的无人机视觉惯性数据集主要用一台微型飞行器在室内采集。它一共包含11个序列MH01到MH05是在机器大厅Machine Hall飞的V1_01_easy、V1_02_medium、V1_03_difficult、V2_01_easy、V2_02_medium、V2_03_difficult则在两个不同的房间场景里采集。难度划分很有讲究V1和V2系列光照变化大、纹理相对少对纯视觉SLAM来说比MH系列更不友好这也是为什么VINS-Fusion这类视觉惯性方案一到V系列序列上优势就特别明显。这套数据集从发布到今天已经成了视觉SLAM领域公认的基准测试平台。你去看任何一篇做双目视觉惯性SLAM的论文实验部分基本都会出现EuRoc。它之所以这么流行不是因为数据有多华丽而是因为它把真值给得非常完整——不只是提供相机的6DoF位姿真值还把IMU原始数据、双目图像、相机内参、畸变系数、相机到IMU的外参、IMU噪声参数全部打包提供。这意味着你不需要自己标定任何东西拿到手就能跑算法也能直接量化评估自己的系统精度。1.2 目录结构与文件格式别再用解压软件打开CSV很多新手第一次下载EuRoc的原始数据非bag版不知道该怎么整理。这里我给你把目录结构摊开讲清楚。解压之后顶层目录结构是这样的MH_01_easy/ ├── cam0/ │ ├── data/ │ │ ├── 1403636579763555584.png │ │ ├── ... │ └── data.csv ├── cam1/ │ ├── data/ │ └── data.csv ├── imu0/ │ ├── data.csv ├── leica0/ │ └── data.csv ├── state_groundtruth_estimate0/ │ └── data.csv ├── body_imu0/ │ └── data.csv └── mav0/ └── (某些新版本会包一层mav0)cam0和cam1分别是左右目相机采集到的灰度图像每个目录下一张PNG对应一个时间戳命名的文件名图像分辨率是752x480采样频率20Hz。imu0/data.csv是IMU原始数据200Hz包含加速度计和陀螺仪三轴读数。state_groundtruth_estimate0/data.csv是Vicon运动捕捉系统给出的6DoF位姿真值也是最终用来评估SLAM轨迹精度的标准答案。我特别提醒一下很多人直接拿Excel打开这些CSV文件然后被一长串数字搞得晕头转向。你只需要记住每一行第一列是时间戳单位是微秒microseconds也就是1e-6秒精度。VINS-Fusion和ORB-SLAM3的读取程序都是以微秒时间戳来对齐的如果你自己写数据读取脚本千万别把这个单位换算错。我见过有同学把微秒当毫秒用结果时间轴整整差了1000倍轨迹评估时APE大得离谱他还以为是算法出了问题。1.3 为什么EuRoc适合做双目IMU的入门数据现在很多刚入门SLAM的同学喜欢先拿自己的手机或者买一台深度相机录数据来跑。我的建议是在你还没有完全理解SLAM系统的输入输出关系之前先用EuRoc把整条链路跑通。原因是你自己录的数据中存在大量脏东西曝光变化、运动模糊、时间戳抖动、外参不准这些都是让算法发散的头号杀手。而这些干扰在EuRoc里被降到了最低数据集本身就是一套精心标定过的干净数据。如果你只是想验证某个SLAM算法能不能用、跑得准不准先拿EuRoc跑一遍如果连EuRoc都跑发散那基本可以确定是你的代码配置或者环境导入出了问题而不是算法本身的问题。反过来如果你在EuRoc上能稳定跑出不错的轨迹至少说明你的编译和运行链路是正常的接下来再去处理自己采集的数据就可以把问题聚焦在标定和数据质量上。这套排查逻辑会帮你省去大量的空白时间。2. 环境搭建从裸机到跑通SLAM的最小配置2.1 系统版本与依赖库的选择不同教程里的环境配置差异很大原因是EuRoc相关算法经历了比较长的版本迭代。以我自己长期用的组合来看最省心的配置是Ubuntu 18.04 ROS Melodic或者Ubuntu 20.04 ROS Noetic。如果你电脑里已经有Ubuntu 22.04也能跑但有些老版本的VINS-Fusion对OpenCV 4.x的处理存在问题编译时会报CV_LOAD_IMAGE_GRAYSCALE未定义之类的错误需要手动改源码适配。为了减少入门阶段的挫败感建议先用18.04或20.04后面熟悉了再去折腾新版本。依赖库方面核心是OpenCV、Eigen、Ceres、Pangolin。Eigen建议3.3.x版本Ceres Solver用1.14或2.x都行但要注意VINS-Fusion官方原版对Ceres 2.x支持没有问题直接编译即可。还有一个容易忽略的依赖是libsuitesparse-dev如果你编译Ceres之前没有装它后面求解器会缺一堆头文件。安装依赖最稳的命令顺序是sudo apt-get install -y libeigen3-dev libsuitesparse-dev libboost-all-dev liblapack-dev libopenblas-dev sudo apt-get install -y ros-melodic-desktop-full # Ubuntu 18.04 # 或者 sudo apt-get install -y ros-noetic-desktop-full # Ubuntu 20.04 pip install -U numpy rospkg catkin_tools装完ROS记得初始化工作空间mkdir -p ~/slam_ws/src cd ~/slam_ws catkin_init_workspace echo source ~/slam_ws/devel/setup.bash ~/.bashrc source ~/.bashrc2.2 编译VINS-Fusion一次能过的准备动作VINS-Fusion是港科大秦通等人开源的视觉惯性定位系统支持单目IMU、双目IMU、双目纯视觉三种模式。对于EuRoc这类数据我推荐先用双目IMU模式它能充分利用EuRoc提供的双目图像和IMU数据精度也最能体现融合优势。克隆和编译的常规流程如下cd ~/slam_ws/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ../ catkin_make如果一切顺利编译一次通过。但如果你遇到下面这类报错也属于正常现象不用慌fatal error: opencv2/xfeatures2d.hpp: No such file or directory说明OpenCV高版本把xfeatures2d模块移除了要么降级到OpenCV 3.4.x要么在VINS-Fusion的CMakeLists.txt里关掉相关特性。ceres/ceres.h: No such file or directoryCeres没装好重新编译安装Ceres。error: ‘CV_BGR2GRAY’ was not declaredOpenCV 4的API改名了到代码里把CV_BGR2GRAY改成cv::COLOR_BGR2GRAY。这些编译报错本质上就是版本API变化导致的跟你的操作没有关系动手改源码时注意看清楚每个报错对应的文件路径就行。2.3 数据包下载与目录规划两种思路EuRoc官方提供两种形式的数据一种是我们前面提到的原始文件结构另一种是把所有传感器数据打包成一个.bag文件这个bag通常有几十GB直接用ROS播放非常方便。对VINS-Fusion来说官方推荐用的是bag方式因为它的Example代码里写了从ROS话题读取数据的逻辑播放bag就等于在模拟真实传感器话题。下载bag文件时我建议你按照先小后大的顺序V1_01_easy.bag不到2GBMH_01_easy.bag大概4GB左右。先拿小序列把链路跑通再换大序列或者困难序列做精度测试。硬盘空间要留足11个bag全下完差不多要50GB以上如果只需要验证流程下2-3个就够。下载地址在EuRoc官网的Downloads页面里面也有MRU房间序列、Vicon真值等辅助数据。还有一个非常推荐的做法用wget下载时加上断点续传参数因为文件大网络断掉重来的概率不低wget -c http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/vicon_room1/V1_01_easy/V1_01_easy.bag-c参数就是continue的意思断点之后会自动接着下载这个细节在下载大bag文件时特别实用。3. IMU数据校准轨迹精度的隐形命门3.1 IMU噪声模型你知道Allan方差在干什么吗很多做视觉SLAM的同学对IMU的理解就是能积分出位姿然后视线就停在acc_n、acc_w、gyr_n、gyr_w这几个参数上却不知道这几个参数代表什么。我简单讲清楚底层的逻辑闭环。IMU的测量值可以建模为真值 白噪声 零偏 零偏变化。其中的白噪声用噪声密度angular/velocity random walk来描述零偏变化则用随机游走bias instability/random walk来描述。这些噪声特性会直接影响VIO系统的状态估计质量。如果你在配置里填入的噪声参数比实际传感器小很多滤波器就会过分相信IMU结果在快速运动时轨迹出现锯齿状漂移如果填得太大系统又过分依赖视觉在纹理弱的时候就会发散。那怎么知道真实传感器的这些参数是多少标准答案是用Allan方差分析。Allan方差本义是研究振荡器频率稳定性的工具后来被引入IMU噪声分析把静止状态下的IMU数据切成不同时长的子段计算每段均值的方差然后在对数坐标下画出一条Allan方差-积分时间曲线。曲线上的每一段斜率和拐点对应不同的噪声分量。很多人第一次听到Allan方差觉得高深我打个比方它就像在体检时测你的心率稳定性——你不能只看某一次心率读数而是要看一段时间内不同统计窗口下心率的波动趋势才能区分出你是剧烈波动还是平稳偶发波动。IMU的噪声分量也是靠这种多尺度统计拆出来的。3.2 用imu_utils做Allan方差从静止数据到参数对EuRoc数据集来说其实不需要你做Allan方差因为官方已经提供了一套校准好的参数。但为什么我还要专门讲一步因为会用数据集跑通和真正理解参数怎么来是两件事。你后面换成自己的传感器时这一套技能必须会用。港科大的imu_utils是业内用得最广的Allan方差分析工具之一。它的使用流程是让IMU在静止状态下持续采集至少2小时数据然后录制bag把bag里的IMU话题数据通过imu_utils的ROS节点转换成Allan方差曲线程序会拟合曲线并输出加速度计和陀螺仪的噪声密度、随机游走、零偏不稳定性等参数。在Ubuntu下编译imu_utils前需要先编译它的依赖code_utils。这里有个典型的坑code_utils在编译时可能会因为找不到backward.hpp报错解决办法是把该项目里src/backward.cpp和src/backward.hpp放到正确的include目录下或者在CMakeLists.txt里直接include_directories(${PROJECT_SOURCE_DIR}/src)。生成Allan方差后你会得到类似这样的输出gyr_noise_density: 1.2190646036e-04 gyr_random_walk: 8.7809467072e-06 acc_noise_density: 1.2479328772e-03 acc_random_walk: 2.6684075766e-05这里的gyr_noise_density对应VINS配置里的gyr_nacc_noise_density对应acc_n随机游走对应gyr_w和acc_w。单位上噪声密度分别是rad/s/√Hz和m/s²/√Hz。拿到这些数值之后才能填进VINS的yaml配置里。3.3 自采数据必做的Kalibr联合标定外参才是大头很多人在自己采集数据跑视觉惯性SLAM时往往只关注IMU自带标称参数却忽略了相机到IMU的外参标定。这一步的重要性很多时候被低估了——外参错1度在积分几十秒后造成的误差足以让整个轨迹产生明显漂移。Kalibr是ETH Zurich开源的相机/IMU联合标定工具它通过标定板Aprilgrid或Checkerboard的观测图像和IMU角速度、加速度数据联合优化得到相机内参、畸变、相机到IMU的外参旋转和平移、以及时间延迟。使用的时候需要先准备一个标定板yaml文件例如Aprilgrid的配置文件target_type: aprilgrid tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3采集数据时让IMU和相机一起缓慢运动充分激励X/Y/Z轴的角速度和加速度采集时间通常在1-2分钟。之后把图像压缩成bag运行kalibr_calibrate_imu_camera \ --target src/target.yaml \ --cam src/camchain.yaml \ --imu src/imu.yaml \ --bag data/imu_cam.bag \ --time-calibration输出文件里最关键的是T_ci它表示从IMU坐标系变换到相机坐标系的4x4变换矩阵。把它填到VINS的body_T_cam0和body_T_cam1参数里时要注意顺序VINS里填的是从bodyIMU到cam的外参单位是米旋转部分直接用四元数表示。Calibration输出的外参和噪声参数如果一起代入VINS你会发现轨迹精度往往比不标定之前高一个数量级——这真不是玄学我实测过一台自攒设备不标定时APE大约在1.2米标定之后直接降到0.35米左右。3.4 正确使用EuRoc官方标定参数EuRoc官方在数据集里提供了非常完整的标定文件。当你解压原始数据时可以在mav0目录下找到calib子目录里面有cam0.yaml、cam1.yaml、imu.yaml、cam0-cam1.yaml这几个文件。cam0.yaml里面是左目相机内参、畸变系数以及图像尺寸# Camera intrinsics cam0: camera_model: pinhole intrinsics: [458.654, 457.296, 367.215, 248.375] distortion_model: radial-tangential distortion_coeffs: [-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05]cam0-cam1.yaml里给出了左相机的相机坐标到右目相机坐标的变换T_CN_CN1包含旋转和平移平移量大约是0.11米左右这就是双目基线。imu.yaml给出了IMU噪声参数和相机到IMU的外参T_BS这里的T_BS是IMU到左目相机的外参VINS-Fusion配置里需要的是bodyIMU到cam的外参注意你填的时候要把旋转矩阵转成四元数并按照配置文件的字段顺序填好。我习惯先把每个yaml里的标定数据提取成一个统一的参数文档再对照VINS的配置逐项核查。这一步看起来繁琐但是能让你在跑之前就排除掉大量外参填错的问题。4. 双目视觉SLAM全流程实战以VINS-Fusion为主线4.1 配置双目IMU的launch与yaml参数VINS-Fusion的示例配置在VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml里。我建议你把这份文件复制一份到你自己的配置目录重命名成euroc_stereo_imu_config.yaml以后再改参数就不会污染原工程文件。打开配置文件核心参数有这几类imu_topic: /imu0 image0_topic: /cam0/image_raw image1_topic: /cam1/image_raw output_path: /home/user/output/euroc这里你要对照自己bag里的实际话题名来填。EuRoc的bag里话题名通常是/cam0/image_raw、/cam1/image_raw、/imu0但某些版本可能会不同先用rostopic list看清楚再填别照抄教程。IMU参数部分#imu parameters imu_rate: 200 acc_n: 0.9e-2 gyr_n: 0.9e-3 acc_w: 1.0e-4 gyr_w: 1.0e-5注意这里的值不是EuRoc的官方标准值是很多人的经验替代值。如果你已经通过imu_utils或官方imu.yaml拿到了准确数值直接用准确数值即可。官方imu.yaml给出的噪声密度、随机游走单位与VINS并不完全一致需要做一次单位换算换算逻辑就是前面讲的噪声密度 vs 随机游走。外参部分body_T_cam0: !!opencv-matrix rows: 4 cols: 4 dt: f data: [0.0148655429818, -0.999880929698, 0.00414029679422, -0.0216401454975, 0.999557249008, 0.0149672133247, 0.0257155299480, -0.0646069861633, -0.0257744366974, 0.00375618835797, 0.999660727178, 0.00981045219699, 0.0, 0.0, 0.0, 1.0]body_T_cam0指的是IMU坐标系到左目相机坐标系的变换。这里的数值建议直接复制EuRoc官方cam0-imu.yaml标定文件里计算好的矩阵不要自己手打一是麻烦二是容易复制错。launch启动文件部分VINS-Fusion的euroc.launch在VINS-Fusion/launch目录launch arg nameconfig_path default $(find vins_estimator)/../config/euroc/euroc_stereo_imu_config.yaml / node namevins_estimator pkgvins_estimator typevins_estimator outputscreen param nameconfig_file typestring value$(arg config_path) / /node /launch把default里的路径改成你刚才复制出来的配置路径。4.2 完整运行流程从bag播放到输出轨迹一切配置就绪之后运行分三路启动VINS节点、启动Rviz可视化、播放bag。我自己习惯把它们放在三个终端# 终端1启动VINS roslaunch vins_estimator euroc.launch # 终端2启动Rviz可视化 roslaunch vins_estimator vins_rviz.launch # 终端3播放bag rosbag play /path/to/V1_01_easy.bagVINS启动后终端会不断输出初始化状态包括waiting for IMU data、IMU data detected、Feature detector is initialized等。最开始的几秒钟系统处于纯惯性初始化阶段你要等它读取足够多的IMU数据完成初始化后才开始真正的视觉惯性里程计。这个过程会输出Initialization finished!或者类似提示文字。播放bag之后Rviz里会越来越多地显示出特征点、当前轨迹、以及相机位姿。整个V1_01_easy序列大约有100多秒的数据跑完之后VINS会把轨迹保存到你在output_path指定的目录下一般会产生一个vins_result_loop.tum和一个vins_result_no_loop.tum文件。前者是回环检测纠正后的轨迹后者是纯里程计轨迹。这个文件就是后面用evo评估的数据源。4.3 对比ORB-SLAM3的另一种跑法如果你不想只用VINS-Fusion想试试ORB-SLAM3它同样支持EuRoc双目IMU的输入。ORB-SLAM3的二进制示例程序可以直接读取EuRoc数据集目录非bag形式这是一种更轻量的方式适合做对比实验。编译ORB-SLAM3之前确保编译了Thirdparty下的DBoW2、g2o、Sophus和Pangolin。然后运行./Examples/Stereo-Inertial/stereo_inertial_euroc \ Vocabulary/ORBvoc.txt \ Examples/Stereo-Inertial/EuRoC.yaml \ /path/to/MH_01_easy/ \ Examples/Stereo-Inertial/EuRoC_TimeStamps/MH01.txtEuRoC.yaml中配置了双目相机内参、IMU外参、噪声参数这些参数也需要从EuRoc的标定文件里核对一遍。ORB-SLAM3跑完会在终端打印里程计轨迹并保存KeyFrameTrajectory_TUM_*.txt文件通常是文本格式的TUM轨迹可以直接用evo处理。我建议你把VINS-Fusion和ORB-SLAM3在同一序列上各跑一遍你会发现两者在EuRoc上的表现都非常好但细节上有差异VINS-Fusion在运动激励不足时的初始化更稳ORB-SLAM3在快速旋转时特征匹配的鲁棒性更胜一筹。这种对比能帮你理解不同算法想法的适用边界。4.4 运行结果的核心指标怎么看跑完之后终端里会刷出很多输出新手往往盯着一大屏数据不知道重点在哪。VINS-Fusion的终端会在每次优化完成后打印当前帧率、时间戳、特征点数等信息但更重要的是最后输出的轨迹文件。如果你不打算立刻做evo评估也可以先看几个粗略指标轨迹是否出现明显跳变在Rviz里看轨迹线如果有突然的断点或飞出去的情况大概率是特征跟踪失败了。回环检测是否触发VINS-Fusion在识别到回环时轨迹会有一个突变式的纠正终端会打印Loop detected!之类的信息。位姿输出的连续性如果终端偶尔出现outlier或者no enough features要看频率高不高频率太高说明场景质量差或者外参有问题。当然这些直观判断都不算严格要用数字说话还是得做轨迹评估这就是下一节的内容。5. 轨迹评估用evo量化精度而不是凭感觉5.1 真值文件格式与TUM格式的转换EuRoc官方真值文件state_groundtruth_estimate0/data.csv的格式是每行包含timestamp, p_RS_R_x, p_RS_R_y, p_RS_R_z, q_RS_w, q_RS_x, q_RS_y, q_RS_z在部分版本里也可能是四元数的顺序是w,x,y,z。注意这里的坐标系是机器人的机体坐标系但很多SLAM算法输出轨迹时的坐标系定义和它并不完全一致评估之前要先统一坐标系否则你的APE会非常大。evo工具内置了对EuRoc格式的直接支持。比如evo_traj euroc /path/to/state_groundtruth_estimate0/data.csv --save_as_tum它会自动把EuRoc真值转换成标准TUM格式文件格式为timestamp, x, y, z, qx, qy, qz, qw。VINS输出的vins_result_loop.tum本身就是TUM格式所以两边的文件格式就统一了。如果真值文件和估计轨迹的坐标系存在旋转差异你还需要先做位姿对齐先用-a参数即SE(3) Umeyama对齐evo会帮你自动求解一个刚体变换把两条轨迹对齐到同一坐标系下来计算误差。5.2 evo_ape与evo_rpe的正确使用evo是SLAM轨迹评估最常用的工具它包含多个子命令但核心就两个evo_ape计算绝对位姿误差用于评估全局一致性和evo_rpe计算相对位姿误差用于评估局部漂移。对于EuRoc序列我一般这样用# 绝对位姿误差 evo_ape tum /path/to/gt.tum /path/to/vins_result_loop.tum -va --plot --plot_modexyz # 相对位姿误差 evo_rpe tum /path/to/gt.tum /path/to/vins_result_loop.tum -va --plot --plot_modexyz参数-v输出详细统计-a做位姿对齐--plot_modexyz将平移误差分解显示。运行结束后终端会列出RMSE、Mean、Median、Std、Min、Max等统计指标。我们通常最关注RMSE和Mean它们能直观反映轨迹的整体精度。如果看到APE的RMSE在0.2米到0.5米范围说明这套系统在EuRoc上跑得不错如果超过1米就要回头检查数据、配置或者看看是不是真值坐标系没对齐。5.3 时间戳对齐与其他常见的评估陷阱评估时的坑很多大部分人都栽在时间戳对齐上。VINS输出的时间戳是优化时刻的时间戳而真值文件的时间戳来自Vicon运动捕捉系统两者频率不同SLAM通常是10-30Hz真值是100Hz以上。evo默认会做时间戳的线性插值对齐但如果你加错了参数比如没有加--align评估结果就失去了参考意义。单位的坑也常遇到。EuRoc的CSV里时间戳是微秒但VINS输出的tum文件里时间戳是秒浮点数如果你自己写转换脚本一定要统一单位。我见过有人把EuRoc的微秒时间戳除以1000当成秒结果整个轨迹时间轴被压缩了1000倍评估出来的误差根本没法看。还有一个值得注意的点回环检测会显著影响全局一致性所以vins_result_loop.tum和vins_result_no_loop.tum的APE会有明显差距。跑实验对比时要明确告诉你自己和读者用的是哪个输出文件别含糊。6. 亲历的踩坑记录与排查方法6.1 轨迹发散先查IMU不要一上来就调算法我刚开始跑EuRoc时第一次试VINS-FusionV1_02_medium跑了一半Rviz里的轨迹刷一下飘到十几米外。当时我第一反应是算法参数没调好于是反复调特征点数、窗口大小折腾了一个下午毫无起色。后来查了代码发现是yaml配置里的acc_w填大了两个数量级导致IMU状态估计对加速度计噪声建模失真视觉惯性优化结果全被带偏。这个经历让我养成了一个排查习惯轨迹发散时先确认IMU相关参数——包括acc_n、acc_w、gyr_n、gyr_w和外参再考虑图像特征、特征跟踪质量的配置。因为IMU参数错是有延迟爆发特征的启动初期轨迹看着正常几秒后开始漂移越漂越快最后直接发散。6.2 图像时间戳错位你需要先确认相机帧率另一个常见怪现象是VINS启动后窗口卡住或者特征点匹配率奇低。排查思路是先rostopic info /cam0/image_raw确认bag里图像话题的实际帧率。EuRoc的相机是20Hz但如果你从某个渠道下载的bag被人重新录制过帧率可能被压成10Hz甚至更小。VINS的yaml配置里可能需要正确设置相机帧率相关的参数尽管VINS-Fusion大多是自动从时间戳推断但过低的帧率会直接影响特征跟踪的稳定性。如果发现帧率和官方不一致建议重新下载原始bag不要图省事用别人转好的压缩版很多压缩工具会把图像从全局快门模式重新编码导致时间戳和画面内容不一致。6.3 编译和运行时的版本兼容问题版本兼容问题在SLAM工程里简直防不胜防。我遇到最多的是OpenCV 4和Ceres 2同时存在时VINS-Fusion里某些老代码调用的函数已经废弃编译直接报错。我的建议是一套用来跑经典SLAM工程的工作环境版本组合尽量保持经典——Ubuntu 18.04 ROS Melodic OpenCV 3.4 Ceres 1.14 Eigen 3.3这个组合能通吃大部分老项目。如果确实要用新系统那就做好心理准备去改代码。比如OpenCV 4里把CV_LOAD_IMAGE_GRAYSCALE改成cv::IMREAD_GRAYSCALECV_BGR2GRAY改成cvtColor接口配合cv::COLOR_BGR2GRAY。这类改动不复杂一眼就能看明白改完编译就能通过。6.4 在EuRoc上练手之后下一步该做什么如果你已经把VINS-Fusion和ORB-SLAM3在EuRoc上跑通并且能用evo做出漂亮的评估表说明你已经基本掌握了视觉惯性SLAM的完整调试链路。这时候我建议你做三件事第一把EuRoc的11个序列全部跑一遍统计不同场景难度对精度的影响形成自己的对比表第二尝试把相机换成RGB-D体会深度相机与双目在EuRoc这类基准上的异同第三接入自己录制的数据把前面学的Allan方差和Kalibr联合标定真正用起来。在换成自己数据时要特别留意场景中的快速运动和高动态光照。EuRoc里虽然也有光照变化但远没有真实走廊里窗户光线那样极端。如果自采数据跑崩了优先怀疑图像质量、运动速度、光照变化这三个因素别一上来就怪算法。我个人在实际操作中的体会是视觉惯性SLAM这个方向数据和标定的重要性被严重低估了。很多初学者把大量时间花在调算法参数上却不舍得花时间把数据标定做扎实。EuRoc的意义就在于给了所有人一个公平的起跑线——它帮你把数据质量这个变量控制住让你能把精力集中到算法本身。等你在EuRoc上建立了自己的基线标准和排查方法再回头处理真实场景心里就会非常有底。最后再分享一个小技巧跑比较困难的V2_03_difficult序列时把Rviz里的点云显示关掉可以明显减少卡顿轨迹输出本身不受影响但这个序列对特征跟踪的压迫感非常强会逼着你去理解为什么视觉惯性系统会在纯纹理区域失效。这才是EuRoc数据集给你的真正财富。
返回列表