视觉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为阈值,滤除一些组,再在剩下的组内各自找最高分的一帧作为备选帧,这个方法非常好地诠释了“关键帧代表局部”这个理念。

代码

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

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

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

30. 特征提取与匹配——SURF,SIFT,ORB,FAST,Harris角点

30.1 匹配方法

        OpenCV提供了两种Matching方式:

Brute-force matcher (cv::BFMatcher)    //暴力方法找到点集1中每个descriptor在点集2中距离最近的descriptor;找寻到的距离最小就认为匹配
                                        //浮点描述子-欧氏距离;二进制描述符-汉明距离。
                                     //详细描述:在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点

Flann-based matcher (cv::FlannBasedMatcher)    //快速最近邻搜索算法寻找(用快速的第三方库近似最近邻搜索算法)
//是一个对大数据集和高维特征进行最近邻搜索的算法的集合,在面对大数据集时它的效果要好于BFMatcher。
//使用FLANN匹配需要传入两个字典参数:一个参数是IndexParams,
    对于SIFT和SURF,可以传入参数index_params=dict(algorithm=FLANN_INDEX_KDTREE, trees=5)。
    对于ORB,可以传入参数index_params=dict(algorithm=FLANN_INDEX_LSH, table_number=6, key_size=12, multi_probe_level=1)。
    第二个参数是SearchParams,可以传入参数search_params=dict(checks=100),它来指定递归遍历的次数,值越高结果越准确,但是消耗的时间也越多。

        前端需要考虑的问题:匹配策略(两两帧匹配、多帧联合匹配、当前帧与局部特征地图匹配)、缺少深度信息的特征点如何处理(2D-2D/2D-3D/3D-2D/3D-3D混合使用)、如何加速特征匹配(FLANN等)、如何让特征分布均匀、如何剔除误匹配、考虑RGBD像机的噪声特性(依据噪声进行加权)、关键帧的选择等等(lz后面会详细介绍前端的各种细节)。
        FLANN (Fast Approximate Nearest Neighbor Search Library), 快速最近邻逼近搜索函数库。即实现快速高效匹配。
 

总结:点对匹配的几种方法:暴力匹配;FLANN匹配;使用词袋模型进行初步筛选的匹配;重投影的匹配。

30.2 SIFT特征点和ORB特征点的优缺点以及提取过程

31. 描述特征点法和直接法的优缺点

特征点法

优点:

(1)精确,直接法属于强假设

(2)运动过大时,只要匹配点在像素内,则不太会引起误匹配,鲁棒性好

缺点:

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

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

(3)只能构建稀疏地图

直接法

优点:

(1)省去计算特征点、描述子时间

(2)可以用在特征缺失的场合(比如白墙)

(3)可以构建半稠密乃至稠密地图

缺点:

(1)易受光照和模糊影响

(2)运动必须微小,要求相机运动较慢或采样频率较高(可以用图像金字塔改善)

(3)非凸性;单个像素没有区分度

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

(1) 误差函数不同。特征点法是重投影误差,直接法是光度误差

(2) 雅克比矩阵不同

33. 光流和直接法有何不同:

光流仅估计了像素间的平移,但

(1)没有用相机结构

(2)没有考虑相机的旋转和图像缩放

(3)边界点追踪效果差

34. 特征匹配(稀疏)和稠密匹配区别

特征匹配:

        (1)速度快,效率高,可以到亚像素级别,精度高

        (2)匹配元素为物体的几何特征,对照明变化不敏感

稠密匹配

        (1)速度慢,效率低

        (2)对无纹理区域匹配效果不理想,对光强条件敏感

35. EKF和BA的区别:

        (1) EKF假设了马尔科夫性,认为k时刻的状态只与k-1时刻有关。非线性优化使用所有的历史数据,做全体的SLAM

        (2) EKF做了线性化处理,在工作点处用一阶泰勒展开式近似整个函数,但在工作点较远处不一定成立。非线性优化每迭代一次,状态估计发生改变,我们会重新对新的估计点做 泰勒展开

可以把EKF看做只有一次迭代的BA

36. 单目,双目,深度相机对比

        单目:成本低,搭建简单,单目相机有尺度不确定性,需要专门初始化

        双目:不需要专门初始化,能够计算深度,基线距离越大,测量距离越远,可以用于室内和室外,标定较为复杂,视差计算比较消耗资源

        深度:测量范围窄,噪声大,易受日光干扰,无法测量透射材料,主要用于室内

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

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

        canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅值和方向,对梯度幅值进行非极大值抑制,采用双阈值检测和连接边缘。

        sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强,计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。

        laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。

