【论文导读】Vins-mono: A robust and versatile monocular visual-inertial state estimato

870 阅读10分钟

论文名称:Vins-mono: A robust and versatile monocular visual-inertial state estimator

开源项目地址:github.com/HKUST-Aeria…(PC版本), github.com/HKUST-Aeria…(ios版本)

期刊:IEEE transactions on robotics

时间:2018

VINS-Mono 提出了一套完整的 单目视觉-惯性 紧耦合状态估计系统,支持实时定位、回环检测、重定位与全局图优化

数据集

EuRoC-MAV数据集,单目+IMU,第三方开源,projects.asl.ethz.ch/datasets/do…

自采数据(HKUST校园),单目+IMU,作者团队采集,未开源

Google Tango对比实验,单目+IMU,Google设备,未开源

主要工作

任务类型为单目视觉+惯性里程计(Monocular Visual-Inertial Odometry, VIO)+回环检测+全局优化

没有使用深度学习,完全是基于非线性优化传统几何方法(如PnP、BA、图优化)

系统模块包含 视觉前端(特征提取+跟踪)、IMU积分、初始化、滑窗BA、回环检测、重定位、4-DOF全局图优化

输出图像频率为10-30Hz,IMU频率为100-200Hz,支持IMU-rate输出(高频插值)

单目视觉

单目视觉只用一个普通摄像头(比如手机相机),没有深度传感器、没有双目、没有雷达

单张图像无法直接测距离 → 尺度未知(不知道1像素对应现实几米)

论文通过*连续图像帧 + IMU(惯性测量单元) *联合估计,恢复真实尺度(比如“向前走2米”而不是“向前走100像素”)

回环检测

回环检测可以简单理解为 你绕了一圈回到原点,系统发现“这个地方我来过”,从而消除累计误差(比如走着走着发现“咦,我怎么漂移了5米?”)

相关技术实现:

  • DBoW2(一种“图像字典”)快速比对当前帧和历史帧是否相似
  • 通过BRIEF特征匹配+ RANSAC几何验证,剔除误匹配。

在长走廊或重复纹理场景中,成功识别回环,把漂移从“米级”降到“厘米级”。

全局优化

全局优化可以简单理解为 回环检测后,系统发现“我之前以为A点在这里,现在发现其实是那里”,于是全局调整整条轨迹,像“拉橡皮筋”一样把所有位姿拉整齐。

相关技术细节:

  • 4-DOF优化只优化位置(x,y,z)和朝向(yaw角) ,因为roll/pitch角由IMU重力方向已确定。
  • 图优化:把每帧相机位姿看作“节点”,回环和连续轨迹看作“边”,用非线性最小二乘最小化所有边的误差。

论文在5.6公里校园数据集中,最终漂移仅0.07米(相对轨迹长度0.0012%)

非线性优化

非线性优化可以理解为 把“相机位姿、速度、IMU零偏”等所有未知量揉在一起构造一个误差函数,通过迭代调整这些量,让误差最小(类似“调参”)

论文中的具体作用:

  • 滑窗BA(Bundle Adjustment) :只优化最近10-20帧的位姿和特征点,实时性高
  • IMU预积分把高频IMU数据“打包”成帧间约束,避免重复积分,提速10倍以上
  • 鲁棒核函数(Huber Loss) :防止特征误匹配或IMU噪声“带偏”优化。

效果表现为 在EuRoC数据集上,位置误差0.1-0.3米,比传统滤波方法(如MSCKF)更准。

传统几何方法

传统几何方法不依赖神经网络,纯粹用几何关系(如三角测量、PnP、对极几何)+概率滤波/优化

论文中的应用:

  • 特征提取,Shi-Tomasi角点+KLT光流,找到图像中稳定跟踪的点
  • 初始化,5点法求相对位姿+IMU对齐,解决“尺度未知”问题
  • 特征三角化,多帧观测同一特征点,计算3D坐标
  • PnP,已知3D+2D观测,求相机位姿,新帧定位
  • BA优化,最小化重投影误差,联合优化位姿和3D点

