SLAM前端(里程计二):ORB特征点匹配

(1)构建图像高斯金字塔

将图像进行降采样8次,每次尺度缩小1/1.2,如下图所示:

采用高斯金字塔的目的是解决特征点尺度不变性,并且可以提取更多的关键点。高斯金字塔每个尺度代表了不同的距离,即低分辨率的图像可以看做从远处拍摄图像的一部分,这样提取8个尺度的图片就可以保证特征点尺度不变性。想像一下,如果第二帧图像相对于第一帧图像走远了,那么根据Fast角点的定义,这两帧图像共有的图像中,很多对应的特征点都难以匹配,如果第一帧图像提特征点使就降采样并提取特征点,则第二帧图像上的特征点与第一帧降采样后尺度是相近的,很容易匹配到。因此采用高斯金字塔将这8张图像的特征点共同当做当前帧的特征点,当下一帧图像走远或走进场景,确保不会因为尺度不同而无法匹配。

图像金字塔效果参照图像金字塔在ORB-SLAM中的应用详解,如何解决特征点尺度不变性

(2)在不同尺度的图像上检测Fast角点并根据栅格剔除

提取Fast角点,每一层图像特征点有个上限值:nfeatures,分辨率越低即金字塔层数越高,数量越少。

对每一层图像划分30*30的栅格,在每个栅格内,根据nfeatures选取该区域内提取的Fast角点,保证一层图像上特征点分布均匀。ORB-SLAM中通过函数DistributeOctTree()实现特征点的栅格剔除,具体思路是:因为当特征点都集中在图像的某个局部时,计算出来的描述子不理想,所以为了让角点分布更加均匀,运用四叉树算法对角点进行均匀分布。具体方式就是根据图像的大小,设置图像的根节点个数,之后将根节点四等分,再检测并且记录每个分节点里面关键点的个数,当节点里面特征点的个数等于0,就删除这个节点,如果特征点个数大于1就继续分割。当节点数目大于这一层所需要特征点数目或者每个节点下特征点数目都是1的时候停止。对已经创建好的节点根据特征点的数量从小到大排序,,优先对特征点较少的节点进行分割,倘若还没有遍历完所有的节点,节点数满足每层特征点的数量要求,就可以不用对包含特征点多的节点进行分割。最终的结果就尽可能将特征点均匀的分布在图像中。

参考链接:ORBextractor.cc

(3)使用质心法计算每个特征点的主方向,计算特征点的描述子

(4)候选关键点

在当前栅格内,找到以x、y为中心,边长为2r的方形内,且图像层在[minLevel, maxLevel]的所有特征点

(5)计算带匹配点与候选关键点之间的汉明距离

描述子利用描述子计算带匹配点之间的汉明距离。

(6)比例阈值筛选

首先最优匹配点的汉明距离要小于某一阈值,其次最优匹配点比次优匹配点明显要好,那么最佳匹配才真正靠谱,避免出现模棱两可的情况。(最优匹配点汉明距离<阈值) &&(最优的匹配点韩明距离<2*次优匹配点的韩明距离*系数)系数一般0.9。

(7)角度投票(旋转一致性)进行剔除误匹配

每个特征点在提取描述子时的旋转主方向角度,如果图像旋转了,这个角度将发生改变,所有的特征点的角度变化应该是一致的,通过直方图统计得到最准确的角度变化值。

统计方向偏差直方图 频率最高的三个bin保留,其他范围内的匹配点剔除。

另外,若最高的比第二高的高10倍以上,则只保留最高的bin中的匹配点。

若最高的比第 三高的高10倍以上,则 保留最高的和第二高bin中的匹配点。

代码参考链接:ORB特征匹配 投影匹配 极线搜索匹配 方向一致性过滤 尺度过滤

 

### 集成轮式里程计ORB-SLAMORB-SLAM框架内引入轮式里程计数据能够显著提升系统的鲁棒性和精度。通常情况下,ORB-SLAM主要依赖于视觉特征来估计设备的姿态和构建环境地图。然而,在某些场景下仅依靠视觉信息可能足以提供可靠的定位效果,尤其是在光照条件差或者纹理匮乏环境中。 为了增强系统表现并充分利用多传感器的优势,可以考虑将来自轮式里程计的数据融入到现有的SLAM算法之中[^1]。具体实现方式如下: #### 修改前端模块以接收里程计读数 首先需要调整ORB-SLAM源码中的`Tracking`类,使其仅处理图像帧同时也接受外部传入的里程计测量值作为额外输入。这一步骤涉及到创建新的接口函数用于获取最新一轮程计更新,并将其转换为适合内部使用的坐标系表示形式。 ```cpp void Tracking::UpdateWithOdometry(const cv::Mat &Tcw_odom){ // 更新当前帧相对于世界坐标的预测姿态 Tcw_pred = Twc_last * Tcw_odom; } ``` #### 调整状态估计过程加入先验约束 其次是在优化过程中利用里程计提供的相对运动信息施加先验约束。这意味着当求解每一时刻的最佳位置时,除了基于观测到的关键匹配外还要考虑到前一时刻已知的位置关系及其确定性分布。这种做法有助于减少累积漂移现象的发生概率,从而提高整体轨迹重建质量。 ```cpp g2o::VertexSE3Expmap* vOdo = new g2o::VertexSE3Expmap(); vOdo->setId(id); vOdo->setEstimate(g2o::SE3Quat(Tcw_odom)); optimizer.addEdge(new EdgePrior(vOdo, cov)); // 添加带有协方差矩阵cov的边 ``` #### 实现闭环检测阶段的信息融合 最后值得注意的是,在执行回环闭合操作期间同样应当重视同模态间的一致性验证。即仅要确认两幅图片间的相似度达到阈值以上,而且要检查对应时间段内的路径长度差异是否合理。只有满足上述两个条件才能最终认定存在真实的循环结构并据此修正历史记录中存在的偏差。 通过上述改动之后便可以在保持原有功能的基础上有效吸收轮式里程计所带来的优势特性,进而打造出更加完善且适应性强的地图绘制工具[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值