秋招即将来临,虽然今年形势恐不大好,但有备无患吧!
主要参考:
Jichao_Peng:视觉SLAM总结——视觉SLAM面试题汇总
try_again_later:SLAM秋招知识点总结——自动驾驶算法、3D视觉岗位(附有解答)
https://blog.csdn.net/dcrmg/article/details/52561656
按照顺序阅读:
https://blog.csdn.net/cy513/article/details/4414352
https://www.cnblogs.com/jiahenhe2/p/7919356.html
https://blog.csdn.net/jwh_bupt/article/details/6567452
等距变换:相当于是平移变换(t)和旋转变换(R)的复合,等距变换前后长度,面积,线线之间的角度都不变。自由度为6(3+3)
相似变换:等距变换和均匀缩放(S)的一个复合,类似相似三角形,体积比不变。自由度为7(6+1)
仿射变换:一个平移变换(t)和一个非均匀变换(A)的复合,A是可逆矩阵,并不要求是正交矩阵,仿射变换的不变量是:平行线,平行线的长度的比例,面积的比例。自由度为12(9+3)
射影变换:当图像中的点的齐次坐标的一般非奇异线性变换,射影变换就是把理想点(平行直线在无穷远处相交)变换到图像上,射影变换的不变量是:重合关系、长度的交比。自由度为15(16-1)
参考:视图几何总结——等距变换、相似变换、仿射变换和射影变换
单应矩阵(Homography Matrix):可以将一个二维射影空间的点变换该另一个二维射影空间的点,如下图所示,在不加任何限制的情况下,仅仅考虑二维射影空间中的变换,一个单应矩阵HH可由9个参数确定,减去scale的一个自由度,自由度为8。在这里插入图片描述
基础矩阵(Fundamental Matrix):对两幅图像中任何一对对应点xx和x′x′基础矩阵FF都满足条件:xTFx′=0xTFx′=0,秩只有2,因此F的自由度为7。它自由度比本质矩阵多的原因是多了两个内参矩阵。
本质矩阵(Essential matrix):本质矩是归一化图像坐标下的基本矩阵的特殊形式,其参数由运动的位姿决定,与相机内参无关,其自由度为6,考虑scale的话自由度为5。
参考:多视图几何总结——基础矩阵、本质矩阵和单应矩阵的自由度分析
本质矩阵和基础矩阵的区别是什么?
已知空间点世界坐标系坐标和其像素投影,公式如下
目前一共有两种解法,直接线性变换方法(一对点能够构造两个线性约束,因此12个自由度一共需要6对匹配点),另外一种就是非线性优化的方法,假设空间坐标点准确,根据最小重投影误差优化相机位姿。
直接线性变化
考虑某个空间点 P ,它的齐次坐标为 P = (X, Y, Z, 1)^T 。在图像 I 中,投影到特征点 x 1 = (u 1 , v 1 , 1)^T (以归一化平面齐次坐标表示)。此时相机的位姿 R, t 是未知的。与单应矩阵的求解类似,我们定义增广矩阵 [R|t] 为一个 3 × 4 的矩阵,包含了旋转与平移信息 。我们把它的展开形式列写如下:
用最后一行把 s 消去,得到两个约束:
为了简化表示,定义 T 的行向量:
于是有:
和
请注意 t 是待求的变量,可以看到每个特征点提供了两个关于 t 的线性约束。假设一共有 N 个特征点,可以列出线性方程组:
由于 T 一共有 12 维,因此最少通过六对匹配点,即可实现矩阵 T 的线性求解,这种方法(也)称为直接线性变换(Direct Linear Transform, DLT)。当匹配点大于六对时,可以使用 SVD 等方法对超定方程求最小二乘解。
在 DLT 求解中,我们直接将 T 矩阵看成了 12 个未知数,忽略了它们之间的联系。因为旋转矩阵 R ∈ SO(3),用 DLT 求出的解不一定满足该约束,它是一个一般矩阵。平移向量比较好办,它属于向量空间。对于旋转矩阵 R,我们必须针对 DLT 估计的 T 的左边3 × 3 的矩阵块,寻找一个最好的旋转矩阵对它进行近似。这可以由 QR 分解完成,相当于把结果从矩阵空间重新投影到 SE(3) 流形上,转换成旋转和平移两部分。
需要解释的是,我们这里的 x 1 x_1 x1使用了归一化平面坐标,去掉了内参矩阵 K 的影响——这是因为内参 K 在 SLAM 中通常假设为已知。如果内参未知,那么我们也能用 PnP去估计 K, R, t 三个量。然而由于未知量的增多,效果会差一些。
非线性优化
考虑 n n n个三维空间点 P P P及其投影 p p p,我们希望计算相机的位姿 R , t R,t R,t,它的李群表示为 T T T。假设某空间点坐标为 P i = [ X i , Y i , Z i ] T P_i=[X_i,Y_i,Z_i]^T Pi=[Xi,Yi,Zi]T,其投影的像素坐标为 u i = [ u i , v i ] T u_i=[u_i,v_i]^T ui=[ui,vi]T。得像素位置与空间点位置的关系如下:
s i [ u i v i 1 ] = K T [ X i Y i Z i 1 ] s_i\begin{bmatrix}u_i\\v_i\\1\\ \end{bmatrix}=KT\begin{bmatrix}X_i\\Y_i\\Z_i\\1\\ \end{bmatrix} si⎣⎡uivi1⎦⎤=KT⎣⎢⎢⎡XiYiZi1⎦⎥⎥⎤
写成矩阵形式就是:
s i u i = K T P i s_iu_i=KTP_i siui=KTPi
由于相机位姿未知及观测点的噪声,该等式存在一个误差。因此,我们把误差求和,构建最小二乘问题,然后寻找最好的相机位姿,使它最小化:
T ∗ = a r g min T 1 2 ∑ i = 1 n ∣ ∣ u i − 1 s i K T P i ∣ ∣ 2 2 T^\ast=arg\min_T{ {1\over2} \sum_{i=1}^{n}{ ||u_i-{1\over s_i}KTP_i||_2^2}} T∗=argTmin21i=1∑n∣∣ui−si1KTPi∣∣22
该误差项,是将3D点的投影位置与观测位置作差,所以称为重投影误差。使用齐次坐标时,这个误差有3维。不过,由于 u u u最后一维为1,该维度的误差一直为零,因而我们更多时候使用非齐次坐标,于是误差就只有2维了。我们通过特征匹配知道了 p 1 p_1 p1和 p 2 p_2 p2是同一个空间点 P P P的投影,但是不知道相机的位姿。在初始值中, P P P的投影 p ^ 2 \hat p_2 p^2与实际的 p 2 p_2 p2之间有一定的距离。于是我们调整相机的位姿,使得这个距离变小。不过,由于这个调整需要考虑很多个点,所以最后的效果是整体误差的缩小,而每个点的误差通常都不会精确为零。
目前有两个主要场景场景,其一是求解相机相对于某2维图像/3维物体的位姿;其二就是SLAM算法中估计相机位姿时通常需要PnP给出相机初始位姿。
在场景1中,我们通常输入的是物体在世界坐标系下的3D点以及这些3D点在图像上投影的2D点,因此求得的是相机坐标系相对于世界坐标系(Twc)的位姿
在场景2中,通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是当前帧相对于上一帧的位姿变换
ORB SLAM中采用的是词袋模型进行闭环检测筛选出候选帧,再通过求解Sim3判断最合适的关键帧
LSD SLAM中的闭环检测主要是根据视差、关键帧连接关系,找出候选帧,然后对每个候选帧和测试的关键帧之间进行双向Sim3跟踪,如果求解出的两个李代数满足马氏距离在一定范围内,则认为是闭环成功
在BA优化、PnP、直接法里面都有接触到非线性优化问题,上面几种方法都是针对对非线性优化问题提出的方法,将非线性最优化问题作如下展开,就可以获得梯度下降法和牛顿法
梯度下降法是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。因此指保留一阶梯度信息。缺点是过于贪心,容易走出锯齿路线。
牛顿法是一个二阶最优化算法,基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似。因此保留二阶梯度信息。缺点是需要计算H
H矩阵,计算量太大。
H Δ x ∗ = − J T ( x ) HΔx^∗=−J^T(x) HΔx∗=−JT(x)
而把非线性问题,先进行一阶展开,然后再作平方处理就可以得到高斯-牛顿法和列文博格方法
高斯-牛顿法对上式展开并对ΔxΔx进行求导即可得高斯牛顿方程,其实其就是使用JJTJJT对牛顿法的HH矩阵进行替换,但是JJTJJT有可能为奇异矩阵或变态,ΔxΔx也会造成结果不稳定,因此稳定性差
列文博格法就是在高斯-牛顿法的基础上对ΔxΔx添加一个信赖区域,保证其只在展开点附近有效,即其优化问题变为带有不等式约束的优化问题,利用Lagrange乘子求解
卡尔曼滤波:
卡尔曼滤波 – 从推导到应用(一)
卡尔曼滤波 – 从推导到应用(二)
概率机器人总结——(扩展)卡尔曼滤波先实践再推导
粒子滤波:
Particle Filter Tutorial 粒子滤波:从推导到应用(一)
Particle Filter Tutorial 粒子滤波:从推导到应用(二)
Particle Filter Tutorial 粒子滤波:从推导到应用(三)
Particle Filter Tutorial 粒子滤波:从推导到应用(四)
概率机器人总结——粒子滤波先实践再推导
扩展卡尔曼滤波EKF与多传感器融合
无损卡尔曼滤波UKF与多传感器融合
所谓极线约束就是说同一个点在两幅图像上的映射,已知左图映射点p1,那么右图映射点p2一定在相对于p1的极线上,这样可以减少待匹配的点数量。如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200524204802774.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05pZ2h0X19fUmFpZA==,size_16,color_FFFFFF,t_70
用单目估计出来的位移,与真实世界相差一个比例,叫做尺度。这个比例在单目初始化时通过三角化确定,但单纯靠视觉无法确定这个比例到底有多大。由于SLAM过程中噪声的影响,这个比例还不是固定不变的。修正方式是通过回环检测计算Sim3进行修正。
绑架问题就是重定位,是指机器人在缺少之前位置信息的情况下,如何去确定当前位姿。例如当机器人被安置在一个已经构建好地图的环境中,但是并不知道它在地图中的相对位置,或者在移动过程中,由于传感器的暂时性功能故障或相机的快速移动,都导致机器人先前的位置信息的丢失,在这种情况下如何重新确定自己的位置。
初始化绑架可以阐述为一种通常状况初始化问题,可使用蒙特卡洛估计器,即粒子滤波方法,重新分散粒子到三维位形空间里面,被里程信息和随机扰动不断更新,初始化粒子聚集到/收敛到可解释观察结果的区域。追踪丢失状态绑架,即在绑架发生之前,系统已经保存当前状态,则可以使用除视觉传感器之外的其他的传感器作为候补测量设备。
特征点法:
优点:1. 没有直接法的强假设,更加精确;2. 相较与直接法,可以在更快的运动下工作,鲁棒性好
缺点:1. 特征提取和特征匹配过程耗时长;2. 特征点少的场景中无法使用;3.只能构建稀疏地图
直接法:
优点:1.省去了特征提取和特征匹配的时间,速度较快;2. 可以用在特征缺失的场合;3. 可以构建半稠密/稠密地图
缺点:1. 易受光照和模糊影响;2.运动必须慢;3.非凸性,易陷入局部极小解
(1) EKF假设了马尔科夫性,认为k时刻的状态只与k-1时刻有关。BA使用所有的历史数据,做全体的SLAM
(2) EKF做了线性化处理,在工作点处用一阶泰勒展开式近似整个函数,但在工作点较远处不一定成立,这就是EKF的非线性误差。BA每迭代一次,状态估计发生改变,我们会重新对新的估计点做泰勒展开,可以把EKF看做只有一次迭代的BA
因为误差对相机姿态的偏导数的维度是2×6,对路标点的偏导数是2×3,又10个相机可以同时看到100个路标点,所以一共有10×100×2行,100×3+10×6列。
视觉SLAM总结——ORB SLAM2中关键知识点总结
视觉SLAM总结——一文详解单目VINS论文与代码解读目录
视觉SLAM总结——SVO中关键知识点总结
视觉SLAM总结——LSD SLAM中关键知识点总结
非线性优化库一般有ceres和g2o两种
这里默认指的是VIO中的松紧耦合,这里参考深蓝学院的公开课里面介绍:
紧耦合是把图像的特征加到特征向量中去,这样做优点是可以免去中间状态的累计误差,提高精度,缺点是系统状态向量的维数会非常高,需要很高的计算量;
松耦合是把VO处理后获得的变换矩阵和IMU进行融合,这样做优点是计算量小但是会带来累计误差。
下面是对经典的VIO框架进行一个分类
(1)在ORB SLAM2中是根据三角化的方法确定地图点的,利用匹配好的两个点构建AX=b
AX=b的方程,然后利用SVD分解取最小奇异值对应的特征向量作为地图点坐标,参考多视图几何总结——三角形法
毋庸置疑首先想到的是用RANSAC方法进行连续帧之间的位姿估计,然后用内点三角化恢复地图点,具体一点说使用RANSAC估计基础矩阵的算法步骤如下:
(1)从匹配的点对中选择8个点,使用8点法估算出基础矩阵 F F F
(2)计算其余的点对到其对应对极线的距离 d n d_n dn,如果 d n < d d_n
(4)迭代 k k k次,或者某次得到内点的数目 m i m_i mi占有的比例大于等于95%,则停止。选择 m i m_i mi最大的基础矩阵作为最终的结果。
如果是利用非线性优化的方法获得位姿的话,可以在非线性优化代价函数中加入鲁棒核函数来减少无匹配所带来的误差,例如《视觉SLAM十四讲》里面提到的Huber核:
H ( e ) = { 1 2 e 2 if ∣ e ∣ ≤ δ δ ( ∣ e ∣ − 1 2 δ ) otherwise H(e)=\left\{\begin{array}{ll}\frac{1}{2}e^2&\text{if}|e|\leq\delta\\\delta\left(|e|-\frac{1}{2}\delta\right)&\text{otherwise}\end{array}\right. H(e)={21e2δ(∣e∣−21δ)if∣e∣≤δotherwise
在《机器人的状态估计》一书总将这种方法称为M估计,核函数还包裹Cauchy核
ρ ( u ) = 1 2 ln ( 1 + u 2 ) \rho(u)={1\over2}\ln(1+u^2) ρ(u)=21ln(1+u2)
Geman-MeClure核
ρ ( u ) = 1 2 u 2 1 + u 2 ρ(u)=\frac{1}{2}\frac{u^2}{1+u^2} ρ(u)=211+u2u2
可参考:RANSAC算法理解
简单地说一般是选用具有最小残差和的模型作为最佳模型。
在《机器人的状态估计》一书中还介绍了M估计(广义的最大似然估计)和协方差估计:
所谓M估计指的是加入鲁棒代价函数最大似然估计,而协方差估计指的是同时估计状态和协方差的方法,也称自适应估计。
以ORB SLAM2为例,3D地图点是以类的形式存储的,在类里面除了存储3D地图点的空间点,同时还存储了3D点的描述子(其实就是BRIFE描述子),用来快速进行与特征点的匹配,同时还用一个map存储了与其有观测关系的关键帧以及其在关键帧中的Index等等。
https://www.cnblogs.com/Jessica-jie/p/7739775.html
约束相机位姿的方程远多于约束地图点的方程
高斯牛顿法的缺点是:
LM是信赖区域优化法的代表,而加上步长的高斯牛顿法是线搜索方法的代表。