400-123-4567
ORB_SLAM2使用g2o库进行优化。
优化分为四种:
(1)全局BA优化(在单目初始化之后、回环检测之后进行全局BA优化。对所有关键帧的位姿、路标点进行优化)
(2)局部BA优化(在局部建图之后进行,对当前帧及其共视关键帧的位姿、路标点进行优化)
(3)位姿图优化(仅优化位姿,在恒速运动模型、参考关键字模型、重定位、局部地图跟踪的时候执行)
(4)本质图优化(在回环校正过程中进行优化,将闭环误差分配到本质图中)
(5)Sim3优化(检测到回环之后,会进行闭环帧和当前帧间的Sim3估计,随后进行Sim3优化)
需要注意的是,优化完路标点之后,要记得更改路标点的属性(如观测角度,平均深度等)。
(1)全局BA优化(GlobalBundleAdjustment)与局部BA优化(LocalBundleAdjustment)
(2)位姿优化(只优化相机位姿,不优化路标点坐标)
(3)优化本质图
优化本质图中的关键帧的位姿以及路标点坐标。
(4)筛选出的闭环帧的位姿优化
优化所有关键帧的位姿和路标点。(单目初始化、闭环优化后)
边中只加入了路标点与关键帧间的连接边。
在边中会设置信息矩阵。信息矩阵的作用是确定在优化过程中,每条边分担的误差有多少。
?
?
在恒速运动模型、参考关键帧模型、重定位、局部地图跟踪(和局部地图优化不一样,局部地图追踪是在Track线程中,而局部地图优化是在LocalMapping线程中)的时候,都会用到位姿优化。(个人感觉与位姿图优化不一样。位姿图优化的话,边连接的是两个顶点,BaseBinaryEdge。而这里的边只连接一个顶点,BaseUnaryEdge。)
边为一元边,因为边只连接位姿。
?
?
在局部建图线程处理完最后一个关键帧之后,调用局部BA优化。
局部地图中包括当前帧及其共视关键帧(权值大于一定的比例)。对于那些权值小于阈值的关键帧,在BA优化过程中,只提供约束,不进行优化。
过程与全局BA优化相似,设定位姿顶点、路标顶点,建立两个顶点间的边。进行优化(一开始使用鲁棒核函数进行优化,优化之后去掉外点(边的代价过大),然后对剩下的点不使用鲁棒核函数进一步优化)。
?
?
本质图与共视图相似,但更加严格。其主要作用是在回环检测之后,将闭环误差均摊到本质图中。
在本质图优化中,只优化关键帧的位姿。
是一个位姿图优化,边连接两个位姿顶点。
?
?
检测到回环,计算出当前帧和回环帧间的Sim3变换后,进行优化。
在第一次优化过程中,那些误差很大的边,直接剔除掉,然后对剩下的边进一步进行优化。