38. 一阶梯度下降,G-N和L-M三种方法的关系

        (H+λI)△x=b

        当λ= 0时,L-M等于G-N;

        当λ= ∞时,L-M等于一阶梯度下降

        L-M的好处就在于:如果下降的太快,使用较小的λ,如果下降的太慢,使用较大的λ

39. 为什么SLAM中常用L-M优化?

        G-N中的H矩阵可能为奇异矩阵或者病态矩阵,导致算法不收敛。而且当步长较大时,也无法保证收敛性,所以采用L-M求解增量方程,但是它的收敛速度可能较慢。

        ①是半正定的,可能出现奇异矩阵(奇异矩阵是线性代数的概念,就是该矩阵的秩不是满秩,奇异矩阵是行列式值为零的矩阵。)或者病态(病态矩阵是对于线性方程Ax=b,对于系数阵A和右边的b发生微小的扰动,就会是解x发生较大的变化,也就是说这样的方程的解是非稳定的)的情况;

        ②Δx太大的时候也会导致这种二阶泰勒展开的近似不够准确。
 

40. 介绍RANSAC算法

        RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。

优缺点:

        RANSAC算法的优点是能鲁棒的估计模型参数。例如,他能从包含大量局外点的数据集中估计出高精度的参数。缺点是它计算参数的迭代次数没有上限,如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到的可信的模型,概率与迭代次数成正比。另一个缺点是它要求设置跟问题相关的阈值,RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

41. 如何对匹配好的点做进一步的处理,更好保证匹配效果

(1)确定匹配最大距离,汉明距离小于最小距离的两倍

(2)使用KNN-matching算法,令K=2。则每个match得到两个最接近的descriptor,然后计算最接近距离和次接近距离之间的比值,当比值大于既定值时,才作为最终match。

(3)RANSAC(使用RANSAC找到最佳单应性矩阵。由于这个函数使用的特征点同时包含正确和错误匹配点,因此计算的单应性矩阵依赖于二次投影的准确性)

42. 单目相机,F和H矩阵有何不同,E和F矩阵有何不同,只旋转不平移能不能求F,只旋转不平移能不能求H

E=t^R

 H=R-t*nT/d

在相机只有旋转而没有平移的情况,此时t为0,E也将为0,导致无法求解R,这时可以使用单应矩阵H求旋转,但仅有旋转,无法三角化求深度。

43. 描述BA

        BA的本质是一个优化模型,其目的是最小化重投影/光度误差,用于优化相机位姿和世界点。局部BA用于优化局部的相机位姿,提高跟踪的精确度;全局BA用于全局过程中的相机位姿,使相机经过长时间、长距离的移动之后,相机位姿还比较准确。BA是一个图优化模型,一般选择LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性进行计算;可以直接计算,也可以使用g2o或者Ceres等优化库进行计算。

        Bundle Adjustment : 从视觉重建中提炼出最优的3D模型和相机参数(内参和外参),好似每一个特征点都会反射几束光线,当把相机位姿和特征点位置做出最优的调整后,这些光线都收束到相机相机光心。也就是根据相机的投影模型构造构造代价函数,利用非线性优化(比如高斯牛顿或列文伯格马夸而尔特)来求最优解,利用雅克比矩阵的稀疏性解增量方程,得到相机位姿和特征点3D位置的最优解。

        BA可以分为基于滤波器的BA和基于迭代的BA。

43.1 BA优化的过程

        在视觉slam和BA中,BA是常见的参数优化方法。全名是Bundle Adjustment,中文翻译有捆集调整、光束法平差等。

        BA的主要思想是最小化重投影误差或者光度误差,以其作为目标函数来优化位姿、地图点、相机参数(比如第10章中的焦距f/畸变参数k1/k2)等。

        以最小化重投影误差为例:

(1)求最小化重投影误差 

        根据相机成像模型和相机畸变与校正,我们可以知道将一个地图点投影到像素平面流程如下:

  1. 首先,世界坐标系下有一个固定的点,世界坐标是Pw;
  2. 获得点P的相机坐标系坐标,可以利用相机外参R与t得到Pc = RPw + t;
  3. 在上一步中获得Pc依然是三维的(Xc, Yc, Zc),将其投影到归一化平面Z=1上,得到归一化相机坐标:Pc = [X/Z,Y/Z,1]^T;
  4. 此处加入畸变因素,畸变公式如下(其中,x=X/Z,y=Y/Z):

  5. 最后一步,利用内参K,将归一化相机坐标转换为像素坐标:Puv = KP_distorted。

