欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 【视觉惯性SLAM:十八、ORB-SLAM3 中的局部建图流程】

【视觉惯性SLAM:十八、ORB-SLAM3 中的局部建图流程】

2025/2/5 14:59:19 来源:https://blog.csdn.net/weixin_43086101/article/details/145233060  浏览:    关键词:【视觉惯性SLAM:十八、ORB-SLAM3 中的局部建图流程】

18.1 局部建图流程的作用

局部建图的定义和概述

局部建图是视觉 SLAM 系统中一个核心模块,其主要目的是在当前帧和附近关键帧之间建立高质量的局部地图,同时优化局部地图中所有特征点的三维位置和相关关键帧的位姿。这一过程通过限制地图优化的范围,在保证地图局部一致性的同时减少计算开销,为系统实时运行奠定基础。

局部建图的输入是当前帧的特征点和局部关键帧的特征点匹配关系,其输出是经过优化的地图点和关键帧位姿,以及进一步剔除的动态点或误差点。它在整个 ORB-SLAM3 系统中处于跟踪模块和全局建图模块之间,起到承上启下的关键作用。

局部建图的核心任务

  1. 维护局部地图的完整性
    局部建图的首要任务是维护当前帧附近的局部地图区域。通过更新和优化局部地图,可以确保特征点的分布合理、误差最小。

  2. 优化当前帧的位姿
    在跟踪过程中,当前帧的位姿估计会受到环境复杂性和动态因素的影响。局部建图通过对关键帧和地图点的联合优化,能够进一步提升位姿的精度。

  3. 平衡实时性与精度
    ORB-SLAM3 是一个实时系统,因此局部建图需要在保持精度的同时,尽量减少计算开销。通过局部区域限制优化范围,可以提高算法的实时性。

局部建图的核心作用

  1. 局部地图优化
    局部建图通过增量式更新局部地图,确保地图点的精度和关键帧之间的几何一致性。优化过程中会移除误差较大的点,修正局部地图的误差积累。

  2. 支持实时跟踪
    实时性是 SLAM 系统的重要特点,而局部建图通过限制优化范围和实时剔除无效点,大大减轻了计算负担,使得系统可以在有限硬件条件下实现高效运行。

  3. 提高全局地图质量
    局部建图提供了更精确的地图点位置和关键帧位姿,这些信息将作为输入,传递给全局建图模块,从而提高全局优化的初始条件和效果。

  4. 辅助动态环境适应
    在动态场景中,局部建图模块可以识别并剔除动态点,从而提高 SLAM 系统在复杂环境中的鲁棒性。

局部建图的重要性

局部建图直接影响 SLAM 系统的整体性能,以下是其主要作用:

  1. 提高地图质量
    通过对局部区域的频繁优化,可以减少累积误差,增强地图点的质量,为后续的全局建图提供更可靠的数据。

  2. 增强系统鲁棒性
    在动态环境中,局部建图有助于剔除动态特征点,从而提高系统对环境变化的适应能力。

  3. 支持重定位功能
    局部地图的优化结果可用于快速重定位,为跟踪失败后的恢复提供支持。

  4. 适配多传感器数据
    局部建图可以结合 IMU、RGB-D 数据等多模态输入,使地图构建更精确,同时提高对快速运动场景的处理能力。

实际应用场景

局部建图广泛用于机器人导航、无人机飞行、增强现实等领域。例如:

  • 无人驾驶汽车:局部建图为车辆提供短期导航信息,避免依赖全局地图的高昂计算成本。
  • 无人机导航:在复杂的森林或城市环境中,局部建图可帮助无人机实时调整路径,避免障碍。

局部建图是 ORB-SLAM3 架构中的关键模块,其作用不仅限于局部区域优化,还对全局建图和跟踪模块起到了重要的桥梁作用。

局部建图与全局建图的关系

局部建图专注于当前帧及其邻域的优化,计算开销较小,适合实时应用;而全局建图关注整个地图的全局一致性,通常需要更多的时间进行复杂优化。两者的结合确保了系统的实时性和长期稳定性。

18.2 局部建图流程的流程

局部建图流程的核心是对局部地图区域的增量更新和优化。ORB-SLAM3 在该模块中融合了多种优化技术,包括特征点剔除、关键帧选取和局部 BA(Bundle Adjustment)。以下是具体流程的分步详解:

18.2.1 流程概述

局部建图的典型流程如下:

  1. 选择局部关键帧
    根据当前帧的位姿,选择与之最近的若干关键帧作为局部地图的基础。这些关键帧需要满足:

    • 空间邻近性:与当前帧的距离较小。
    • 视角重叠性:包含较多与当前帧匹配的特征点。
  2. 筛选局部地图点
    从选择的关键帧中提取地图点,并剔除冗余或误差较大的点。特征点筛选的标准包括:

    • 距离约束:地图点与当前帧的距离在一定范围内。
    • 视角约束:地图点需要在当前帧的视野内。
  3. 优化局部地图
    使用局部 BA 对选定的关键帧和地图点进行联合优化。局部 BA 的目标是最小化地图点的重投影误差,优化变量包括:

    • 关键帧的位姿。
    • 地图点的三维位置。
  4. 更新局部地图
    将优化后的结果更新到局部地图中,并剔除可能的动态点或误差点。

  5. 反馈到跟踪模块
    将局部优化后的位姿信息反馈给跟踪模块,提升当前帧的跟踪精度。

