本文主要记录视觉Slam相关的面试题。
单目相机:
双目相机:
深度相机:
Time-of-Flight
)或其他深度感知技术,直接提供场景的深度信息。RGBD
相机:
RGBD
相机是一种结合RGB
图像和深度图像的传感器。提供了同时获得彩色图像和深度信息的能力。RGBD
相机相对于其他相机类型来说,价格也较高。此外,深度图像的质量可能会受到光照和纹理等因素的影响。特征点法:
优点:
缺点:
直接法:
tips: 直接法利用光度一致性约束(强假设)来进行像素匹配。光度一致性约束假设在相机运动过程中,同一物体的像素亮度保持不变。
优点:
缺点:
等距变换(Isometric Transformation
)是一种保持物体之间距离和角度不变的几何变换。在等距变换中,平移、旋转和镜像是常见的操作。等距变换可以保持物体的形状和大小不变。
相似变换(Similarity Transformation
)是一种保持物体之间距离比例和角度不变的几何变换。相似变换包括平移、旋转和缩放操作。与等距变换不同的是,相似变换可以改变物体的大小,但保持其形状和轮廓不变。
仿射变换(Affine Transformation
)是一种保持物体之间的平行性、直线性和比例性不变的几何变换。仿射变换包括平移、旋转、缩放和剪切操作。它可以对物体进行平行四边形的变形,但不能改变物体的形状和轮廓。
射影变换(Projective Transformation
),也称为透视变换,是一种保持直线的直线性不变的几何变换。射影变换包括平移、旋转、缩放、剪切和投影操作。它可以对物体进行更加复杂的形变,包括将平面上的任意四边形映射到另一个平面上。
单应矩阵(Homography Matrix
)是用于描述平面到平面投影变换的矩阵。它是一个3×3
的矩阵,表示了一个平面上的点在另一个平面上的投影位置。单应矩阵可以用于图像校正、图像拼接和虚拟现实等应用中。
本质矩阵(Essential Matrix
)是用于描述两个相机之间的几何关系的矩阵。它是一个3×3
的矩阵,可以通过相机的内参矩阵和相机位姿之间的关系来计算。本质矩阵具有两个重要的性质:它是奇异矩阵(行列式为0
),并且在尺度不确定的情况下唯一确定。
基础矩阵(Fundamental Matrix
)是描述两个摄像机之间的几何关系的矩阵。它是一个3×3
的矩阵,在计算机视觉中用于描述两个视图之间的对应关系。基础矩阵可以通过对应点的坐标来计算,它满足对应点的几何约束关系。
单应矩阵和本质矩阵:当相机之间没有旋转时,单应矩阵可以表示投影关系,本质矩阵为零矩阵;当相机之间存在旋转时,本质矩阵描述几何关系,可以通过分解得到旋转矩阵和平移向量。
基础矩阵和本质矩阵:基础矩阵可以通过本质矩阵和相机内参矩阵计算得到。
旋转矩阵自身是带有约束的,正交且行列式为1
,他们作为优化变量时,会引入额外的约束,时优化变的困难,通过李群李代数的转换关系,把位姿估计变成无约束的优化问题。
绑架问题是指当机器人在运行过程中被移动到一个完全未知的位置,而无法察觉到自身的位置变化。这种情况可能会导致Slam系统出现严重的错误,因为机器人的定位和地图都建立在错误的假设下,比如以下情况可能会发生绑架问题:
恶意干扰:有人故意将机器人移动到一个新位置,以破坏Slam系统的性能或误导机器人的行为。
意外移动:机器人可能在运行过程中由于外部干扰、碰撞或其他原因被意外移动到一个新位置。
传感器故障:传感器故障可能导致机器人无法正确感知自身的位置变化,例如定位或视觉传感器的错误测量。
算法 | SIFT |
SURF |
ORB |
---|---|---|---|
原理 | SIFT 算法通过在不同尺度空间和旋转角度上检测图像中的关键点,并计算每个关键点的局部特征描述子 |
SURF 算法也是基于尺度空间的特征提取方法,使用了积分图像的数据结构来加速计算,并检测图像中的兴趣点,并计算每个兴趣点的局部特征描述子 |
ORB 算法结合了FAST 关键点检测器和BRIEF 描述子。FAST 用于检测关键点,BRIEF 用于计算关键点的二进制描述子 |
特征描述子 | SIFT 算法生成128 维的局部特征描述子 |
SURF 算法生成64 维的局部特征描述子 |
ORB 算法生成二进制 的局部特征描述子 |
计算效率 | SIFT 算法计算效率较低,尤其在计算特征描述子时需要进行大量的高斯模糊和梯度计算操作 |
SURF 算法相对于SIFT 算法来说计算效率较高,主要得益于使用积分图像结构来加速计算 |
ORB 算法具有较高的计算效率,主要因为FAST 关键点检测器和BRIEF 描述子都是基于快速计算的算法 |
尺度不变性 | SIFT 算法对于尺度变化具有较好的不变性 |
SURF 算法也具有一定的尺度不变性 |
ORB 算法在尺度变化较大的情况下可能不太稳定 |
旋转不变性 | SIFT 算法具有很好的旋转不变性 |
SURF 算法也具有一定的旋转不变性 |
ORB 算法在旋转角度较大的情况下可能不太稳定 |
鲁棒性 | SIFT 算法在处理光照变化、噪声等情况下具有较好的鲁棒性 |
SURF 算法对于光照变化和噪声有一定的鲁棒性 |
ORB 算法在光照变化和噪声较小的情况下表现较好 |
详细参考:详解SIFT、SURF和ORB特征点检测和描述算法
对极几何是研究两个摄像机之间的关系的几何学理论。它描述了两个视图之间的对应关系,以及在一幅图像中观察到的特征点与另一幅图像中可能的对应点之间的关系。对极几何的关键概念是极线和极点。极线是通过一个摄像机中的点与另一个摄像机的光心之间的直线,而极点是表示极线在另一个视图上的交点。对极几何提供了一种几何约束,用于估计相机之间的相对位置和姿态。
详细参考:2D-2D对极几何中的基本矩阵、本质矩阵和单应矩阵
边缘检测一般分为三步,分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后在用卷积内核寻找像素梯度。常用有三种算法:canny
算子,sobel
算子,laplacian
算子
canny
算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅值和方向,对梯度幅值进行非极大值抑制,采用双阈值检测和连接边缘。
sobel
算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强,计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
laplacian
算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。
RANSAC
(Random Sample Consensus
)算法是一种用于估计模型参数的鲁棒性算法。主要目标是从包含噪声和误匹配数据的数据集中,识别出符合模型假设的内点,并通过这些内点来估计模型的参数。RANSAC
算法的基本步骤如下:
随机采样:从数据集中随机选择一小部分数据点作为样本,这些数据点被称为随机样本或内点集。
模型拟合:使用随机样本来拟合一个模型,该模型可以是任何适用于问题的模型,例如直线、平面、圆等。根据选定的模型,估计模型的参数。
内点选择:对于剩余的数据点,计算它们与估计模型的拟合误差,并根据设定的阈值,将其分为内点(符合模型假设)和外点(不符合模型假设)。内点的选择通常是使用距离度量(如点到模型的距离)进行判断。
判断条件:计算内点的数量,如果内点数量超过预设的阈值或达到指定的迭代次数,则认为当前模型足够好,并进入下一步。否则,返回步骤1
,重新随机选择样本。
参数估计:使用所有内点重新估计模型的参数,可以使用最小二乘法或其他适当的方法。
模型验证:对估计的模型进行验证,通常是通过计算所有数据点与模型之间的拟合误差来评估模型的质量。如果模型满足预定义的准确性标准,则算法终止;否则,返回步骤1
,重新进行采样和拟合。
PnP
算法(Perspective-n-Point
)是一种用于求解相机位姿的计算机视觉算法。通过已知的3D
点和对应的2D
图像点来估计相机的旋转和平移。PnP
算法的基本原理如下:
输入数据:PnP
算法的输入包括一组已知的3D
点和它们在图像中的对应2D
点。这些3D
点通常是在世界坐标系下表示的,而2D
点则是通过相机投影得到的。
假设模型:PnP
算法基于一个假设模型,即相机的内参矩阵已知。内参矩阵包括相机的焦距、主点坐标和畸变参数等信息。
求解过程:PnP
算法的目标是估计相机的旋转矩阵和平移向量,将3D
点映射到2D
图像上以与对应的2D
点匹配。具体求解过程通常分为以下几个步骤:
a. 特征匹配:根据输入的2D
点和3D
点,进行特征匹配,找到2D
点与对应3D
点的匹配关系。
b. 姿态估计:使用RANSAC
(Random Sample Consensus
)或其他方法从匹配的特征对中选择一组内点,用于估计相机的旋转矩阵和平移向量。RANSAC
算法可以排除噪声和误匹配的特征对,提高求解的准确性。
c. 优化:在姿态估计的基础上,可以使用迭代最小化重投影误差的方法进一步优化相机的位姿。该过程通过最小化3D
点在图像平面上的投影点与对应的2D
点之间的误差来调整相机的旋转和平移。
PnP
算法最终输出相机的旋转矩阵和平移向量,表示相机在世界坐标系下的位姿。BA
算法(Bundle Adjustment
)是一种用于优化相机姿态和三维点坐标的计算机视觉算法。通过最小化重投影误差,同时优化相机位姿和场景中的三维点,以提高相机姿态和场景的准确性。BA
算法的基本原理如下:
输入数据:BA
算法的输入包括一组已知的相机位姿和对应的2D
图像点,以及与这些2D
点对应的3D
场景点。这些相机位姿和3D
点可以通过PnP
算法、三角化等方法获得。
重投影误差:BA
算法的目标是最小化重投影误差,即将优化后的相机位姿和3D
点重新投影到图像平面上,与对应的2D
点之间的误差。重投影误差是衡量相机姿态和3D
点估计准确性的指标。
优化过程:BA
算法通过迭代优化的方式,不断调整相机位姿和3D
点的估计值,以最小化重投影误差。优化过程中,通常采用非线性优化方法,例如高斯牛顿法或Levenberg-Marquardt
算法。
目标函数:BA
算法的目标函数是重投影误差的平方和,加上一些正则化项(如相机和3D
点的先验信息),用于控制优化的平滑性和稳定性。目标函数的最小化可以通过迭代优化算法来实现。
优化器选择:在实际应用中,可以使用不同的优化器来求解BA
问题。常见的选择包括使用开源库(如Ceres Solver
、g2o
等)或自行实现优化器。优化器的选择取决于问题规模、计算效率和实现难度等因素。
输出结果:BA
算法最终输出优化后的相机位姿和3D
点坐标,这些估计值可以更准确地描述相机的姿态和场景的几何结构。
EKF
假设了马尔科夫性,认为k
时刻的状态只与k-1
时刻有关。非线性优化使用所有的历史数据,做全体的Slam
;
EKF
做了线性化处理,在工作点处用一阶泰勒展开式近似整个函数,但在工作点较远处不一定成立。非线性优化每迭代一次,状态估计发生改变,会重新对新的估计点做泰勒展开。
tips: 可以把EKF
看做只有一次迭代的BA
。
ICP
算法的基本思想是通过迭代的方式,不断优化两个点云之间的刚体变换(旋转和平移),使得它们在空间中更加接近。算法的核心是最小化两个点云之间的距离度量,常用的度量方式是欧氏距离。
下面是ICP
算法的基本步骤:
Target Point Cloud
)和源点云(Source Point Cloud
)。初始时,可以使用一些启发式方法(例如最近点搜索)来初始化刚体变换的估计。Nearest Neighbor Search
)在目标点云中找到对应的最近邻点。这里可以使用**kd
树**等数据结构来加速搜索过程。Least Squares
)。步骤2-4
,直到满足停止条件(例如达到最大迭代次数或刚体变换的变化小于阈值)。Tight Coupling
):
Slam
系统是指传感器和估计器之间具有密切的依赖关系,传感器数据直接用于估计器的状态估计。Loose Coupling
):
Slam
系统是指传感器和估计器之间的依赖关系较弱,传感器数据经过预处理后,以较高级别的特征或信息形式提供给估计器。单目相机根据一张图片无法得出一张图片中物体的实际大小,同理也就无法得出运动的尺度大小,这是产生尺度漂移的根源。而在优化过程中,单目相机使用对极几何中的三角测量原理,而三角测量中,极小的角度误差在累积之后深度不确定都会变得很大,从而无法保证尺度一致性。
假设有一个线性动态系统的状态方程如下:
x k = A ∗ x k − 1 + B ∗ u k − 1 + w k − 1 x_k = A * x_{k-1} + B * u_{k-1} + w_{k-1} xk=A∗xk−1+B∗uk−1+wk−1
其中, x k x_k xk表示系统在时刻 k k k的状态, A A A是状态转移矩阵, x k − 1 x_{k-1} xk−1是系统在时刻 k − 1 k-1 k−1的状态, B B B是输入控制矩阵, u k − 1 u_{k-1} uk−1是输入控制向量, w k − 1 w_{k-1} wk−1是过程噪声,表示系统模型中的不确定性。
另外,还有一个观测方程如下:
z k = H ∗ x k + v k z_k= H * x_k+ v_k zk=H∗xk+vk
其中, z k z_k zk是在时刻 k k k的观测值, H H H是观测矩阵, v k v_k vk是观测噪声,表示观测过程中的不确定性。
现在的目标是通过观测值来估计系统的状态。卡尔曼滤波通过将观测值和系统模型进行融合,得到对系统状态的最优估计。
首先,定义系统状态的先验估计为 x _ h a t k − 1 x\_hat_{k-1} x_hatk−1,表示在时刻 k − 1 k-1 k−1时对系统状态的估计。还定义系统状态的协方差矩阵为 P k − 1 P_{k-1} Pk−1,表示对系统状态估计的不确定性。
卡尔曼滤波的两个基本步骤如下:
预测步骤(时间更新):
在预测步骤中,根据系统模型来预测系统在时刻 k k k的状态和状态协方差矩阵。
先验估计: x _ h a t _ m i n u s k = A ∗ x _ h a t k − 1 + B ∗ u k − 1 x\_hat\_minus_k = A * x\_hat_{k-1} + B * u_{k-1} x_hat_minusk=A∗x_hatk−1+B∗uk−1
先验协方差: P _ m i n u s k = A ∗ P k − 1 ∗ A T + Q P\_minus_k = A * P_{k-1} * A^T + Q P_minusk=A∗Pk−1∗AT+Q
其中, Q Q Q表示过程噪声的协方差矩阵。
更新步骤(测量更新):
在更新步骤中,根据观测值来修正先验估计,得到对系统状态的最优估计。
创新(观测残差): y k = z k − H ∗ x _ h a t _ m i n u s k y_k = z_k- H * x\_hat\_minus_k yk=zk−H∗x_hat_minusk
创新协方差: S k = H ∗ P _ m i n u s k ∗ H T + R S_k = H * P\_minus_k * H^T + R Sk=H∗P_minusk∗HT+R
增益矩阵: K k = P _ m i n u s k ∗ H T ∗ S k ( − 1 ) K_k = P\_minus_k * H^T * S_k^(-1) Kk=P_minusk∗HT∗Sk(−1)
后验估计: x _ h a t k = x _ h a t _ m i n u s k + K k ∗ y k x\_hat_k = x\_hat\_minus_k + K_k * y_k x_hatk=x_hat_minusk+Kk∗yk
后验协方差: P k = ( I − K k ∗ H ) ∗ P _ m i n u s k P_k = (I - K_k * H) * P\_minus_k Pk=(I−Kk∗H)∗P_minusk
其中, R R R表示观测噪声的协方差矩阵, I I I是单位矩阵。
通过不断进行预测步骤和更新步骤,可以逐步逼近系统的真实状态,并获得对系统状态的优化估计。
粒子滤波(Particle Filtering
),也称为蒙特卡洛滤波(Monte Carlo Filtering
),是一种非参数滤波方法,用于估计系统的状态,尤其在非线性和非高斯噪声条件下表现良好。
粒子滤波通过使用一组随机粒子来表示状态空间,并通过加权采样和重采样来逼近后验状态分布。其基本思想是根据系统模型和观测数据,通过粒子的重采样和更新来逐步逼近目标分布。
粒子滤波的描述如下:
1
。步骤2和步骤3
,直到达到滤波的终止条件(例如达到一定数量的时间步或满足预设的误差要求)。Ceres Solver
: Ceres Solver
是一个功能强大的开源c++
库,用于解决大规模的非线性最小二乘问题。它提供了丰富的优化算法和工具,适用于Slam
中的优化问题。Ceres Solver
支持自动求导和稀疏矩阵,可以处理大规模问题,并提供了Python
和其他语言的接口。
g2o
: g2o
是一个用于图优化的通用框架,主要用于Slam
和视觉里程计等问题。它提供了一组优化算法和数据结构,可以方便地构建和求解图优化问题。g2o
支持稀疏矩阵和自动求导,并提供了用于图可视化的工具。
ceres-solver-python
: 这是Ceres Solver
的Python
接口,提供了在Python
中使用Ceres Solver
进行非线性优化的功能。该接口可以方便地与其他Python
库(如NumPy
)集成,并简化了在Slam
应用中使用Ceres Solver
的过程。
梯度下降法(Gradient Descent
)是一种迭代的优化算法,通过沿着目标函数的负梯度方向进行参数更新,逐步接近最优解。梯度下降法的更新步骤简单,但可能会陷入局部最优解。它的收敛速度较慢,特别是在目标函数存在高度非凸性或长而窄的优化空间时。
牛顿法(Newton's Method
)是一种基于目标函数的二阶导数信息的优化算法。它使用目标函数的梯度和海森矩阵(Hessian Matrix
)来更新参数。相较于梯度下降法,牛顿法的收敛速度更快,但计算和存储海森矩阵的代价较高,特别是对于大规模问题。此外,牛顿法可能会陷入局部最优解或不稳定的情况。
高斯-牛顿法(Gauss-Newton
)是一种用于非线性最小二乘问题的优化算法。它是基于牛顿法的一种变体,但假设目标函数可以近似为一组非线性函数的平方和。高斯-牛顿法通过线性化目标函数来估计参数的更新方向,避免了计算和存储海森矩阵的开销。它在处理非线性最小二乘问题方面效果良好,但同样可能陷入局部最优解。
LM(Levenberg-Marquardt
)也是一种用于非线性最小二乘问题的优化算法。它结合了梯度下降法和高斯-牛顿法的思想。LM
法在初始阶段使用梯度下降法进行参数更新,以快速接近最优解,然后逐渐过渡到高斯-牛顿法,以提高收敛速度和稳定性。LM
法通过引入一个调整参数来平衡梯度下降法和高斯-牛顿法之间的权衡关系,从而更好地适应不同的问题。
多传感器融合:结合多种传感器的信息,如激光雷达、摄像头、惯性测量单元(IMU
)等,进行传感器融合。通过多传感器的互补性,可以提高对动态对象的感知和估计。
运动预测与滤波:根据动态对象的运动模式,通过运动预测来估计其未来位置。比如使用滤波器(如扩展卡尔曼滤波器或粒子滤波器)来跟踪动态对象,并预测它们在未来时间步的位置。
动态物体检测与跟踪:引入动态物体检测和跟踪算法,以识别并跟踪动态对象(如行人)。比如使用传感器(如激光雷达或摄像头)来观测并分割动态对象,然后使用目标跟踪算法来跟踪它们的运动。通过将动态对象的信息与Slam系统的数据进行分离,可以减少其对机器人位姿估计的干扰。
鲁棒性设计:通过引入回环检测机制和滑动窗口优化等方法,一定程度上减小动态对象对位姿估计的影响,使Slam算法更鲁棒。
特征提取和描述子学习:深度学习可以用于学习鲁棒的特征提取方法和描述子,例如使用卷积神经网络(CNN
)来提取图像特征。
深度学习辅助的视觉里程计:深度学习可以用于学习视觉里程计的模型,通过输入图像序列预测相机的运动,实现端到端的运动估计。
深度学习辅助的回环检测:深度学习可以用于学习图像的表示和相似性度量,从而改善回环检测的准确性和鲁棒性。
语义Slam
:深度学习可以用于学习场景的语义信息,例如物体的类别、语义分割和实例分割等。将语义信息与Slam
结合可以提高环境建模、物体跟踪和场景理解的能力,例如在机器人导航和增强现实中应用。
tips: 至于不可避免的实时性问题,可参考硬件加速(GPU
)、模型压缩和优化、网络结构设计和多尺度处理等方法来缓解。
rpg_trajectory_evaluation
:rpg_trajectory_evaluation
提供了一系列的评估指标和可视化功能,用于比较机器人轨迹与参考轨迹之间的差异。主要特点包括:evo
(Evaluation for Autonomous Systems
):evo
专注于轨迹评估和比较。它提供了一系列的评估指标和可视化工具,用于比较不同轨迹估计算法的性能。主要特点包括:图优化(Graph Optimization
)是用于估计系统状态或参数的最优解。通过构建一个图模型,将观测和约束以图的形式表示,并利用优化算法来找到最符合观测和约束的状态或参数。图优化的基本步骤如下:
Least Squares
)、高斯-牛顿法(Gauss-Newton
)、Levenberg-Marquardt
算法等。以下待更新
不定期更新…
⭐️