无需训练数据,直接部署;可解释性强(每一步误差来源清晰);CPU实时(i7-5500U上50ms​/帧)

极端纹理缺失/光照突变时可能跟踪失败(论文用主动失效检测+重初始化解决)

特征提取

角点是指图像里像“十字路口”一样容易被认出来的点(比如桌角、门框)

光流像“追踪一个小蚂蚁在连续照片上的移动”,知道它从哪儿移动到哪儿

  • Shi-Tomasi角点检测: 计算图像每个像素周围灰度变化剧烈程度(用矩阵特征值判断),选出 “最像角”的点

  • KLT光流

    假设一个小窗口内所有像素一起平移,通过最小化灰度差异,求解窗口的平移向量 (u,v)

操作流程:

  • 第1帧,用Shi-Tomasi检测100-300​个角点
  • 第2帧开始,对每个角点,用KLT​光流追踪它在下一帧的未知
  • 剔除丢失/错误的点,用RANSAC​+基础矩阵剔除“跟丢”的点
  • 补新点,如果追踪点数太少,再检测新角点

5点法求相对位姿

(5-Point Algorithm)

你用手机拍了两张照片,想知道“手机从哪儿移动到哪儿”。

但手机没有尺子,只能用两张照片的像素点关系反推移动。

数学原理:

  • 输入:两张图像的5对匹配点(最少5对)。
  • 输出:相机之间的相对旋转 R相对平移 t(比例未知)。

核心为利用对极几何(Epipolar Geometry),求解本质矩阵 E(5点法可解出最多10个解,再用3D几何验证选1​个)

操作流程:

  • 用前面“特征提取”得到两帧的匹配点
  • 用5点法求解本质矩阵 E
  • 从 E 中分解出 R,t(注意:平移 t​ 是单位向量,真实尺度未知)
  • 后续通过 IMU 或三角化恢复尺度

特征三角化

人用两只眼睛看物体,可以判断远近(立体视觉)。

单目相机用 “移动的眼睛” (连续帧)也能“测距”。

数学原理:

  • 已知两帧相机的相对位姿 (R, t),同一个特征点在两帧图像的像素坐标 (u_{1}, u_{1}) 和 (u_{2}, u_{2})
  • 目标为求这个特征点的3D坐标 (X,Y,Z)
  • 方法为解线性方程组( DLT方法)或最小化重投影误差(SVD分解)

操作流程:

  • 用5点法得到两帧的 R,t
  • 对每个匹配点,用三角化求3D坐标
  • 得到稀疏的3D点云(就是SLAM里的“地图点”)

这里的地图点需做简要说明:

  • 地图点(Map Point)指在SLAM/VIO中,被相机多次观测到的3D空间点,也叫路标点(landmark)
  • 通过三角化(Triangulation)把同一特征点在多帧图像上的 2D 观测恢复成 3D 坐标
  • 在BA优化中为优化变量之一,BA会同时调整

地图点就像你在城市里反复看到的”显眼建筑“,BA​就像不断微调这些建筑的位置和你拍照时的展位,让所有照片里的建筑都对的上

地图点是 SLAM 中由三角化得到的 3D 路标,是 BA 优化的关键变量之一

PnP

你拿着一张地图(已知3D点),站在某个位置拍了一张照片(2D观测),想知道“我站在地图的哪个位置”。

PnP就是 已知3D地图点 + 2D像素点 → 求相机位姿

数学原理:

  • 输入n个3D点的世界坐标 (X_{i}, Y_{i}, Z_{i})这些点在图像中的像素坐标 (u_{i}, v_{i})
  • 输出相机的位姿 (位置 t + 朝向 R)

使用P3P(3点法)或EPnP(高效解法),再用RANSAC剔除误匹配

