在VSLAM中,我们首先构造3D-3D、3D-2D、2D-2D匹配,然后据此去估计相机的运动。完美估计需要完美的匹配,但实际的匹配中往往存在很多错误。如何消除或者降低错误匹配的影响呢?一种方法是选择那些正确的匹配进行估计(RANSAC),另一种是降低那些错误匹配的权重(鲁棒核函数),下面分别介绍。
1. RANSAC随机采样一致算法
这种方法的目的是,从所有数据中选择正确的数据,用于估计。为了方便,先给几个定义。
点:每一个数据,SLAM里指的是匹配的点对 野值/外点:错误的点 内点:正确的点 内点集:内点的集合 外点集:外点的集合 模型:带估计的参数:估计模型所需要的最小点数:所有的点形成的点集
显然,内点集就是我们想要找的正确数据。RANSAC的想法是从点集中随机的选择出
STEP 1. 随机的从中选择个点作为一个样本,估计出模型
STEP 2. 确定在模型距离阈值内的数据点集,即可为内点集
STEP 3. 如果的大小大于某个阈值,用所有内点重新估计一个更精确的模型
STEP 4. 如果的大小小于阈值,则重复1步骤
STEP 5. 经过次试验,选择最大一致集,并用的所有点重新估计模型
RANSAC里面有三个重要的参数需要确定,分别是
1.1 内点阈值
根据模型,每个点可以计算出一个距离的平方
一般取
1.2 采样次数
最多采样多少次就结束呢?一个点为内点的概率为
事件A:在次采样中,至少要有一次选取的子集内没有外点的概率。
事件A的逆事件为:次采样中,所有选取的子集内至少存在一个外点。这个概率为。那么
需要注意:
采样次数与内、外点的比例有关系,而与数据的量级无关系。
采样次数随着给最小点数的增大而增大。
1.3 内点数量阈值
当我们发现内点的数量足够多的时候就可以提前结束采样。内点数量的阈值
1.4 自适应的决定采样次数
从式(1)可以看出,采样次数
开始时可以设
,sample_count = 0
当重复
选取一个样本,并计算内点数,
if 新内点数增加
令
取,根据计算
end
sample_count ++
终止
1.5 实例-拟合2D直线
模型
直线的一般方程
两边同时除以
可以解出来
注意到
这就是两点确定一个条直线一般方程的方法。
内点距离
内点的距离取点到直线的距离
阈值
代码
我们可以制造一些数据,来测试一下RANSAC。具体代码如下
ydsf16/MVG_Algorithmgithub.com2. 鲁棒核函数
上述RANSAC方法进行模型估计,实际上分了两步,首先选出局内点,然后再进行一步优化。鲁棒核函数只需要一步,直接优化求解模型参数,通过降低外点的权重,来降低错误数据的影响。一般,我们会优化如下的代价函数
外点造成的误差/距离
当距离
那么
参考资料
[1] Multiple View Geometry
[2] g2o: A general Framework for (Hyper) Graph Optimization
----相关代码----
ydsf16 - Overviewgithub.com----更多SLAM文章----
杨小东:[ORB-SLAM2] ORB-SLAM中的ORB特征(提取)
杨小东:SLAM轨迹真值获取装置
杨小东:[PnP]PnP问题之EPnP解法
杨小东:[PnP] PnP问题之DLT解法
杨小东:[ORB-SLAM2]卡方分布(Chi-squared)外点(outlier)剔除
杨小东:[ORB-SLAM2] ORB特征提取策略对ORB-SLAM2性能的影响
杨小东:[PR-3]ArUco EKF SLAM 扩展卡尔曼SLAM
杨小东:[PR-2] PF 粒子滤波/蒙特卡罗定位