SLAM面试常见问题

以前咱们分享过视觉SLAM找工做、面试经历,见《2018年SLAM、三维视觉方向求职经验分享》,《经验分享 | SLAM、3D vision笔试面试问题》。前端

从零开始学习SLAM知识星球里,会按期发布一些常见的SLAM问题引导你们讨论,并给出参考解答。如下列举几个已经发布的问题及回答。web

img

一、视觉SLAM方法通常分为特征点法和直接法。请简述一下特征点法和直接法的概念,以及对应的优缺点。面试

特征点法,根据提取、匹配 特征点来估计相机运动,优化的是重投影偏差,对光照变化不敏感 ,是比较成熟的方案。常见的开源方案 好比ORBSLAM算法

优势:编程

(1)特征点自己对光照、运动、旋转比较不敏感,因此比较稳定后端

(2)相机运动较快(相对直接法来讲)也能跟踪成功,鲁棒性好一些ide

(3)研究时间较久,方案比较成熟svg

缺点:学习

(1)关键点提取、描述子、匹配耗时长优化

(2)特征点丢失场景没法使用

(3)只能构建稀疏地图

直接法,根据相机的亮度信息估计相机的运动,能够不须要计算关键点和描述子,优化的是光度偏差,根据使用像素数量可分为稀疏、半稠密、稠密三种。常见开源方案有SVO, LSD-SLAM

优势:

(1)速度快,能够省去计算特征点、描述子时间

(2)能够用在特征缺失的场合(好比白墙),特征点法在该状况下会急速变差

(3)能够构建半稠密乃至稠密地图

缺点:

(1)由于假设了灰度不变,因此易受光照变化影响

(2)要求相机运动较慢或采样频率较高(能够用图像金字塔改善)

(3)单个像素或像素块区分度不强,采用的是数量代替质量的策略

二、视觉SLAM经常使用的相机包括,单目,双目,RGB-D相机,请分别说说它们自己的优缺点、经常使用的相机型号等。

如下是我使用时的一些总结,可能有疏漏错误,欢迎补充指正。

单目相机:

经常使用型号:有很是多的种类能够选择

优势:

一、应用最广,成本能够作到很是低。

二、体积小,标定简单,硬件搭建也简单。

三、能够用于室内和室外(有适当光照条件下)。

缺点:

一、具备纯视觉传感器的通病:在光照变化较大,纹理特征缺失、快速运动致使模糊的状况下没法使用(睁眼瞎)。

二、SLAM过程使用单目相机有尺度不肯定性,须要专门初始化。

三、必须经过运动才能估计深度(帧间匹配三角化)

双目相机:

经常使用型号:Indemind,小觅,ZED等

优势:

一、相比于单目,在静止时就可以根据左右相机视差图计算深度。

二、可测量距离能够根据基线调节。基线距离越大,测量距离越远。

三、能够用于室内和室外(有适当光照条件下)。

缺点:

一、双目相机标定相对复杂

二、用视差计算深度比较消耗资源

三、具备纯视觉传感器的通病:在光照变化较大,纹理特征缺失、快速运动致使模糊的状况下没法使用(睁眼瞎)。

RGB-D相机:

经常使用型号:Kinect系列、Realsense系列、Orbbec、Pico等

优势:

一、使用物理测距方法测量深度,因此避免了纯视觉传感器的通病,在没有光照的状况下、快速运动的状况下均可以测距。这是很是大的优点。

二、相对双目,输出帧率较高,更适合运动场景。

三、输出深度值比较准,结合RGB信息,容易实现手势识别、人体姿态估计等应用。

缺点:

一、测量范围窄,易受日光干扰,一般只能用于室内场景

二、在遇到透射材料、反光表面、黑色物体状况下表现很差,形成深度图缺失

三、一般分辨率没法作到很高,目前主流分辨率VGA(640x480)

四、标定比较复杂。

三、关键帧在SLAM里应用很是多,不少知名的开源算法都使用了关键帧。请你用本身的语言描述一下关键帧是什么?有什么用?如何选择关键帧?

关键帧目前是一种很是经常使用的方法,能够减小待优化的帧数,而且能够表明其附近的帧。能够理解为一个学校里有100个班级,每一个班的班长就是一个关键帧,他能够表明他班里的人,那么如何选取关键帧呢?

选取的指标主要有:

