ORB-SLAM3 的闭环检测和地图融合线程是其重要组成部分,旨在提升位姿估计精度、优化地图一致性以及减少累计误差。本章分为两大部分:闭环检测和地图融合,每部分包括具体步骤及其原理、实现细节和扩展。
19.1 检测共同区域
闭环检测的目标是识别当前帧与历史帧之间的重叠区域,以便为全局优化提供约束。该部分包括寻找初始候选关键帧、求解位姿变换和校验候选关键帧。
19.1.1 寻找初始候选关键帧
背景与意义
在长时间运行的 SLAM 系统中,累计误差不可避免。闭环检测通过识别当前帧和历史关键帧的重叠区域,为全局优化提供约束,显著降低误差。寻找初始候选关键帧是闭环检测的第一步,关系到整个闭环模块的效率和准确性。
实现方法
ORB-SLAM3 使用词袋模型(Bag of Words, BoW)快速检索候选关键帧,这是一种高效的特征检索方法。以下为具体实现步骤:
-
ORB 特征提取:从当前帧中提取 ORB 特征点及其描述子。
- ORB 特征具有良好的旋转不变性和尺度不变性,是实时系统的理想选择。
- 提取的描述子将作为后续匹配的基础。
-
构建词袋模型:词袋模型通过量化特征描述子,将图像表示为稀疏特征向量。
- 离线阶段:构建视觉单词字典(通常使用 K-Means 聚类)。
- 在线阶段:将当前帧的特征描述子量化为特征词向量。
-
快速候选检索:利用 BoW 向量和数据库中已存储的关键帧向量进行快速匹配。
- 使用相似性度量(如内积或余弦相似度)计算匹配得分。
- 选择得分最高的若干帧作为候选关键帧。
-
设置阈值:过滤掉匹配得分低于设定阈值的关键帧,以减少后续计算量。
方法:基于词袋模型的候选关键帧检索
ORB-SLAM3 中常用的候选关键帧检索方法是基于词袋模型(Bag of Words, BoW)。词袋模型通过对图像特征进行量化编码,将视觉特征表示为特征向量,然后通过快速匹配查找相似关键帧。
具体步骤:
- 特征提取:从当前帧中提取 ORB 特征,并使用词袋模型对其量化。
- 候选关键帧查找:将量化后的特征与数据库中的所有关键帧进行比较,选出得分较高的候选关键帧。
- 设定候选阈值:仅保留匹配分数超过设定阈值的关键帧。
候选关键帧的加速实现
- KD 树加速匹配:通过使用 KD 树存储特征点的描述子,可以快速查找与当前帧匹配的特征点。
- 层次化匹配策略:首先在粗略尺度匹配特征点,然后逐步精细化。
伪代码示例
def find_candidate_keyframes(current_frame, database):candidates = []current_bow = compute_bow(current_frame.features)for keyframe in database.keyframes:score = compute_similarity(current_bow, keyframe.bow)if score > THRESHOLD: # 阈值判断candidates.append(keyframe)return candidates
扩展:基于时空约束的优化
为了进一步提高检索效率,可以结合时空信息(如运动轨迹和位姿变化)对候选关键帧进行约束,排除明显不相关的关键帧。
性能优化
- KD 树加速检索:将特征描述子存储在 KD 树中,实现快速最近邻搜索。
- 基于时空一致性的过滤:结合帧间时间和空间信息排除不合理候选关键帧。
优缺点
- 优点:检索速度快,适合实时系统;存储需求低。
- 缺点:依赖字典质量,可能存在量化误差。
扩展案例
在大规模环境中,可以结合场景分割信息进一步提升检索效率。例如,利用语义分割先划分场景类别,仅对同类场景的关键帧进行匹配,从而减少搜索空间。
19.1.2 求解位姿变换
背景
在找到初始候选关键帧后,需要计算当前帧与候选关键帧之间的位姿变换。这一过程的结果将作为闭环优化的重要约束条件。
数学模型
位姿变换可以表示为:
T c w = [ R t 0 1 ] T_{cw} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} Tcw=[R0t1]
其中, R R R 为旋转矩阵, t t t 为平移向量。目标是通过匹配的三维点对,估计 T c w T_{cw} Tcw 。
目标函数为最小化重投影误差:
E = ∑ i ∥ u i − π ( K [ R ⋅ P i + t ] ) ∥ 2 E = \sum_{i} \| u_i - \pi(K[R \cdot P_i + t]) \|^2 E=i∑∥ui−π(K[R⋅Pi+t])∥2
其中:
- u i u_i ui 为当前帧中的像素点。
- P i P_i Pi 为三维地图点。
- K K K 为相机内参矩阵。
实现步骤
-
特征匹配:对当前帧与候选关键帧提取的 ORB 特征描述子进行匹配。
- 使用 Hamming 距离衡量特征相似性。
- 保留匹配分数最高的前 N 个匹配点。
-
RANSAC 过滤:使用随机抽样一致性算法(RANSAC)剔除错误匹配点。
- 随机选取点对,估计位姿变换。
- 根据投影误差判断一致点。
- 重复多次,保留一致点最多的模型。
-
位姿优化:采用非线性优化(如 Levenberg-Marquardt 算法)进一步优化位姿。
- 输入:匹配点对、初始位姿估计。
- 输出:优化后的位姿。
伪代码
def estimate_pose(current_frame, candidate_frame):matches = match_features(current_frame.features, candidate_frame.features)inliers = ransac(matches)pose = nonlinear_optimization(inliers)return pose
扩展
对于视觉惯性系统,可以将 IMU 数据纳入优化目标函数。例如,将 IMU 提供的角速度和加速度作为先验约束,提高估计精度。
19.1.3 校验候选关键帧
必要性
候选关键帧可能包含误匹配,为避免错误优化影响全局地图一致性,必须对候选关键帧进行校验。
校验方法
-
几何一致性校验:
- 验证三维点云的重投影误差是否满足预设阈值。
- 确保特征点对的深度信息一致。
-
回环验证:
- 使用双向匹配检查当前帧与候选关键帧之间的闭环关系。
- 只有当双向匹配结果一致时,才认为闭环有效。
-
拓扑一致性校验:
- 检查候选关键帧与其相邻关键帧是否存在合理的拓扑关系。
- 确保闭环不会导致地图拓扑结构紊乱。
案例扩展
在动态环境中(如室外行人区域),误匹配可能由动态物体(如行人)引起。此时,可以结合语义分割结果剔除动态物体的特征点,提升校验精度。
19.2 地图融合
地图融合负责将多源地图整合为一致的全局地图,包括纯视觉地图融合和视觉惯性地图融合。
19.2.1 纯视觉地图融合
流程
- 子地图匹配:使用词袋模型或直接特征匹配找到共享关键帧。
- 地图对齐:利用共享关键帧的位姿变换,将子地图对齐。
- 全局优化:通过全局 BA 调整所有关键帧和地图点的位置。
扩展方法
- 基于时空约束的融合:根据时间和空间信息提高匹配效率。
- 多分辨率优化:先粗略对齐再逐步细化。
19.2.2 视觉惯性地图融合
视觉惯性地图融合将 IMU 数据引入地图优化,显著提高对动态环境的适应能力。
实现细节
- 惯性先验约束:通过 IMU 提供的位姿信息,减少优化的自由度。
- 联合优化模型:将视觉误差和惯性误差联合构建优化目标函数。