SLAM理论部分
1、什么是闭环检测,常用方法有哪些
随着相机的运动,我们计算的相机位姿,三角化得到的点云位置,都是有误差的,即使我们使用局部的或全局的BA去优化,仍然会存在累积误差。而消除误差最有效的办法是发现闭环,并根据闭环对所有结果进行优化。闭环是一个比BA更加强烈、更加准确的约束。
目前SLAM中用的比较多的方法是词袋模型,词袋模型中涉及到字典的生成和使用的问题,这一部分和机器学习的只是挂钩比较深。
字典的生成问题就是非监督聚类问题,可以采用K-means对特征点进行聚类,然后通过K叉树进行表达,相似度判断采用是TD-IDF的方法。
2、解释一下梯度下降,牛顿法 ,高斯牛顿和LM算法
设有可导函数 f ( x ) f(x) f(x),目标函数是 1 2 m i n f ( x ) 2 \frac{1}{2}minf(x)^2 21minf(x)2,给定初始值是 x 0 x_0 x0
-
梯度法
在初始值 x 0 x_0 x0附近进行一阶泰勒展开后求解目标函数。
目标函数变为 f 2 ( x 0 ) + 2 f ′ ( x 0 ) Δ x 2 + f ′ 2 ( x 0 ) Δ x 2 f^2(x_0)+2f^{'}(x_0)\Delta x^2+f^{'2}(x_0)\Delta x^2 f2(x0)+2f′(x0)Δx2+f′2(x0)Δx2
对目标函数 Δ x \Delta x Δx求导,令目标函数为0. f 2 ( x 0 ) + 2 f ′ ( x 0 ) Δ x 2 + f ′ 2 ( x 0 ) Δ x 2 = 0 f^2(x_0)+2f^{'}(x_0)\Delta x^2+f^{'2}(x_0)\Delta x^2 = 0 f2(x0)+2f′(x0)Δx2+f′2(x0)Δx2=0
从而有 f ( x 0 ) f ′ ( x 0 ) + f ′ 2 ( x 0 ) Δ x = 0 f(x_0)f^{'}(x_0)+ f^{'2}(x_0)\Delta x = 0 f(x0)f′(x0)+f′2(x0)Δx=0
解得:
Δ x = − f ( x 0 ) f ′ ( x 0 ) ) \Delta x = \frac{- f(x_0)}{f{'}(x_0))} Δx=f′(x0))−f(x0)
更新方程为:
x k + 1 = x k + Δ x x_{k+1}=x_k+ \Delta x xk+1=xk+Δx -
牛顿法 f ( x ) f(x) f(x)
求 f ( x ) f(x) f(x)的导数 f ′ ( x ) f{'}(x) f′(x),将问题化解为 f ′ ( x ) = 0 f{'}(x)=0 f′(x)=0
按照上述问题的求解可得到 x = x 0 − f ′ x 0 ) f ′ ′ ( x 0 ) x=x_0-\frac{f{'}x_0)}{f{''}(x_0)} x=x0−f′′(x0)f′x0)
当 x x x为高维时, x n + 1 = x n − ∣ H ( x n ) ∣ − 1 f ′ ( x n ) x_{n+1}=x_{n}-|H(x_n)|^{-1}f{'}(x_n) xn+1=xn−∣H(xn)∣−1f′(xn) -
高斯牛顿法
高斯牛顿法是牛顿法在求解非线性最小优化问题的一个特例。
由于求解hessian矩阵非常耗时,故使用 J T J J^TJ JTJ来代替,将 f ′ ( x ) f{'}(x) f′(x)用 J r T J_{r}^{T} JrT代替 -
LM方法
对于高斯牛顿法,如果 J T J J^TJ JTJ不可逆,加入一个正定对角阵,变为
x n + 1 = x n − ( J T J + λ I ) − 1 J r T x_{n+1}=x_{n}-(J^TJ+\lambda I)^{-1}J^T_{r} xn+1=xn−(JTJ+λI)−1JrT
当 λ \lambda λ为0时退化为高斯矩阵,当 λ \lambda λ很大时,变为梯度下降
如果下降太快就要使用较小的 λ \lambda λ
如果下降太慢就要使用较大的 λ \lambda λ
3 ceres库
求
F
(
x
)
F(x)
F(x)平方和最小
思路:
第一步:利用模板,建立CostFunctor,有4个分别是F1(x1,x2); F2(x3,x4);F3(x2,x3); F4(x1,x4)
第二步:建立problem;先使用AutoDiffCostFunction分别对F1,F2,F3,F4求导,再problem.AddResidualBlock都加入残差块
第三步:solver解算器的options,summary
4 卡尔曼滤波的3个条件
状态方程和观测方程为线性方程
观测噪声为高斯噪声
初始状态分布为高斯分布
5 紧耦合和松耦合
紧耦合系统将视觉测量残差和IMU测量残差一起加入后端优化系统中进行优化
松耦合系统是计算完视觉结果和IMU结果后再进行优化。
6 你认为室内SLAM与自动驾驶SLAM有什么区别
地图不同:自动驾驶的高精地图是经过标注后的语义地图。视觉slam的地图则主要用于导航使用。
自动驾驶的定位方案一般为:GPS+IMU+里程计,为了仿真在gps信号差的地方产生跳变,也会结合slam这种相对定位的方法。第二种方案是:GPS+多线雷达+高精度地图。第三种方案是多个双目视觉相机slam方案。
室内slam主要是以激光和视觉slam为主流。
7 地图点的构建方法有哪些
点云地图
2D栅格地图
八叉树地图
8 鲁棒核函数有哪些
核函数相当于一个加权函数,将slam中误匹配的点降低权重。
例如优化如下代价函数
a
r
g
m
i
n
Σ
∣
∣
d
i
∣
∣
2
argmin\Sigma ||d_i||^2
argminΣ∣∣di∣∣2
外点造成的误差/距离
d
i
d_i
di一般较大,导致最终求解的结果有很大误差,甚至错误,引入鲁棒核函数对误差做一步处理,人为降低
d
i
d_i
di过大的误差项。
9 介绍RANSAC等鲁棒估计的方法
点:每一个数据,SLAM里指的是匹配的点对
野值/外点:错误的点
内点:正确的点
内点集:内点的集合
外点集:外点的集合
模型:待估计的参数
s
s
s :估计模型所需要的最小点数
S
S
S :所有的点形成的点集
RANSAC的想法是从点集中随机的选择出 s s s 个点,估计出一个模型,查看剩余点是否符合这个模型。如果大部分点都符合这个模型,就相当于我们找到了一个合适的模型,自然的符合模型的点就是内点啦。由于是随机选择,一次可能难以找到正确的模型,因此需要多次才可以。一般直线方程估计中采用点到线的距离的平方,基本矩阵估计中也使用点到极线的距离的平方,单应和相机内参估计中使用点到点的距离的平方。
10 求导 ∂ R 1 R 2 ∂ R 1 \frac{\partial R_1R_2}{\partial R1} ∂R1∂R1R2
11 单目相机的内外参模型
相机内参包括焦距fx,fy,cx,cy,径向畸变系数k1,k2,k3,切向畸变系数p1,p2
其中内参一般来说是不会改变,但是当使用可变焦距镜头时每次改变焦距需要重新标定内参
当图像裁剪时内参cx,cy会发生改变,比如图像从88变成44时,cx,cy需要除以2
一般标定工业相机时只需要得到畸变系数k1,k2即可,对于畸变系数较大的鱼眼相机需要得到k3,p1,p2
相机外参分为旋转矩阵R和平移矩阵t,旋转矩阵和平移矩阵共同描述了如何把点从世界坐标系 转换到摄像机坐标系
12 VINS-Mono优缺点
13 如何标定相机和IMU的外参
采集图像标定相机内参和畸变参数 ,重投影误差在 0.1~0.2 标定结果较好,静止采集两个小时IMU数据的加速度计和陀螺噪声以及随机游走.
同时采集imu和相机数据,将相机参数配置文件,imu参数配置文件,图像与imu的bag文件,标定板参数输入到kalibr_calibrate_imu_camera中,输出camchain-imucam配置文件。
注意事项:
i,确保图像不要模糊,运动不要太快。
ii,最好要遍历imu的所有轴,即充分旋转和加速。
14 给定一张图片,已知相机和地面之间的相对关系,计算出图的俯视图
15 双线性插值
16 视觉SLAM方法一般分为特征点法和直接法。请简述一下特征点法和直接法的概念,以及对应的优缺点。
特征点法,根据提取匹配特征点来估计相机运动,优化的是重投影误差,对光照变化不敏感,是比较成熟的方案,常见的开源方案有orbslam
优点:特征点本身对光照运动旋转比较不敏感,所有比较稳定; 相机运动较快也能跟踪成功,鲁棒性好一些;方案成熟
缺点:关键点提取,描述子,匹配时间长;特征点丢失场景无法适应;只能构建稀疏地图;
直接法:根据相机的亮度信息估计相机运动,可以不需要计算关键点和描述子,优化的是光度误差,根据使用像素数量可以分为稀疏半稠密稠密三种
优点:速度快,可以省去计算特征点,描述子时间;可以用在特征缺失场合,特征法在该情况下会极速变差
因为假设了灰度不变,所以容易受光照变化影响,要求相机运动较慢或采集频率较高;单个像素或像素块区分度不强
17 用自己的语言描述一下关键帧是什么?有什么用?如何选择关键帧?
关键帧可以减少待优化的帧数,并且可以代表其附近的帧。
选取指标为:
(1)距离上一关键帧的帧数是否足够多,比如我每隔固定帧数选择一个关键帧,这样编程简单但是效果不好,比如运动很慢的时候,就会有大量相似的关键帧,运动快又会丢失很多。
(2)距离最近关键帧的距离是否足够远
(3)跟踪质量(根据跟踪过程中搜索到的点数和共视特征点的比例)一方面,关键帧自身质量要好,例如不能是非常模糊的图像、特征点数量要充足、特征点分布要尽量均匀等等;另一方面,关键帧与其他关键帧之间的关系,需要和局部地图中的其他关键帧有少量的共视关系,但大部分特征点是新特征点,以达到既存在约束,又尽量少的信息冗余的效果,例如局部地图点投影到此帧的点数低于一个阈值或前一个关键帧的特征点在此帧里已经有90%观测不到等等。
18 什么是极线约束?这个约束能带来什么好处?
能够自己画出上面图片
极线约束的好处:从上面的描述我们可以看到,我们在做特征点匹配时,左图成像点p1的待匹配点p2一定在相对于p1的极线上,那么我们在做搜索时就可以在极线附近(考虑实际可能 会有一点误差)进行搜索,相对暴力匹配极大减少待匹配的点的数量。
19 什么是边缘化? First Estimate Jacobian? 一致性? 可观性?
20 如何对匹配好的点做进一步的处理,更好保证匹配效果
(1)确定匹配最大距离,汉明距离小于最小距离的两倍
(2)使用KNN-matching算法,令K=2。则每个match得到两个最接近的descriptor,然后计算最接近距离和次接近距离之间的比值,当比值大于既定值时,才作为最终match。
(3)RANSAC(使用RANSAC找到最佳单应性矩阵。由于这个函数使用的特征点同时包含正确和错误匹配点,因此计算的单应性矩阵依赖于二次投影的准确性)
21 单目相机,F和H矩阵有何不同,E和F矩阵有何不同,只旋转不平移能不能求F,只旋转不平移能不能求H
在相机只有旋转而没有平移的情况,此时t为0,E也将为0,导致无法求解R,这时可以使用单应矩阵H求旋转,但仅有旋转,无法三角化求深度。
22 描述BA
BA的本质是一个优化模型,其目的是最小化重投影/光度误差,用于优化相机位姿和世界点。局部BA用于优化局部的相机位姿,提高跟踪的精确度;全局BA用于全局过程中的相机位姿,使相机经过长时间、长距离的移动之后,相机位姿还比较准确。BA是一个图优化模型,一般选择LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性进行计算;可以直接计算,也可以使用g2o或者Ceres等优化库进行计算。
Bundle Adjustment : 从视觉重建中提炼出最优的3D模型和相机参数(内参和外参),好似每一个特征点都会反射几束光线,当把相机位姿和特征点位置做出最优的调整后,这些光线都收束到相机相机光心。也就是根据相机的投影模型构造构造代价函数,利用非线性优化(比如高斯牛顿或列文伯格马夸而尔特)来求最优解,利用雅克比矩阵的稀疏性解增量方程,得到相机位姿和特征点3D位置的最优解。
BA可以分为基于滤波器的BA和基于迭代的BA
23 描述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点求解相机运动的过程。
24 为什么要引入李群李代数
旋转矩阵自身是带有约束的,正交且行列式为1,他们作为优化变量时,会引入额外的约束,时优化变的困难,通过李群李代数的转换关系,把位姿估计变成无约束的优化问题。
25 单目视觉slam中尺寸漂移是怎么产生的
单目相机根据一张图片无法得出一张图片中物体的实际大小,同理也就无法得出运动的尺度大小,这是产生尺度漂移的根源。而在优化过程中,单目相机使用对极几何中的三角测量原理,而三角测量中,极小的角度误差在累积之后深度不确定都会变得很大,从而无法保证尺度一致性。
26 SLAM中的绑架问题
绑架问题就是重定位,是指机器人在缺少之前位置信息的情况下,如何去确定当前位姿。例如当机器人被安置在一个已经构建好地图的环境中,但是并不知道它在地图中的相对位置,或者在移动过程中,由于传感器的暂时性功能故障或相机的快速移动,都导致机器人先前的位置信息的丢失,在这种情况下如何重新确定自己的位置。
27 KF和BA的区别
(1) EKF假设了马尔科夫性,认为k时刻的状态只与k-1时刻有关。非线性优化使用所有的历史数据,做全体的SLAM
(2) EKF做了线性化处理,在工作点处用一阶泰勒展开式近似整个函数,但在工作点较远处不一定成立。非线性优化每迭代一次,状态估计发生改变,我们会重新对新的估计点做 泰勒展开,可以把EKF看做只有一次迭代的BA
28 常用的边缘检测算子和优缺点
边缘检测一般分为三步,分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后在用卷积内核寻找像素梯度。常用有三种算法:canny算子,sobel算子,laplacian算子
canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅值和方向,对梯度幅值进行非极大值抑制,采用双阈值检测和连接边缘。
sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强,计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。
29 为什么SLAM中常用L-M?
G-N中的H矩阵可能为奇异矩阵或者病态矩阵,导致算法不收敛。而且当步长较大时,也无法保证收敛性,所以采用L-M求解增量方程,但是它的收敛速度可能较慢。
30 10个相机同时看到100个路标点,问BA优化的雅克比矩阵多少维,Heissian矩阵多少维
Jacob矩阵是 2000×360
因为误差对相机姿态的偏导数的维度是2×6,对路标点的偏导数是2×3,又10个相机可以同时看到100个路标点,所以一共有10×100×2行,100×3+10×6个块。
Hession是360×360
31 GridMap给定起点和终点,求最优路径
32
31 描述PnP算法
目前一共有两种解法,直接线性变换方法(一对点能够构造两个线性约束,因此12个自由度一共需要6对匹配点),另外一种就是非线性优化的方法,假设空间坐标点准确,根据最小重投影误差优化相机位姿。
目前有两个主要场景场景,其一是求解相机相对于某2维图像/3维物体的位姿;其二就是SLAM算法中估计相机位姿时通常需要PnP给出相机初始位姿。
在场景1中,我们通常输入的是物体在世界坐标系下的3D点以及这些3D点在图像上投影的2D点,因此求得的是相机坐标系相对于世界坐标系(Twc)的位姿
在场景2中,通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是当前帧相对于上一帧的位姿变换.