上述过程就是状态估计之非线性最小二乘中提到的观测方程。之前我们抽象地将其记作z=h(x,y)。

(2)确认BA的目标函数(需要考虑是否有核函数,误差函数≠目标函数) 

        在BA中,待优化的变量有相机的位姿x,即外参R,t,它对应的李代数为ξ;地图点y的三维坐标系p。而观测数据是像素坐标。所以每次观测方程的误差是:

我们将不同时刻对不同地图点的观测都考虑进来,比如z_ij为在位姿ξi 处观察地图点Pj产生的数据,那么整体的目标函数为:

BA的任务就是求解最小二乘问题。 

        补充BA中的核函数:在上面的分析中,我们使用误差的二范数平方和作为目标函数,这种做法会使得如果出现误匹配之类的情况,错误边对整体优化的影响会很大,因为错误边的二范数平方增长太快了。

        此时我们可以使用一些核函数来代替二范数平方的操作,使得错误的增长不是那么快,同时可以保证自己的光滑性质。我们也叫鲁棒核函数。

        一种常见的核函数是Huber核:

还有一些其他的核函数,比如Cauchy核、Tukey核等,在g2o和ceres等优化库中都有提供。

(3)BA的求解:确认优化变量,确认优化方法 

         求解第一步就是确认非线性优化问题的优化变量,随后才是确认要使用的非线性优化方法。

        在使用GN、LM等优化方法前,我们首先将所有待优化的变量组织成一个向量x,这个向量便是目标函数的自变量:

        我们每次迭代时都需要寻找一个△x,它是自变量的迭代增量。利用高斯牛顿的原理,我们以自变量添加一个增量时,目标函数变为:

其中F_ij表示j地图点投影到i时刻相机像素平面投影残差,对i时刻相机姿态的偏导数;

而Eij表示j地图点投影到i时刻相机像素平面上的投影残差对j地图点的三维世界坐标的偏导数。

        我们将相机位姿变量放在一起:

将地图点三维坐标变量放在一起:

然后使用大矩阵表示矩阵简化上面公式:

此处我们将原本由很多小型二次项之和的形式变成了一个更整体的样子。此处EF是整体目标函数对整体变量的导数,他们是比较大的偏导数矩阵,其中有很多项是0。 

(4)使用高斯牛顿GN进行求解 

        上面已经将投影误差进行了泰勒一阶展开,此时不论是使用高斯牛顿还是LM方法对其进行优化,都需要求解一个方程:

        如果使用GN法,则H取;如果使用LM法,则H取。不管哪种方法,其中J都是:

如果是高斯牛顿,则H矩阵为:

其实无论是GN还是LM法,我们都需要求上述的H矩阵。不过这个矩阵的维度非常大,直接计算很耗时。 

(5)H矩阵的稀疏性与边缘化(Schur消元) 

         H矩阵的稀疏性是由该问题的图优化模型的固有属性决定的。

        如下一个图模型,由两个相机位姿节点与六个地图坐标节点组成,总共有八条边。

对于上述图模型,我们构建目标函数,并求解其JH矩阵,会得到如下形式的结果:

        对于一条边(一个误差项),只对其关联的节点的偏导数不为0。图中H矩阵的行列维度都是节点的个数,前两行(与前两列)是相机姿态节点的关联关系,后六行(与后六列)是地图点坐标节点的关联关系。图中J矩阵的行数是图中边的个数×残差维度列数是图中节点的个数×待优化变量维度,每一行是对每一个误差项(边)求的偏导数向量,每一列可以理解为对应的节点都关联到了哪条边上。

        上图中的H矩阵除了对角线上的元素外与图的邻接矩阵具有完全一致的结构。由上,我们可以讲H矩阵划分成如下四个部分组成。

         注意,这个矩阵的独特性质是,左上角的矩阵B与右下角的矩阵C是两个对角矩阵,E矩阵如何由图的性质决定。这种稀疏性是由这种图模型的连接属性决定的,这种图模型有一个特点,那就是每个相机位姿节点只与地图点节点关联,与其他相机节点不关联(因为没考虑运动方程)这使得B是对角矩阵,而地图点节点只与相机节点关联,与其他地图点不关联,这使得C是对角矩阵。

         这样,对应的增量方程也就变为:

        我们可以利用H的稀疏性来加速求解这个方程。有很多方法,在slam中最常用的是:Schur消元,也叫作Marginalization(边缘化)。

        B的维度是相机位姿节点的个数,C的维度是地图点的个数,通常前者远远小于后者。然后对角矩阵求逆的难度远远小于普通矩阵求逆,我们可以对上述方程组进行高斯消元,消去右上角的非对角部分E