18.2.2 流程图实现

为了清晰表达上述流程,可以构建一个详细的流程图,其中包括:

  • 节点:如局部关键帧选取、地图点筛选等。
  • :表示数据和状态的流动。

具体流程图的实现可以参考图形化工具(如 Matplotlib 或 Graphviz),并结合伪代码对每个步骤进行描述。

18.2.3 每个步骤的详细展开

1. 关键帧选择

关键帧选择是局部建图的第一步,其核心目的是找到与当前帧相关性较高的关键帧,构成局部地图的基础。
关键帧的选择主要依据以下几个标准:

  • 空间距离:关键帧与当前帧的位姿距离较近。
  • 视野重叠:关键帧和当前帧包含较多相同的地图点。
  • 时间关联:关键帧与当前帧的时间间隔较小。

关键帧选择可以通过 KD 树快速实现最近邻搜索,从而提高效率。

2. 地图点筛选

在选择了相关关键帧后,需要从中提取地图点并进行筛选,以保证局部地图的精度和一致性。筛选标准包括:

  • 投影约束:地图点需要投影到当前帧的视野内。
  • 误差约束:剔除误差较大的点。
  • 动态点检测:通过光流或深度一致性检测动态点。

剔除动态点的算法如下:

def remove_dynamic_points(points, motion_threshold):static_points = []for point in points:if point.motion < motion_threshold:static_points.append(point)return static_points

3. 局部地图优化

优化过程采用局部 BA,目标是最小化地图点的重投影误差:

Cost = ∑ i = 1 N ∑ j = 1 M ∥ u i j − π ( K [ R i P j + T i ] ) ∥ 2 \text{Cost} = \sum_{i=1}^{N}\sum_{j=1}^{M}\| u_{ij} - \pi(K[R_iP_j + T_i]) \|^2 Cost=i=1Nj=1Muijπ(K[RiPj+Ti])2

其中:

  • u i j u_{ij} uij 是图像点坐标。
  • P j P_j Pj 是地图点坐标。
  • R i R_i Ri T i T_i Ti 是关键帧的旋转和平移矩阵。
  • π \pi π 是相机投影模型。

局部 BA 的实现可以使用 Ceres Solver 或 g2o 进行非线性优化。

4. 更新地图

优化后的结果需要更新到全局地图中,包括关键帧的位姿和地图点的位置。同时需要对地图点进行裁剪,避免冗余数据。

5. 反馈跟踪模块

将优化后的关键帧位姿传递给跟踪模块,以提高当前帧的跟踪精度。这一步确保了跟踪与建图之间的协同工作。

18.2.4 流程中的关键技术

局部建图流程依赖以下几项关键技术:

  1. 特征点剔除策略

    • 动态点检测:利用光流一致性剔除动态点。
    • 误差点剔除:结合 RANSAC 等方法剔除误差较大的点。
  2. 局部 BA 算法

    • 使用基于 Levenberg-Marquardt 的非线性优化方法。
    • 在优化过程中引入 IMU 数据的先验约束,增强鲁棒性。
  3. 实时优化机制

    • 将优化过程分解为小批量处理,避免阻塞主线程。

局部建图流程的优化直接影响 SLAM 系统的效率与精度,特别是在动态环境中,其重要性更加突出。

18.3 IMU 的初始化

IMU 初始化是 ORB-SLAM3 中局部建图的前置步骤,它的主要目的是将 IMU 的惯性信息与视觉信息对齐,从而实现更精确的位姿估计。

18.3.1 IMU 初始化原理及方法

IMU 初始化的核心任务是估计以下变量:

  1. 重力向量
    通过加速度计数据,推导出重力方向。

  2. 尺度因子
    由于视觉 SLAM 系统通常无法确定绝对尺度,因此需要利用 IMU 数据确定真实比例。

  3. 初始速度和偏移量
    利用 IMU 数据估计初始速度和陀螺仪的偏移。

IMU 初始化方法

  1. 基于静止假设的初始化

    • 假设初始阶段传感器静止,通过连续采样确定重力向量和偏移量。
    • 适用于静态场景。
  2. 基于运动模型的初始化

    • 在传感器运动的情况下,通过多帧联合优化确定初始变量。
    • 适用于动态场景。
  3. IMU-视觉联合初始化

    • 将视觉特征点与 IMU 数据融合,利用滑动窗口法优化初始值。

18.3.2 IMU 初始化代码实现

以下是基于滑动窗口的 IMU 初始化代码伪实现:

# 初始化变量
gravity = np.zeros(3)
velocity = np.zeros(3)
bias_gyro = np.zeros(3)
bias_acc = np.zeros(3)# 收集 IMU 数据
for imu_data in imu_buffer:# 计算加速度方向acc_normalized = normalize(imu_data.acceleration)gravity += acc_normalized# 平均重力方向
gravity /= len(imu_buffer)# 优化初始变量
optimize_initial_parameters(gravity, bias_gyro, bias_acc)

IMU 初始化是 ORB-SLAM3 实现高精度跟踪和建图的基础,其精度直接影响局部建图和全局优化的效果。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com