Covisibility graph(共视图)
**共视图(covisibility graph)**由ORB-SLAM率先提出并推广,是关键帧之上的一个带权无向图:
- 节点:关键帧。
- 边:连接观测到共同地图点的两个关键帧。
- 边权重:共享地图点观测的数量。在ORB-SLAM中,当权重超过阈值 (通常约为15个共享点)时才保留该边。
该图编码了”谁看到了什么”,而与关键帧创建的时间或位置无关。相隔数分钟、但从相同视点拍摄的两个关键帧会紧密相连;而在快速转弯过程中产生的两个连续关键帧,彼此之间的连接却可能十分微弱。这使得共视性成为比时间或欧氏距离更好的视觉地图”邻域”概念。
SLAM系统会不断地查询共视图:
- 局部光束法平差:当一个新关键帧到来时,将它与其共视邻居以及它们所观测到的地图点一起优化——这是一个定义明确的局部窗口,恰好自动包含了相关的几何信息。
- 跟踪与地图点检索:将共视关键帧观测到的点投影到当前帧中,以找到更多匹配。
- 回环检测:从识别数据库中得到的候选地点会与共视邻域进行验证,检测到的回环不仅修正一个位姿,还会修正整个共视群组。
- 关键帧剔除:如果一个关键帧的观测大部分已被其共视邻居覆盖,则该关键帧是冗余的,可以被移除,从而保持地图的紧凑性。
一个密切相关的结构是基本图(essential graph):一个更加稀疏的子图,由关键帧的生成树构成,并加入高权重的共视边和回环检测边。ORB-SLAM在基本图(而非稠密共视图)上运行位姿图优化,以极低的代价获得接近完整优化的大部分精度。
形式化定义与维护
设 为关键帧 观测到的地图点集合。两个关键帧之间的共视权重就是
且图中保留边 当且仅当 。这一过程完全不需要位姿——它纯粹是对观测的记账——这正是它便宜且可增量维护的原因:
- 当插入一个关键帧时,统计它与观测到其匹配点的关键帧之间的共享观测数量(通过每个地图点的观测列表找到),并添加/更新相应的边。
- 当一个地图点获得或失去一次观测时(融合、剔除、跟踪到新匹配),受影响的权重会在局部被更新。
- 当一个关键帧被剔除时,它的边随之消失,生成树会将其子节点重新连接到其他邻居。
在实践中,每个关键帧会将其邻居按权重排序存储,因此像”权重最高的 个共视关键帧”(用于定义局部BA窗口,以及扩展回环候选)这样的查询是 的。值得注意的是ORB-SLAM设计中的非对称阈值:共视图保留相对较弱的边( 个共享点),因为局部建图受益于较宽泛的邻域;而基本图只保留强边(),因为位姿图优化需要少而可靠的约束。
为什么不用时间或距离?
有必要理解一下其他方案的失效模式。时间窗口(最近 帧)在相机重新访问某个地点时就会失效:观测同一场景的旧关键帧被排除在局部BA之外,导致地图局部重复和漂移。度量邻域(半径 米内的关键帧)在方向变化时会失效——一个相距半米但朝向相反墙面的关键帧不共享任何观测,只会带来代价而毫无贡献——而且它依赖于本身正在漂移的位姿估计。共视性通过在观测空间中定义邻域绕开了这两个问题:它恰好是那些测量约束着相同几何结构的关键帧集合,也恰好是局部BA构造一个良态问题所需要的集合。
常见陷阱
- 阈值权衡: 太低会使局部BA窗口急剧膨胀(一个小房间里的每个关键帧都与其他所有关键帧相连);太高则会使图碎裂,导致BA缺乏约束。纹理丰富的小房间场景是压力测试的重点。
- 权重过时:如果点的剔除/融合没有同步更新共视边,图会逐渐偏离现实,局部窗口会纳入不相关的关键帧。
- 混淆两种图:局部建图查询的是(稠密的)共视图;回环检测的位姿图优化运行在(稀疏的)基本图上。在完整共视图上运行位姿图优化会显著更慢,而精度提升却很有限——这正是基本图设计的意义所在。
- 假设共视性意味着可匹配性:两个关键帧可能共享很多点,但视角差异极大;即使图显示它们是邻居,描述子匹配之间仍可能失败。
对SLAM的意义
共视图是使基于特征点的SLAM能够扩展的数据结构:它限制了局部BA的代价,聚焦了地图点搜索的范围,并为回环检测后的快速全局修正提供了稀疏骨架(基本图)。共视图由ORB-SLAM引入,影响了几乎所有后续基于关键帧系统的地图管理方式,包括ORB-SLAM2/3及其众多衍生系统。