视觉SLAM面试题汇总(二)

北京某自动驾驶公司:

1. 点云的聚类;求法向量;多个点集,求点集的法向量;

2. LM算法里面lamda的作用;

3. KD-Tree

4. 描述子距离的匹配的方法?除了暴力匹配还有什么方法?(提示:点对匹配的集中方式:暴力匹配;FLANN匹配;使用词袋模型进行初步筛选的匹配;重投影的匹配)

5. ORB-SLAM中特征匹配

6. 四叉树特征点均匀化原理

7. 对于非二进制的描述子,如sift描述子,是如何计算出他们之间的距离的?

8. 哈希表

9. ORB-SLAM2的整体流程

10. 卡尔曼滤波的原理和流程

11. BA优化的过程

12. SIFT特征点和ORB特征点的有缺点以及提取过程

13. 内参的含义解释

14. 解释一下对极几何

15. LOAM系里程计

16. VINS

17. 面试注重工程能力,算法能力,对前沿不需要深入

18. 要注重CNN,最终的走向还是SLAM多传感器融合+深度学习;

19. G2O图优化中边表示什么?

20. G2O的整体搭建流程;

21. 模板类的生命和定义为什么要写在同一个文件中;

22. STL常用的函数;容器和使用容器的方法

23. 其他传感器和SLAM融合的时候,可能在哪里发生交互

24. map的底层实现,实现的时间复杂度;

25. ordermap和常规的map的区别

26. ceres等其他非线性库的使用。

27. SLAM中地图一般是指什么?有什么用?怎样生成、更新地图?

(1)地图一般指什么?

        首先来说说是地图。地图一般是指稀疏的特征点对应的世界坐标系下的三维点的集合。地图一般是指稀疏的特征点对应的世界坐标系下的三维点的集合。地图一般又可以分为局部地图和全局地图两种。

        局部地图主要记录相机当前位置附近的特征点,把远处的或者视野外的特征点丢弃。这样局部地图特征点数量就可以控制在一定范围内,这样用PnP算法对当前帧和地图进行位姿估计速度也比较快。

        全局地图则记录了从开始到当前所有的特征点,所以特征点数量是相当庞大的,不适合像局部地图那样进行位姿估计,主要是用来进行回环检测或者作为稀疏的地图进行展示。

(2)地图有什么用?

        地图在SLAM中有比较重要的作用,主要是它可以使得位姿估计更稳定。纯粹的两两帧间的位姿估计受到环境的影响比较大,比如当前视角纹理突然减少或者出现了噪声,此时帧间位姿估计就可能误差很大甚至失败,后面也没有办法继续运行。而此时如果使用了局部地图估计位姿,即使当前帧位姿估计失败,因为有地图点的存在,所以后续帧也能利用局部地图估计出正确的位姿。

(3)如何生成更新地图?

        以局部地图为例,相机拍摄的每一帧都可以为地图贡献一些信息,当前帧和局部地图点进行位姿估计后,就可以把当前帧新增的特征点对应的三维点添加到地图中,同时删除局部地图中超出视野外的较远的点。这样就对局部地图进行了更新。

28. 关键帧在SLAM中应用非常多,很多知名的开源算法都使用了关键帧。请你用自己的语言描述一下什么是关键帧?有什么用?如何选择关键帧?

        关键帧是一种非常常用的方法,可以减少待优化的帧数,并且可以代表其附近的帧。可以理解为一个学校里有100个班级,每个班的班长就是一个关键帧,他可以代表他班里的人,那么如何选取关键帧呢?

        选取的指标主要有:

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

        (2)距离最近关键帧的距离是否足够远(空间)/运动。比如相邻帧我们根据pose计算运动的相对大小,可以是位移,也可以是旋转或者两个都考虑,运动足够大(超过一定阈值)就新建一个关键帧,这种方法比第一种好。但问题是如果对着同一个物体来回扫就会出现大量相似的关键帧。

        (3)跟踪质量(主要根据跟踪过程中搜索到的点数和搜索的点数比例)/共视特征点。这种方法就是记录当前视角下的特征点数,或者视角,当相机离开当前场景时才会新建关键帧,避免了第2种方法的问题,缺点是比较复杂。

或者回答如下:

        打个比方,关键帧相当于SLAM的骨架,实在局部一系列普通帧中选出一帧作为局部帧的代表,记录局部信息。举例来说,摄像头放在原处不动,普通帧还是要记录的,但关键帧因为总看到原场景,所以不会增加。

        三角化需要一定程度的共视区域,所以普通帧每2帧之间会存在大量的信息冗余,如果所有帧全部参与计算,不仅浪费了算力,对内存也是极大的考验,这一点在前端VO递归处理方式中表现不明显,但在后端优化里是一个大问题,所以关键帧主要作用是面向后端优化的算力与精度的折中。

        此外,关键帧选择时还会对图片质量、特征点质量等进行考查,一定程度上也发挥了滤波的作用,防止无用的或错误的信息进入优化过程而破坏定位建图的准确性。选择关键帧主要从关键帧自身和关键帧与其他关键帧的关系2方面来考虑。

                一方面,关键帧自身质量要好,例如不能是非常模糊的图像、特征点数量要充足、特征点分布要尽量均匀等等;

                另一方面,关键帧与其他关键帧之间的关系,需要和局部地图中的其他关键帧有少量的共视关系,但大部分特征点是新特征点,以达到既存在约束,又尽量少的信息冗余的效果,例如局部地图点投影到此帧的点数低于一个阈值或前一个关键帧的特征点在此帧里已经有90%的观测不到等等。

        在关键帧的应用上,我认为orb-slam做的非常好,尤其是在回环检测中使用了以关键帧为代表的帧“簇”的概念,回环筛选中有一步将关键帧前后10帧为一组,计算组内总分,以最高分的组的0.75为阈值,滤除一些组,再在剩下的组内各自找最高分的一帧作为备选帧,这个方法非常好地诠释了“关键帧代表局部”这个理念。

代码

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

        从算法角度来说,通常会采用图像金字塔方式,按照从粗到细的方式迭代计算位姿,首先对待匹配的两幅图做分层抽样,先对层数高的、图像尺寸小的层进行匹配,将匹配的结果作为初始值,继续匹配图像尺寸大的层。

        另外,在粗配准时,通过将图像中的高频信息滤掉,可以降低因为相机大的移动造成的锯齿效应的影响,并且可以增大算法的在相机移动距离较大时算法的收敛性。

上一篇:stm32f103位带操作公式


下一篇:V-SLAM中特征点法,光流法和直接法的区别和理解