(1)距离上一关键帧的帧数是否足够多(时间)。好比我每隔固定帧数选择一个关键帧,这样编程简单但效果很差。好比运动很慢的时候,就会选择大量类似的关键帧,冗余,运动快的时候又丢失了不少重要的帧。

(2)距离最近关键帧的距离是否足够远(空间)/运动

好比相邻帧我根据pose计算运动的相对大小,能够是位移也能够是旋转或者两个都考虑,运动足够大(超过必定阈值)就新建一个关键帧,这种方法比第一种好。但问题是若是对着同一个物体来回扫就会出现大量类似关键帧。

(3)跟踪质量(主要根据跟踪过程当中搜索到的点数和搜索的点数比例)/共视特征点

这种方法就是记录当前视角下的特征点数,或者视角,当相机离开当前场景时才会新建关键帧,避免了第2种方法的问题。缺点是比较复杂

打个比方,关键帧至关于slam的骨架,是在局部一系列普通帧中选出一帧做为局部帧的表明,记录局部信息。举例来讲,摄像头放在原处不动,普通帧仍是要记录的,但关键帧由于总看到原场景,因此不会增长。
三角化须要必定程度的共视区域,因此普通帧每2帧之间会存在大量的信息冗余,若是全部帧所有参与计算,不只浪费了算力,对内存也是极大的考验,这一点在前端vo递归处理方式中表现不明显,但在后端优化里是一个大问题,因此关键帧主要做用是面向后端优化的算力与精度的折中。此外,关键帧选择时还会对图片质量、特征点质量等进行考察,必定程度上也发挥了滤波的做用,防止无用的或错误的信息进入优化过程而破坏定位建图的准确性。
选择关键帧主要从关键帧自身和关键帧与其余关键帧的关系2方面来考虑。一方面,关键帧自身质量要好,例如不能是很是模糊的图像、特征点数量要充足、特征点分布要尽可能均匀等等;另外一方面,关键帧与其余关键帧之间的关系,须要和局部地图中的其余关键帧有少许的共视关系,但大部分特征点是新特征点,以达到既存在约束,又尽可能少的信息冗余的效果,例如局部地图点投影到此帧的点数低于一个阈值或前一个关键帧的特征点在此帧里已经有90%观测不到等等。
在关键帧的运用上,我认为orbslam作的很是好,尤为是在回环检测中使用了以关键帧为表明的帧“簇”的概念,回环筛选中有一步将关键帧先后10帧为一组,计算组内总分,以最高分的组的0.75为阈值,滤除一些组,再在剩下的组内各自找最高分的一帧做为备选帧,这个方法很是好地诠释了“关键帧表明局部”的这个理念。

四、按照你的理解讲解一下什么是极线约束?这个约束能带来什么好处?

极线约束也叫对极约束。这个约束的意思就是说,假设相机在不一样位置拍摄了两幅图像,若是一个空间点P在两幅图上分别有两个成像点,已知左图成像点为p1,那么右图成像点p2必定在相对于p1的极线上。

(以上过程面试的时候最好画图解释一下,见附图,面试官会感受你很专业)

极线约束的好处:从上面的描述咱们能够看到,咱们在作特征点匹配时,左图成像点p1的待匹配点p2必定在相对于p1的极线上,那么咱们在作搜索时就能够在极线附近(考虑实际可能 会有一点偏差)进行搜索,相对暴力匹配极大减小待匹配的点的数量。

极线约束能够简洁的给出匹配点的空间位置关系,使得相机位姿估计问题变的简单。

限于篇幅,只列举以上几个问题及解答,如下全部问题《从零开始学习SLAM》知识星球里都有参考解答,而且会持续发布。欢迎交流讨论

五、SLAM后端通常有两种方法:滤波方法和非线性优化方法,这两种方法有什么优缺点?

六、单目视觉slam中尺寸漂移是怎么产生的?有什么解决办法

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

八、什么是PnP算法?请用你的语言描述一下原理,它通常用在什么场景,解决什么问题?

。。。

此外,咱们平时在SLAM的学习工做中也会遇到一些问题,我总结了一些常见的问题,也一并列在这里,并给出了答案(见知识星球)

九、 咱们知道相机的内参有 fx, fy, cx, cy, 畸变参数(只考虑k1, k2),相对世界坐标原点外参T。若是咱们如今对相机拍摄的图片进行2倍的下采样,那么这些参数会如何变化?