整理可得:

这样,第一行方程组就变成与无关了,此时我们将其单独拿出来,得到仅关于位姿部分的增量方程:

        这个线性方程组的维度与B矩阵一致。求解这个方程的计算量就会远远小于求解原方程了。最后再将这个方程的解带入原方程,就可以求解出了。这就是边缘化求解的整个过程了。

        上述方程左边的系数我们记为S,它是有其物理意义的。S矩阵的非对角线上的非零矩阵块,表示了该处对应的两个相机位姿节点之间存在共同观测的地图点。如下:

上图只列出了前四个相机位姿节点的共视关系,整个方形矩阵是所有相机位姿节点的共视关系。

Schur消元的优势 

  1. 在消元过程中,由于为对角块,所以容易求解。

  2. 求解了之后,路标部分的增量方程可以通过求得。这也用到了易于求解的特性。

  3. 我们发现上面的消元过程其实不需要B矩阵是对角矩阵,即考虑运动方程也可以。

  4. 不一定非要只消元地图点,也可以反过来消元相机位姿节点,选择比较有效的做法即可。

43.2 pose graph优化的过程

        带有相机位姿和空间点的图优化称为BA(捆集调整,同时绑定相机位姿和地图点),能够有效地求解大规模的定位与建图问题。

        一方面,随着时间流逝,机器人的运功轨迹原来越长,地图规模也将不断增长

        通常在slam的后端优化中,在经过几轮的ba迭代后(几轮观测后),地图点的位置便已经近乎固定了,此时如果继续在新的相机帧进来后进行全局的ba优化,会有些浪费计算资源。

        此时,我们一般倾向于只优化相机位姿节点,即构建一个只由pose组成的图,并对其进行优化,这就叫做位姿图(pose graph)的优化,具体推导过程与ba类似,计算雅克比什么的,可以自行翻阅资料。

43.3 因子图优化

        因子图是基于概率图(主要是贝叶斯网络)的图优化。

        因子图是一种无向图,节点有两种,一种是需要优化的变量节点(比如slam中的位姿与路标),一种是不需要优化的因子节点(比如slam中的观测与输入)。因子图与普通的图优化都是最小二乘问题,并且稀疏性也类似。

        因子图比较特殊的地方在于,其可以增量式的处理后端优化。比如,在里程计的因子图优化中,当新的节点和边加入到图中时,我们只需要考虑最后一个与之相连的节点,可以近似的认为早先节点的估计值不发生变换(其实还是会有影响的,不过相比于最近的节点而言比较小),因此可以节省很多计算量,每次新加节点时,没必要对整个图进行优化

        需要注意的一点是,如果图中包含回环检测的部分,那么受影响的范围应该是当前回环上的所有节点,也就是这部分回环的轨迹都需要进行调整。

44. 描述PnP

        Perspective-n-Points, PnP(P3P)提供了一种解决方案,它是一种由3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点。目前遇到的场景主要有两个,其一是求解相机相对于某2维图像/3维物体的位姿;其二就是SLAM算法中估计相机位姿时通常需要PnP给出相机初始位姿。

        在场景1中,我们通常输入的是物体在世界坐标系下的3D点以及这些3D点在图像上投影的2D点,因此求得的是相机坐标系相对于世界坐标系(Twc)的位姿

        在场景2中,通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是当前帧相对于上一帧的位姿变换,如图所示:

        两种情况本质上是相同的,都是基于已知3D点和对应的图像2D点求解相机运动的过程。

45. 描述下GN、LM方法

        (1) GN:线搜索

        将f(x)进行一节泰勒展开,最后求解

        线性方程H△x=b;

        用JT*J近似H矩阵,省略H复杂的计算过程;

        稳定性差,可能不收敛;

(2) LM:信赖区域;

        求解线性方程(H+λI)△x=b;

        提供更稳定,更准确的增量

46. 如何处理关键帧

        关键帧选取的指标主要有:

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

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

(3)距离上一关键帧的帧数是否足够多(时间)

47. 为什么要引入李群李代数

        旋转矩阵自身是带有约束的,正交且行列式为1,他们作为优化变量时,会引入额外的约束,时优化变的困难,通过李群李代数的转换关系,把位姿估计变成无约束的优化问题。

