1. 滑动窗口滤波和优化

1.1 实际环境下的BA结构

问题:带有相机位姿和空间点的图优化称为BA,可以有效地求解大规模的定位和建图问题。但实际情况中,我们要考虑系统的算力,我们必须控制BA的规模,保证计算的实时性。

做法:

  1. 从连续的视频中抽出一部分作为关键帧,仅构造关键帧与路标点之间的BA,于是非关键帧只用于定位,对建图没有贡献。但是随着时间流逝,关键帧也会变多,计算压力又会变大
  2. 滑动窗口法:将BA固定在一个时间窗口内,离开这个窗口的责备丢弃(不优化)。也不一定是时间窗口,可以根据某种原则,可以是时间上靠近,也可以是空间上靠近,也可以是有共视路标的关键帧(ORB-SLAM2)

那么接下来讨论,何为丢弃?被丢弃的帧对保留帧的BA是否产生影响?

1.2 滑动窗口法

什么是边缘化:

边缘化就是把某个未知量通过矩阵恒等变换的方式令其暂时不参与计算,将其与的未知量求出后,被边缘化的量可以自然得到,因此将它们暂时理解为删除也未尝不可。

现在假设滑动窗口内有M个路标点,它们与N个关键帧组成了局部地图,显然我们可以用第9讲介绍的BA方法处理这个滑动窗口,即边缘化所有路标点来加速求解。

现在我们假设N个关键帧符合高斯分布:第10讲 后端2 - 图1
关键帧的位置对应均值,不确定度对应所有关键帧的协方差矩阵。均值就是BA迭代后的结果,而第10讲 后端2 - 图2就是对整个BA的H矩阵进行边缘化(对空间点)之后的结果(其实就是S)。

那么当滑动窗口发生变化(也就是关键帧删减),这些状态变量应该如何变化?

  1. 新增一个关键帧,以及它观测到的路标点
  2. 删除一个旧的关键帧,可能删除它观测到的路标点

如果是传统的BA(不是滑动窗口),这是两个结构不同、相互独立的BA问题,但是在滑动窗口中,这是一个问题,现在我们讨论其中的细节:

  1. 新增一个关键帧和路标点,前N个关键帧服从高斯分布,再来一个新关键帧,我们只需继续正常的BA流程处理即可,对所有空间点边缘化,得到N+1个关键帧的高斯分布
  2. 删除一个旧的关键帧,如果我们只删除一个关键帧,但不删除其观测到的路标点,则会破坏H矩阵的稀疏性,导致无法利用稀疏性加速求解(这里很重要,我的理解是,这里的删除不是直接剔除这个关键帧,而是通过边缘化,记住边缘化的做法是使得H矩阵的右上角变为0矩阵块)

Screenshot from 2022-01-06 22-03-09.png
比如这个图,边缘化第一个关键帧,使得右上角变为0矩阵块。假如这几个路标点只在这个关键帧上观测到,而剔除后相当于BA中明明没有关键帧观测到他们,却仍然保留了对这些路标点的观测信息,回忆一下后验、似然、先验的定义,这种凭空出现的信息(历史求因)被我们称为先验信息。总的来说,只边缘化(删除)关键帧却不删除与其相关的路标点会破坏H的稀疏性,所以我们需要同时边缘化它观测到的路标点。

边缘化关键帧同时边缘化其对应的路标点是最简洁明了的,假如这些路标点也在其他关键帧中出现?所以有很多复杂的边缘化策略。简单的同时边缘化关键帧和路标点,会将(剩下的)路标点的信息转换成剩下的关键帧之间的共视信息。当然还有其他策略如OKVIS使用的策略。

SWF(Sliding Window Filter)中边缘化的直观解释:
边缘化在概率上的意义就是指条件概率。当我们边缘化某个关键帧时,会得到这个关键帧观测到的路标点应该在哪里的的先验信息。这里的先验信息应该不是指的P(x1),应该是路标点的先验信息。后面再补充。

2. 位姿图

是什么:在图优化中,我们构建的BA问题中,只在初始化时优化路标点的位置,而其他时候不考虑路标点只优化关键帧的轨迹,这种图优化就是位姿图。

意义:特征点在优化问题中占据了很大部分,但是经过几次观测后(优化后),特征点基本收敛,发散点已被剔除,再对其优化已无太大意义,所以我们可以在优化几次后把特征点固定住,只把它们看作位姿估计的约束,不再优化他们,减少计算量。

2.1 位姿图的优化

位姿图的结构:

  1. 节点:相机位姿
  2. 边:两个位姿节点之间的相对运动。(特征点法、直接法、GPS、IMU积分)

优化流程:

  1. 构建误差项:第10讲 后端2 - 图4,注意括号内不等于E,因为Tij != 后面两个的乘积,所以才有误差
  2. 左扰动重构误差:对Ti和Tj都左乘一个扰动,有Screenshot from 2022-01-07 15-36-22.png
  3. 根据伴随性质(式4.55)移动扰动项:
    Screenshot from 2022-01-07 15-37-35.png
    这里第2行到第3行是指数的一阶泰勒展开近似。变换中隐含的是第10讲 后端2 - 图7。第3行解开后,可以看出是一个右乘扰动,用右乘BCH近似,有eij关于Ti的导数:
    Screenshot from 2022-01-07 15-42-42.png
    有eij关于Tj的导数:
    Screenshot from 2022-01-07 15-43-16.png
  4. 简化:se(3)上的左右雅可比都过于复杂,我们通常取近似,为单位矩阵(误差太大)或者:
    Screenshot from 2022-01-07 15-44-47.png
  5. 总体目标函数:前面只是构建了误差项,现在构建总体目标函数:
    Screenshot from 2022-01-07 15-46-13.png
    有了节点、边、雅可比矩阵、误差、代价函数,就可以用g2o求解了

小结中提到了前端和后端的响应问题,
前端的定义:前端视觉里程计(Visual Odometry,VO),视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。
后端的定义:后端非线性优化,接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息(包括建图信息、路标点信息),对其进行优化。

人们倾向于把前端和后端分开,运行在两个独立线程之中,历史上称为跟踪(Tracking)和建图(Mapping),但是建图部分主要是指后端的优化内容。前端需要实时响应视频的速度,例如每秒30帧;而优化可以慢悠悠地运行,只要在优化完成时把结果返回给前端即可。所以我们通常不会对后端优化提出很高的速度要求。