SLAM面试常见问题
之前我们分享过视觉SLAM找工作、面试经历,见《2018年SLAM、三维视觉方向求职经验分享》,《经验分享 | SLAM、3D vision笔试面试问题》。
从零开始学习SLAM知识星球里,会定期发布一些常见的SLAM问题引导大家讨论,并给出参考解答。以下列举几个已经发布的问题及回答。
1、视觉SLAM方法一般分为特征点法和直接法。请简述一下特征点法和直接法的概念,以及对应的优缺点。
特征点法,根据提取、匹配 特征点来估计相机运动,优化的是重投影误差,对光照变化不敏感 ,是比较成熟的方案。常见的开源方案 比如ORBSLAM
优点:
(1)特征点本身对光照、运动、旋转比较不敏感,所以比较稳定
(2)相机运动较快(相对直接法来说)也能跟踪成功,鲁棒性好一些
(3)研究时间较久,方案比较成熟
缺点:
(1)关键点提取、描述子、匹配耗时长
(2)特征点丢失场景无法使用
(3)只能构建稀疏地图
直接法,根据相机的亮度信息估计相机的运动,可以不需要计算关键点和描述子,优化的是光度误差,根据使用像素数量可分为稀疏、半稠密、稠密三种。常见开源方案有SVO, LSD-SLAM
优点:
(1)速度快,可以省去计算特征点、描述子时间
(2)可以用在特征缺失的场合(比如白墙),特征点法在该情况下会急速变差
(3)可以构建半稠密乃至稠密地图
缺点:
(1)因为假设了灰度不变,所以易受光照变化影响
(2)要求相机运动较慢或采样频率较高(可以用图像金字塔改善)
(3)单个像素或像素块区分度不强,采用的是数量代替质量的策略
2、视觉SLAM常用的相机包括,单目,双目,RGB-D相机,请分别说说它们本身的优缺点、常用的相机型号等。
以下是我使用时的一些总结,可能有疏漏错误,欢迎补充指正。
单目相机:
常用型号:有非常多的种类可以选择
优点:
1、应用最广,成本可以做到非常低。
2、体积小,标定简单,硬件搭建也简单。
3、可以用于室内和室外(有适当光照条件下)。
缺点:
1、具有纯视觉传感器的通病:在光照变化较大,纹理特征缺失、快速运动导致模糊的情况下无法使用(睁眼瞎)。
2、SLAM过程使用单目相机有尺度不确定性,需要专门初始化。
3、必须通过运动才能估计深度(帧间匹配三角化)
双目相机:
常用型号:Indemind,小觅,ZED等
优点:
1、相比于单目,在静止时就能够根据左右相机视差图计算深度。
2、可测量距离可以根据基线调节。基线距离越大,测量距离越远。
3、可以用于室内和室外(有适当光照条件下)。
缺点:
1、双目相机标定相对复杂
2、用视差计算深度比较消耗资源
3、具有纯视觉传感器的通病:在光照变化较大,纹理特征缺失、快速运动导致模糊的情况下无法使用(睁眼瞎)。
RGB-D相机:
常用型号:Kinect系列、Realsense系列、Orbbec、Pico等
优点:
1、使用物理测距方法测量深度,所以避免了纯视觉传感器的通病,在没有光照的情况下、快速运动的情况下都可以测距。这是非常大的优势。
2、相对双目,输出帧率较高,更适合运动场景。
3、输出深度值比较准,结合RGB信息,容易实现手势识别、人体姿态估计等应用。
缺点:
1、测量范围窄,易受日光干扰,通常只能用于室内场景
2、在遇到透射材料、反光表面、黑色物体情况下表现不好,造成深度图缺失
3、通常分辨率无法做到很高,目前主流分辨率VGA(640x480)
4、标定比较复杂。
3、关键帧在SLAM里应用非常多,很多知名的开源算法都使用了关键帧。请你用自己的语言描述一下关键帧是什么?有什么用?如何选择关键帧?
关键帧目前是一种非常常用的方法,可以减少待优化的帧数,并且可以代表其附近的帧。可以理解为一个学校里有100个班级,每个班的班长就是一个关键帧,他可以代表他班里的人,那么如何选取关键帧呢?
选取的指标主要有:
(1)距离上一关键帧的帧数是否足够多(时间)。比如我每隔固定帧数选择一个关键帧,这样编程简单但效果不好。比如运动很慢的时候,就会选择大量相似的关键帧,冗余,运动快的时候又丢失了很多重要的帧。
(2)距离最近关键帧的距离是否足够远(空间)/运动
比如相邻帧我根据pose计算运动的相对大小,可以是位移也可以是旋转或者两个都考虑,运动足够大(超过一定阈值)就新建一个关键帧,这种方法比第一种好。但问题是如果对着同一个物体来回扫就会出现大量相似关键帧。
(3)跟踪质量(主要根据跟踪过程中搜索到的点数和搜索的点数比例)/共视特征点
这种方法就是记录当前视角下的特征点数,或者视角,当相机离开当前场景时才会新建关键帧,避免了第2种方法的问题。缺点是比较复杂
打个比方,关键帧相当于slam的骨架,是在局部一系列普通帧中选出一帧作为局部帧的代表,记录局部信息。举例来说,摄像头放在原处不动,普通帧还是要记录的,但关键帧因为总看到原场景,所以不会增加。
三角化需要一定程度的共视区域,所以普通帧每2帧之间会存在大量的信息冗余,如果所有帧全部参与计算,不仅浪费了算力,对内存也是极大的考验,这一点在前端vo递归处理方式中表现不明显,但在后端优化里是一个大问题,所以关键帧主要作用是面向后端优化的算力与精度的折中。此外,关键帧选择时还会对图片质量、特征点质量等进行考察,一定程度上也发挥了滤波的作用,防止无用的或错误的信息进入优化过程而破坏定位建图的准确性。
选择关键帧主要从关键帧自身和关键帧与其他关键帧的关系2方面来考虑。一方面,关键帧自身质量要好,例如不能是非常模糊的图像、特征点数量要充足、特征点分布要尽量均匀等等;另一方面,关键帧与其他关键帧之间的关系,需要和局部地图中的其他关键帧有少量的共视关系,但大部分特征点是新特征点,以达到既存在约束,又尽量少的信息冗余的效果,例如局部地图点投影到此帧的点数低于一个阈值或前一个关键帧的特征点在此帧里已经有90%观测不到等等。
在关键帧的运用上,我认为orbslam做的非常好,尤其是在回环检测中使用了以关键帧为代表的帧“簇”的概念,回环筛选中有一步将关键帧前后10帧为一组,计算组内总分,以最高分的组的0.75为阈值,滤除一些组,再在剩下的组内各自找最高分的一帧作为备选帧,这个方法非常好地诠释了“关键帧代表局部”的这个理念。
4、按照你的理解讲解一下什么是极线约束?这个约束能带来什么好处?
极线约束也叫对极约束。这个约束的意思就是说,假设相机在不同位置拍摄了两幅图像,如果一个空间点P在两幅图上分别有两个成像点,已知左图成像点为p1,那么右图成像点p2一定在相对于p1的极线上。
(以上过程面试的时候最好画图解释一下,见附图,面试官会感觉你很专业)
极线约束的好处:从上面的描述我们可以看到,我们在做特征点匹配时,左图成像点p1的待匹配点p2一定在相对于p1的极线上,那么我们在做搜索时就可以在极线附近(考虑实际可能 会有一点误差)进行搜索,相对暴力匹配极大减少待匹配的点的数量。
极线约束可以简洁的给出匹配点的空间位置关系,使得相机位姿估计问题变的简单。
限于篇幅,只列举以上几个问题及解答,以下所有问题《从零开始学习SLAM》知识星球里都有参考解答,并且会持续发布。欢迎交流讨论
5、SLAM后端一般有两种方法:滤波方法和非线性优化方法,这两种方法有什么优缺点?
6、单目视觉slam中尺寸漂移是怎么产生的?有什么解决办法
7、直接法估计相机位姿时,并不需要 提取特征点,而是通过优化匹配点的像素值误差(也称光度误差)估计位姿,但也会面临快速运动,光照变化等的挑战,如果让你改善该问题,你会采用哪些方法来提高跟踪质量(精度,速度,鲁棒性等)?
8、什么是PnP算法?请用你的语言描述一下原理,它一般用在什么场景,解决什么问题?
。。。
此外,我们平时在SLAM的学习工作中也会遇到一些问题,我总结了一些常见的问题,也一并列在这里,并给出了答案(见知识星球)
9、 我们知道相机的内参有 fx, fy, cx, cy, 畸变参数(只考虑k1, k2),相对世界坐标原点外参T。如果我们现在对相机拍摄的图片进行2倍的下采样,那么这些参数会如何变化?
10、我们知道双目相机两个相机光心的间距我们 称之为 baseline。如果双目相机baseline比较大,我们称之为wide baseline.现在某代码中使用一个单目相机进行SLAM过程,在特征匹配时资料中提到了wide baseline,请问这个wide baseline怎么理解?
11、RGB-D相机我们知道可以直接输出 RGB + depth两张图比如我们常见的Kinect 是结构光原理,包括一个彩色相机,一个红外发射器,一个红外接收器。另外,Intel的Realsense系列RGB-D相机也非常常用,比如下面Realsense D415,官网说是Active IR stereo,也就是双目深度相机,这个双目和我们平时说的双目有何不同?为什么有如下四个孔?
12、我们在阅读文献或者代码中误差相关时,经常可以看到一个概念,叫逆深度(inverse depth)。也就是深度的倒数,那么同学们有没有想过,为什么使用逆深度误差而不是深度误差?
13、我们在看SLAM相关论文的时候,会遇到一个词“kidnap”, 直译过来就是“绑架”,不了解的同学可能感觉怪怪的。你知道这个“绑架”是什么意思吗?可以用哪些方法解决这样的问题?
14、我们知道(不知道的话,去查一下十四讲)用g2o和ceres库都能用来进行BA优化,这两者在使用过程中有什么不同?
15、SLAM中回环检测(闭环检测)的目的是什么?简述一下SLAM中可以使用的回环检测方法?
16、SLAM中为什么要引入李群李代数?
17、为什么SLAM中常用LM算法而不是高斯牛顿求解优化问题?
18、讨论一下SLAM应用场景及落地的问题。大家觉得SLAM技术最适合的应用场景是什么?在哪个场景能够最快技术落地呢?
19、大家都是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面试常见问题的更多相关文章
- Java后台面试 常见问题
Java后台面试 常见问题 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米.百度.阿里.京东.新浪.CVTE.乐视家的研发岗offer.我找的是java后台开发,把常见的问题分享 ...
- 2019最新最全Java开发面试常见问题答案总结
2019最新最全Java开发面试常见问题答案总结 马上准备9月份出去面试Java开发,自己学习丢西瓜捡芝麻,学了的都忘了,所以有机会自己做个学习笔记,摘录自各个博文以及总结. 1.JAVA面向对象的特 ...
- C++面试常见问题——01预处理与宏定义
C++面试常见问题--------01预编译和宏的使用 C++预处理器 预处理器是一些指令,它将指示编译器在实际编译之前需要完成的预处理.预处理必须要在对程序进行词法与语义分析.代码生成与优化等通常的 ...
- MySQL索引知识点&面试常见问题
来源:BiggerBoy 作者:北哥 原文链接:https://mp.weixin.qq.com/s/fucHvdRK5wRrDfBOo6IBGw 大家好我是北哥,今天整理了MySQL索引相关的知识点 ...
- Java软件工程师面试常见问题集锦之一
1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...
- python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题
笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...
- C++ 复习要点、面试常见问题总结
本文总结一下C++面试时常遇到的问题.C++面试中,主要涉及的考点有: 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, n ...
- JAVA工程师面试常见问题集锦
集锦一: 一.面试题基础总结 1. JVM结构原理.GC工作机制详解 答:具体参照:JVM结构.GC工作机制详解 ,说到GC,记住两点:1.GC是负责回收所有无任何引用对象的内存空间. 注意: ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...
随机推荐
- Docker之使用Docker-compose搭建LNMP环境
之前有随笔介绍使用Docker-compose搭建LNMP环境(centos6 php5.6) https://www.cnblogs.com/minseo/p/10146982.html 本文介绍D ...
- 创建 LVM
1.将物理磁盘设备条带化为物理卷 # pvcreate /dev/sdb 查看物理卷: # pvs# pvdisplay 2.创建卷组,并添加 PV 到卷组 # vgcreate vg1 /dev/s ...
- python 最麻烦的时间有药了
https://www.cnblogs.com/sunshineyang/p/6818834.html 一:经常使用的时间方法 1.得到当前时间 使用time模块,首先得到当前的时间戳 In [42] ...
- ES-IK分词器
一.安装 https://www.cnblogs.com/wudequn/p/11001382.html https://github.com/medcl/elasticsearch-analysis ...
- Nginx08---腾讯云宝塔面板
主要在宝塔面板中Nginx和Apache不可同时存在 宝塔可以快速搭建网站并且配置 与nginx不冲突:nginx nginx
- C++语法笔记(上)
客观事物中任何一个事物都可以看成一个对象,对象是由一组属性和一组行为构成的. c++中,每个对象都是由数据与函数这两部分构成,数据就是对象的属性,函数就是对象的行为. c++中对象的类型称为类,类是一 ...
- laravel框架视图中常用的逻辑结构forlese,foreach,ifelse等
if 和else @if($name === 1) 这个数字是1 @else 这个数字非1 @endif switch @switch($name) @case(1) 变量name == 1 @bre ...
- SQL——INSERT INTO(增)
一.INSERT INTO语句的基本用法 INSERT INTO 语句用于往表中插入新记录. student表: INSERT INTO语句有2种语法格式: 1.不指定列名,直接插入记录. 语法格式如 ...
- WUSTOJ 1321: Alphabet Cookies(Java)字符统计
题目链接:1321: Alphabet Cookies Description Kitty likes cookies very much, and especially the alphabet c ...
- PB笔记之窗口之间传递多参数的方法
messageboxex("警告","确定要把删除房间["+ls_id+"]吗?",question!,yesno!)<>1 t ...