因子图结构
VIO在纯视觉的基础上添加了IMU约束,因子图如下:
状态变量
VIO中,待估计的状态变量为θi=(RWBi,WpBi,WvBi,big,bia)*注意不是TWC
观测量为zil∈Ci,表示第i帧看到的第j个路标点,输入(ωi~,ai~)∈Iij,第i、j准帧间惯导信息,其中(i,j)∈Kk,为关键帧的集合。
误差优化函数
θ∗=argθmink∑[Eproj(k,j)+EIMU(i,j)],k∈Kk包括重投影误差项及IMU误差项。
重投影误差项:Eproj(k,j)=ρ((xk−π(Xck))TΣk(xk−π(Xck)))π(Xc)=[fuZcXc+cufvZcYc+cv],Xc=[XcYcZc]TXc=TCWPW=(TWBTBC)TPW=TCBTWBTPW,TWBT=[RWBT0T−RWBTWpB1]Xck=RCBRWBT(XWk−WpBj)+cpBIMU误差EIMU(i,j)=ρ([eRevep]TΣI[eRevep])+ρ(ebTΣReb)eR=Log(ΔRijExp(JΔRgδbig)RBWiRWBj)ev=RBWi(WvBj−WvBi−gWΔtij)−(Δvij+JΔvgδbig+JΔvaδbia)ep=RBWi(WpBj−WpBi−WvBiΔtij−21gWΔtij2)−(Δpij+JΔpgδbig+JΔpaδbia)eb=[bjg−bigbja−bia]
图优化模型节点及边
在ORB-SLAM2中,图优化存在于三个线程:Tracking、Local Mapping、Loop Closing。分别处理局部共视区域中的非线性优化,地图更新时的优化、位姿图优化检测闭环。
Tracking

- 地图更新后第j个帧到达时(非关键帧),将其与最近的一个关键帧i建立联系,第i帧作为先验且固定,优化重投影及IMU误差估计第j帧状态
- 优化结束,将得到的第j帧状态变量及Hessian矩阵传递至下次优化作为先验
- 第j+1帧到达,使用第j帧的优化结果作为第j帧的初值和此次优化先验,联合优化第j、j+1帧,此时待优化的状态变量为θ=(RWBj,WpBj,WvBj,bjg,bja,RWBj+1,WpBj+1,WvBj+1,bj+1g,bj+1a),误差函数为θ∗=argminθ∑k[Eproj(k,j+1)+EIMU(j,j+1)+Eprior(j)],增加了先验误差项.Eprior(j)=ρ([eRevepeb]TΣp[eRevepeb])eR=Log(RˉWBjRWBj), ev=WvˉBj−WvBj, ep=WpˉBj−WpBj, eb=bˉj−bj带横线的为先验。
- 联合优化结束后,边缘化掉第j帧,重复步骤2、3,直到地图有更新(出现新的关键帧),重新执行1开始
该过程对应的图模型
一、LocalBAPRVIDP对应Tracking中的步骤一:
节点:
- 外点:vTcb 类型:VertexNavStatePR;ID:ExtrinsicVertexId = KeyFrame::nNextId*3 + MapPoint::nNextId + 1(每一个关键帧三个节点,每一个路标点一个节点,一个外部节点);固定不优化
- LocalKeyFrame帧节点pKF0:
1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;
2)V节点(速度)vNSV 类型:VertexNavStateV
3)Bias节点 vNSBias 类型:VertexNavStateBias
- FixedCameras 节点(固定)pKF1:
1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;对于常规的关键帧,只添加该节点。
2)对于划窗前最近的关键帧,添加V和Bias节点
V节点(速度)vNSV 类型:VertexNavStateV
Bias节点 vNSBias 类型:VertexNavStateBias
- MapPoint节点 vPoint:类型:VertexIDP
边:
- 名称:epvr:连接PR0, PR1, V0, V1, B0
类型:EdgeNavStatePRV
- 名称:ebias:连接B0,B1
类型:EdgeNavStateBias
- 名称: e:连接vPoint(idp),refPR,curPR,TcbPR
类型:EdgePRIDP
图模型:

二、GlobalBundleAdjustmentNavStatePRV
节点:
- PR节点(位姿)vNSPR 类型:VertexNavStatePR;
- V节点(速度)vNSV 类型:VertexNavStateV
- Bias节点 vNSBias 类型:VertexNavStateBias
- MapPoint节点 vPoint 类型:VertexSBAPointXYZ
边:
- 名称: epvr:连接PR0, PR1, V0, V1, B0
类型:EdgeNavStatePRV
- 名称: ebias:连接B0,B1
类型:EdgeNavStateBias
- 名称: e:连接vPoint,vPR
类型:EdgeNavStatePRPointXYZ
图模型:

三、LocalBundleAdjustmentNavStatePRV同上
四、GlobalBundleAdjustmentNavState
节点
- PVR节点 vNSPVR:类型:VertexNavStatePVR
- Bias节点 vBias: 类型:VertexNavStateBias
- MapPoint节点 vPoint :类型:VertexSBAPointXYZ
边
- 名称:epvr:连接PVR0,PVR1,B0
类型:EdgeNavStatePVR
- 名称: ebias:连接B0,B1
类型:EdgeNavStateBias
- 名称:e:连接vPoint,vNSPVR
类型:EdgeNavStatePVRPointXYZ
图模型

五、PoseOptimization对应Tracking中的步骤二、三:
节点
- PVR节点 vNSPVR/ vNSFPVRlast:类型:VertexNavStatePVR
- Bias节点 vNSFBias/ vNSFBiaslast: 类型:VertexNavStateBias
边
- 名称:eNSPrior:连接vNSFPVRlast,vNSFBiaslast先验误差
类型:EdgeNavStatePriorPVRBias
- 名称:eNSPVR:连接vNSFPVRlast,vNSPVR,vNSFBiaslast IMU误差
类型:EdgeNavStatePVR
- 名称:eNSBias:连接vNSFBiaslast,vNSFBias
类型:EdgeNavStateBias
- 名称: e:连接vNSFPVRlast;连接vNSFPVR
类型:EdgeNavStatePVRPointXYZOnlyPose
图模型

六、PoseOptimization
去掉了eNSPrior和只连接vPVRLast的边e
七、LocalBundleAdjustmentNavState同上相同?
八、OptimizeInitialGyroBias
该优化函数用于陀螺仪偏置初始化
节点
- GyrBias节点:vBiasg:类型VertexGyrBias
边
- 名称:eBiasg:连接vBiasg陀螺仪偏置一元边
类型:EdgeGyrBias
九、LocalBundleAdjustment
节点
- 位姿节点:vSE3:类型VertexSE3Expmap
- MapPoint节点: vPoint:类型VertexSBAPointXYZ
边
- 名称:e:连接vSE3,vPoint
类型:EdgeStereoSE3ProjectXYZ
图模型