操作流程:

  • 用三角化得到的3D点作为“地图”
  • 新来一帧图像,用特征匹配找到这些3D点在图像的2D位置
  • 用P3P/EPnP求解新帧的相机位姿
  • 重复这个过程,实现”连续定位“

BA优化

(Bundle Adjustment)

你拍了很多张照片,每张照片都有“地图点”的观测

BA就像”调整所有照片的位置和地图点的位置“,让所有照片上的投影点都尽量对齐实际观测

数学原理:

  • 目标函数:最小化重投影误差(3D点投影到图像的坐标 vs 实际检测的像素坐标)
  • 优化变量:所有相机的位姿 (R_{i}, t_{i})所有3D点的坐标 (X_{j}, Y_{j}, Z_{j})

用非线性最小二乘(如Levenberg-Marquardt),在Ceres Solver里实现

操作流程:

  • 收集所有帧的观测数据(3D点+2D像素)
  • 构造重投影误差函数
  • 用优化器迭代调整位姿和3D​点坐标,直到误差最小
  • 得到全局一致、漂移最小的轨迹和地图

补充:RANSAC

目的:在存在大量误匹配(outliers) 的数据中鲁棒地估计模型参数(例如直线、平面、基础矩阵、单应矩阵等)

用尽量少的随机采样点先猜一个模型,再让数据自己投票

算法步骤:

  • 随机采样:从 N 个数据点中随机抽取 最小所需点数(直线需 2 点,基础矩阵需 8 点,5 点法需 5 点)

  • 模型拟合:用这 k 个点计算一条直线(或基础矩阵 F)

  • 投票/筛选:把其余 N-k 个点拿来测试

    若某点到直线的距离 < 阈值 ε,则记为 内点 (inlier),统计内点数量

  • 迭代:重复上述步骤 T 次,保留 内点最多 的那一次模型

  • 再优化:用所有内点重新拟合一次更精确的模型

迭代次数 T

T=\frac{\log(1-p)}{\log(1-w^k)}

其中,p 为期望置信度(通常为0.99),w 为内点比例估计值,k 为拟合模型所需的最小点数

在 SLMA/VIO 中的用途:

  • 特征匹配验证任务中,使用 RANSAC 估计基础矩阵 F,剔除误匹配点对
  • 在 PnP 任务中,使用 RNASAC 估计相机位姿 (R,t),剔除错误 2D-3D 对应
  • 在单应矩阵H中,使用 RNASAC 估计平面场景下的位姿,进行 AR/平面跟踪
  • 三角化中,使用 RNASAC 估计 3D 点,剔除深度异常点

总的来说,RANSAC 就是在噪声数据里“以少胜多”的鲁棒估计算法,通过随机采样+投票机制剔除误匹配,保证 SLAM 每一步的可靠性。

总结:单目视觉提供”眼睛“,IMU提供”内耳“,回环检测发现”走错路“,全局优化”重新画地图“,非线性优化把这一切“拧成一股绳”——最终让一个摄像头+IMU​的组合,实现了厘米级精度的实时定位

性能对比

对比方法类型结果
OKVIS滑窗优化VIOVINS-Mono在系统完整性(初始化+回环)上优于OKVIS;精度相当
Google Tango商业AR系统VINS-Mobile在长期漂移控制上优于Tango,局部精度略逊
ORB-SLAM视觉SLAM无IMU,无法恢复尺度,VINS-Mono在尺度估计和鲁棒性上更强

未使用深度学习模型

特征提取使用传统方法(Shi-Tomasi角点 + KLT光流),回环检测使用 DBoW2(BRIEF特征 + 词袋模型) ,优化使用Ceres Solver进行非线性优化(非神经网络)

VINS-Mono 是一个完全基于传统几何优化方法的单目视觉-惯性系统,支持初始化、回环、重定位和全局图优化,开源、实时、鲁棒,适用于无人机、AR、手机等场景。