48. 什么是极限约束

        所谓极线约束就是说同一个点在两幅图像上的映射,已知左图映射点p1,那么右图映射点p2一定在相对于p1的极线上,这样可以减少待匹配的点数量。(画图解释)

49. 单目视觉slam中尺寸漂移是怎么产生的

        单目相机根据一张图片无法得出一张图片中物体的实际大小,同理也就无法得出运动的尺度大小,这是产生尺度漂移的根源。而在优化过程中,单目相机使用对极几何中的三角测量原理,而三角测量中,极小的角度误差在累积之后深度不确定都会变得很大,从而无法保证尺度一致性。

50. SLAM中的绑架问题

        绑架问题就是重定位,是指机器人在缺少之前位置信息的情况下,如何去确定当前位姿。例如当机器人被安置在一个已经构建好地图的环境中,但是并不知道它在地图中的相对位置,或者在移动过程中,由于传感器的暂时性功能故障或相机的快速移动,都导致机器人先前的位置信息的丢失,在这种情况下如何重新确定自己的位置。

51. 如何优化重投影误差?采用什么方法求解?如果误匹配的点重投影之后误差很大,如何解决它对整个优化问题的影响?

        图优化模型,将路标点和相机位姿作为两个节点,观测模型作为边,同时优化两个变量

SLAM中常用L-M求解,如果误匹配误差很大可以考虑用核函数(Huber)

52. 重投影误差的表达式,误差关于位姿的偏导数怎么算?误差关于空间点的偏导数怎么计算?

53. g2o工程化的注意事项

图优化流程:

        ①选择节点和边,确定参数化形式 

        ②加入节点和边

        ③选择初值,开始迭代

        ④计算J和H

        ⑤解H△x = -b

        ⑥GN/LM

        g2o需要实现其中的③-⑥

g2o

        ①选择线性方程求解器(PCG/Cspare/Choldmod)

        ②选择一个blockslover

        ③选择迭代方式(GN/LM/Dogleg)

实现过程 :选择节点和边

        节点:  g2o :: VertexSE3Expmap(相机位姿)

                       g2o :: VertexSBApointXYZ(路标)

        边:g2o :: EdgeProjectXYZ2UV(重投影误差)

54. 做图优化时,对比采用四元数法和李代数法在数学直观性、计算量上的差异性

55. 优化求解过程中,g2o或者ceres的内部实现过程,有哪些加速计算的处理

56. 画后端优化因子图

57. 边缘化的过程全面分析,示意图,公式推导,优缺点,哪些矩阵块有改变

58. 10个相机同时看到100个路标点,问BA优化的雅克比矩阵多少维

        2000*360

59. 卡尔曼滤波

        预测:如何从上一时刻的状态,根据输入信息推断当前时刻的状态分布(先验)

计算协方差

        更新:计算增益Kg,然后计算后验

60. 解释相机内外参数

        相机内参包括焦距fx,fy,cx,cy,径向畸变系数k1,k2,k3,切向畸变系数p1,p2

        其中内参一般来说是不会改变,但是当使用可变焦距镜头时每次改变焦距需要重新标定内参

        当图像裁剪时内参cx,cy会发生改变,比如图像从8*8变成4*4时,cx,cy需要除以2

        一般标定工业相机时只需要得到畸变系数k1,k2即可,对于畸变系数较大的鱼眼相机需要得到k3,p1,p2

        相机外参分为旋转矩阵R和平移矩阵t,旋转矩阵和平移矩阵共同描述了如何把点从世界坐标系

转换到摄像机坐标系


61. 坐标系转换

        世界坐标系(world) 相机坐标(camera) 像素坐标(pixel)         

62. 时间戳

        工程目录下有GPS保存的坐标文件gps.txt和激光雷达保存的坐标文件laser.txt两个文件,两个文件的第一列为记录当前数据的时间戳,后两列为坐标。由于GPS每隔500时间单位保存一次数据,激光雷达每隔300时间单位保存一次数据,因此,一段时间内激光雷达保存的数据比GPS保存的数据要多。现在想取出两个文件中时间戳最接近的数据,并分别存放在gps2.txt和laser2.txt中,编写程序实现。(不知道哪位大神能讲下这道题。。。)

参考文章:

1. https://www.cnblogs.com/Jessica-jie/p/8622449.html

2. 知乎https://zhuanlan.zhihu.com/p/46696986  SLAM常见面试题(三)小马恺文

3. 

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家门Jm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值