自动驾驶-机器人-slam-定位面经和面试知识系列04之高频面试题(02)

这个博客系列会分为C++ STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客也会同步更新,全网同号(lonely-stone或者lonely_stone)。
关于高频面试题和C++ STL面经,每次我会更新10个问题左右,每次更新过多,害怕大家可能看了就只记住其中几个点。(在个人秋招面试过程中,面试到后面,发现除了个人项目和实习经历外,个人所记录的内容基本能涵盖面试官能问到的)
(另外个人才疏学浅,如果所分享知识中出现错误,请大家指出,避免误导其他人)

1. 简单描述特征点法和直接法的优缺点

  • 特征点法:
    • 优点:精确,直接法属于强假设;运动过大时,只要匹配点在像素内,则不太会误匹配,鲁棒性好。
    • 缺点:关键点提取、描述子计算和匹配等耗时长;特征点丢失则场景无法使用;只能构建稀疏地图
  • 直接法:
    • 优点:省去计算特征点和描述子时间;可以用在特征缺失场景(如白墙);可以构建稠密和半稠密地图
    • 缺点:易受光照和模糊影响;运动微小或者运动慢或者采样频率高(可以用图像金字塔改善);非凸性

2. 直接法与特征点法的优缺点

如果面试官只是简单问问就答上面的简易版本,如果面试官是想根据这种对基础的SLAM理解来考察的话(特点就是:面试官询问这个问题时并不着急,并且你感觉他想多了解的时候),就具体按照下面的理解进行交流。
直接法最大的贡献在于,以更整体、更优雅的方式处理了数据关联问题。特征点法需要依赖重复性较强的特征提取器,以及正确的特征匹配,才能得到正确地计算相机运动。而直接法并不需要一一对应的匹配,只要先前的点在图像当中有合理的投影残差,我们就认为这次投影是成功的。而成功与否,主要取决于我们对地图点深度以及相机位姿的判断,并不在于图像局部看起来是什么样子。
直接法的优势:

  • 相比特征点法(只使用了特征点周围的信息),直接法使用了图像中全部的信息(半直接法只用了边缘梯度)。
  • 节省特征提取与匹配的大量时间,易于移植到嵌入式系统中,以及与IMU进行融合;
  • 使用的是像素梯度而不必是角点,可以在特征缺失的场合使用,如环境中存在许多重复纹理或是缺乏角点,但出现许多边缘或光线不明显区域;
  • 可以进行稠密或半稠密的地图重建。

直接法的劣势:

  • 一般对相机要求较高,需要全局快门相机,进行光度标定等操作;
  • 灰度不变是一个很强的假设,难以满足(易受曝光和模糊影响)
  • 单像素区没有区分度,需要计算图像块或是相关性;
  • 直接法成功的前提,是目标函数从初始值到最优值之间一直是下降的,然而图像非凸。因此需要有一个相当不错的初始估计,还需要一个质量较好的图像;
  • 难以实现地图复用、回环检测、丢失后的重定位等:除非存储所有的关键帧图像,否则很难利用先前建好的地图;即使有办法存储所有关键帧的图像,那么在重用地图时,我们还需要对位姿有一个比较准确的初始估计——这通常是困难的。

数据关联和位姿估计,在直接中是耦合的,而在特征点法中则是解耦的。耦合的好处,在于能够更整体性地处理数据关联;而解耦的好处,在于能够在位姿不确定的情况下,仅利用图像信息去解数据关联问题。所以直接法更擅长求解连续图像的定位,而特征点法则更适合回环检测与重定位。此外,稀疏直接法更适用于实时性较高而计算资源有限的场合。

3. 特征点法和直接法的BA有何不同

误差函数不同。特征点法是重投影误差,直接法是光度误差
雅克比矩阵不同

4. 光流法和直接法有何不同

光流法仅估计了像素间的平移,但没有使用相机结构,没有考虑相机的旋转和图像缩放,边界点追踪效果差;

5. 单目、双目和深度相机对比

  • 单目:成本低,搭建简单,但有尺度不确定性,需要专门初始化
  • 双目:不需要专门初始化,能计算深度,基线距离越大,测量距离越远,可以用于室内外,但标定较为复杂,视差计算比较浪费计算资源。
  • 深度:测量范围窄,噪声大,易受日光干扰,无法测量透射材料,主要用于室内