十、咱们知道双目相机两个相机光心的间距咱们 称之为 baseline。若是双目相机baseline比较大,咱们称之为wide baseline.如今某代码中使用一个单目相机进行SLAM过程,在特征匹配时资料中提到了wide baseline,请问这个wide baseline怎么理解?

十一、RGB-D相机咱们知道能够直接输出 RGB + depth两张图好比咱们常见的Kinect 是结构光原理,包括一个彩色相机,一个红外发射器,一个红外接收器。另外,Intel的Realsense系列RGB-D相机也很是经常使用,好比下面Realsense D415,官网说是Active IR stereo,也就是双目深度相机,这个双目和咱们平时说的双目有何不一样?为何有以下四个孔?

十二、咱们在阅读文献或者代码中偏差相关时,常常能够看到一个概念,叫逆深度(inverse depth)。也就是深度的倒数,那么同窗们有没有想过,为何使用逆深度偏差而不是深度偏差?

1三、咱们在看SLAM相关论文的时候,会遇到一个词“kidnap”, 直译过来就是“绑架”,不了解的同窗可能感受怪怪的。你知道这个“绑架”是什么意思吗?能够用哪些方法解决这样的问题?

1四、咱们知道(不知道的话,去查一下十四讲)用g2o和ceres库都能用来进行BA优化,这二者在使用过程当中有什么不一样?

1五、SLAM中回环检测(闭环检测)的目的是什么?简述一下SLAM中可使用的回环检测方法?

1六、SLAM中为何要引入李群李代数?

1七、为何SLAM中经常使用LM算法而不是高斯牛顿求解优化问题?

1八、讨论一下SLAM应用场景及落地的问题。你们以为SLAM技术最适合的应用场景是什么?在哪一个场景可以最快技术落地呢?

1九、你们都是SLAM方向的研究者,无论是学生仍是已经工做,之后都面临找(换)工做的问题,那么你知道哪些作SLAM技术的公司?

20、什么是ICP 算法?简述一下算法原理,SLAM中通常什么状况下会使用该算法?

。。。。

限于篇幅,只列举部分星球里已经发布的问题,以上全部问题《从零开始学习SLAM》知识星球里都有参考解答,而且会持续发布。

最近从零开始学习SLAM学习知识星球限时3天优惠,天天只需0.3元,加入3天内不满意全额退款。关于星球的详细介绍见:从零开始学习SLAM,欢迎加入星球学习、交流、讨论,一块儿进步!早就是优点!

推荐阅读

如何从零开始系统化学习视觉SLAM?
从零开始一块儿学习SLAM | 为何要学SLAM?
从零开始一块儿学习SLAM | 学习SLAM到底须要学什么?
从零开始一块儿学习SLAM | SLAM有什么用?
从零开始一块儿学习SLAM | C++新特性要不要学?
从零开始一块儿学习SLAM | 为何要用齐次坐标?
从零开始一块儿学习SLAM | 三维空间刚体的旋转
从零开始一块儿学习SLAM | 为啥须要李群与李代数?
从零开始一块儿学习SLAM | 相机成像模型
从零开始一块儿学习SLAM | 不推公式,如何真正理解对极约束?
从零开始一块儿学习SLAM | 神奇的单应矩阵
从零开始一块儿学习SLAM | 你好,点云
从零开始一块儿学习SLAM | 给点云加个滤网
从零开始一块儿学习SLAM | 点云平滑法线估计
从零开始一块儿学习SLAM | 点云到网格的进化
从零开始一块儿学习SLAM | 理解图优化,一步步带你看懂g2o代码
从零开始一块儿学习SLAM | 掌握g2o顶点编程套路
从零开始一块儿学习SLAM | 掌握g2o边的代码套路
零基础小白,如何入门计算机视觉?
SLAM领域牛人、牛实验室、牛研究成果梳理
我用MATLAB撸了一个2D LiDAR SLAM
可视化理解四元数,愿你再也不掉头发
最近一年语义SLAM有哪些表明性工做?
视觉SLAM技术综述
汇总 | VIO、激光SLAM相关论文分类集锦
研究SLAM,对编程的要求有多高?
2018年SLAM、三维视觉方向求职经验分享
2018年SLAM、三维视觉方向求职经验分享
深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?
视觉SLAM关键方法总结
SLAM方向公众号、知乎、博客上有哪些大V能够关注?
SLAM实验室
SLAM方向国内有哪些优秀公司?

限时优惠,快来开始学习SLAM!