0%

ORBSLAM2源码小记(8)--优化器Optimizer

ORBSLAM2的优化器Optimizer

主要是记录下相对容易忘的内容,不会写的很细

这篇是补充说明,把最后那张图的优化器概述一下,因为优化变量前文已经提到了,这里就不展开了(主要是g2o写的优化太占篇幅了)

优化器Optimizer

优化器可以大致分为三类:

  • 优化重投影误差,关键帧和地图点都参与优化
  • 优化重投影误差,仅优化关键帧位姿,不优化地图点
  • 优化Sim3误差,仅优化关键帧Sim3,不优化地图点

GlobalBundleAdjustemnt和BundleAdjustment

优化重投影误差,所有的地图点和关键帧都会参与优化,BundleAdjustment是真正干活的函数。全局BA会在初始化时或闭环矫正后进行执行。

  • 顶点1(关键帧位姿):g2o::VertexSE3Expmap()
  • 顶点2(地图点):g2o::VertexSBAPointXYZ()
  • 二元边(重投影误差):g2o::EdgeSE3ProjectXYZ()

LocalBundleAdjustment

优化重投影误差,用于LocalMapping中优化当前关键帧和一二级共视帧(不过二级共视帧的位姿不优化)。

  • 顶点1(关键帧位姿):g2o::VertexSE3Expmap()
  • 顶点2(地图点):g2o::VertexSBAPointXYZ()
  • 二元边(重投影误差):g2o::EdgeSE3ProjectXYZ()

PoseOptimization

优化重投影误差,仅优化一个普通帧的位姿,不优化地图点。用于Tracking中精细求解普通帧位姿(会被调用不止一次)。

  • 顶点(帧位姿):g2o::VertexSE3Expmap()
  • 一元边(重投影误差):g2o::EdgeSE3ProjectXYZOnlyPose()

OptimizeSim3

优化Sim3误差,仅优化当前帧和闭环候选关键帧的Sim3,不优化地图点。用于计算Sim3时精细求解Sim3变换。

  • 顶点1(关键帧位姿):g2o::VertexSim3Expmap()
  • 顶点2(地图点):g2o::VertexSBAPointXYZ()
  • 二元边(Sim3误差):g2o::EdgeSim3ProjectXYZ()
  • 二元边(Sim3误差):g2o::EdgeInverseSim3ProjectXYZ()

OptimizeEssentialGraph

优化Sim3误差,优化多个关键帧,不优化地图点,用于本质图优化调整这些关键帧之间相对的Sim3。

  • 顶点(帧位姿):g2o::VertexSim3Expmap()
  • 一元边(Sim3误差):g2o::EdgeSim3()