6. 常用的边缘检测算子和优缺点

边缘检测一般分为三步:分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后再用卷积内核寻找像素梯度。常用以下三种

  • canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅度值和方向,对梯度幅值进行非极大抑制,采用双阈值检测和连接边缘。
  • sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强。计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
  • laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。

7. RANSAC方法

此算法的基本假设是样本中既存在正确数据,也存在异常数据。然后假设给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。算法优点是可以鲁邦的估计模型参数,即从大量包含外点的数据中估计出高精度的参数;缺点则是它计算参数的迭代次数没有上限,如果认为设置上限,可能得到的结果不是最优的,甚至是错误的结果。
RANSAC算法在slam中主要用于剔除误匹配。其目的是找到最优的单应矩阵H使得满足该矩阵的数据点个数最多,其中求H或者orbslam中求F都是采用八点法:ransac具体算法步骤:

8. PROSAC算法

此算法是ransac算法的改进,其主要引入了对匹配点对的评估函数Q。评估函数主要功用是用来评价匹配点对的质量(或者叫对模型的相关程度),通常计算匹配点对描述子的欧氏距离为该点对的质量,得到质量后便有以下步骤计算:

  1. 把匹配点对按其质量高低降序排序,选取质量大于阈值的n个数据;
  2. 从n个点对中随机剔除m个,用剩余的点对来拟合计算模型(单应矩阵H),记录与该模型的距离小于一定阈值的点对个数,即为内点个数;
  3. 若内点的数目大于设定阈值数目,则返回内点和模型,否则继续迭代,重复2;

9. 视差与深度的关系?视差出现在单目中是为什么?

视差与深度的关系就是那个算视差的图;视差在单目系统中可以用于初始化和判断是否关键帧。初始化是看相机是否产生了有效的移动;判断是否关键帧也是类似原理。

10. 八点法原理和过程

在对极几何中,F是3x3,但是因为F存在尺度等价性和不满秩两个约束,故自由度为7,所以理论上只需要7对点,然而该结果可能会给出F的3个解,且所有3个解都要通过检验来选择。因此通常会选择8对点来构建超定方程,然后通过最小二乘,并添加强迫约束来求解。

11. Eigen库在class中的那个宏定义EIGEN_MAKE_ALIGNED_OPERATOR_NEW

  • 作用:用于在EIgen的C++库中启用对齐内存分配
  • 原因概述:Eigen是一个流行的C++线性代数库,提供了一套用于向量和矩阵操作的类和函数。对齐内存分配对于在具有SIMD(单指令多数据)指令(如Intel的SSE和AVX)的现代处理器上进行高效计算至关重要。默认情况下,C++使用new运算符为对象分配内存。然而,通过new分配的内存不能保证按照SIMD指令的要求进行对齐。这可能导致使用Eigen进行矢量化计算时性能下降。为了解决这个问题,Eigen提供了EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏。当在类定义中使用此宏时,它会重载该类的new和delete运算符,确保为Eigen类型正确对齐内存分配。通常将此宏放置在类的私有部分

12. 直接法估计相机位姿时,并不需要提取特征点,而是通过优化匹配点的像素值误差(也称光度误差)估计位姿,但会面临快速运动,光照变化等的挑战,如果让你改善该问题,你会采用哪些方法来提高跟踪质量(精度,速度,鲁棒性等)?

从算法角度来说,通常会采用图像金字塔方式,按照从粗到细的方式迭代计算位姿,首先对待匹配的两幅图做分层抽样,先对层数高的、图像尺寸小的层进行匹配,将匹配的结果作为初始值,继续匹配图像尺寸大的层。
另外,在粗配准时,通过将图像中的高频信息滤掉,可以降低因为相机大的移动造成的锯齿效应的影响,并且可以增大算法的在相机移动距离较大时算法的收敛性。

13. 简述一下你对卡方检验的理解。

卡方检验是一种用途很广的计数资料的假设检验方法。属于非参数检验,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想在于比较理论频数和实际频数的吻合程度或者拟合优度问题。
ORB-SLAM中卡方检验的作用:当事实与期望不符合情况下使用卡方分布用来检验拟合程度和两个变量的独立性。在ORB-SLAM中卡方检验用来检测剔除外点

你可能感兴趣的:(自动驾驶,机器人,面试)