本篇文章将向大家介绍局部建图器的代码逻辑,局部建图器的类名为LocalMapping,在独立的背景线程中运行,和主线程的跟踪逻辑之间可以并发执行。局部建图器模块的主要作用是当前处理的关键帧及其邻近关键帧的位姿和地图点的联合优化。
LocalMapping的run函数为线程启动的函数,该函数在启动后一直循环运行,按顺序从现有的尚未处理的关键帧列表中依照时间先后顺序pop出关键帧进行处理(调用函数为ProcessNewKeyFrame),ProcessNewKeyFrame的处理逻辑大体为:1、从关键帧列表中按时间顺序pop出一帧关键帧进行处理;2、在先前已经进行ORB特征点和特征描述符的基础上计算BOW以用于后面的回环检测,检查和更新地图点的观测关系;3、通过调用UpdateConnections函数更新关键帧的共视图相关属性,如连接的共视帧及其共享地图点等信息,具体解释可以参考文献[1]中的详细介绍。以及在地图中插入关键帧。
MapPointCulling函数对最近加入的地图点(如通过立体视觉加入,或者最近在跟踪的过程中发现的新的地图点)执行地图点清除工作,将发现率较低的点,较长时间未被观测到的等一些质量较低的地图点清除,以保证地图点的质量。
CreateNewMapPoints的功能是:1、通过关键帧找到最佳的邻近的共视关键帧集合;2、当前关键帧和每一个邻近的共视关键帧中的关键点之间进行特征点匹配,并将匹配的但尚未分配地图点的特征点进行三角化测量算法求出新的地图点,并更新地图点和关键帧之间的关联关系等,最后将地图点加入到地图点集合变量mlpRecentAddedMapPoints中。
调用Optimizer::LocalBundleAdjustment进行局部线束调整优化,在优化时,以当前的关键帧及其共视的关键帧作为优化的范围,更新关键帧集合和地图点集合,并采用g2o的基于李代数的Levenberg-Marquardt 算法来联合优化多帧相机位姿和地图点坐标。
通过调用KeyFrameCulling进行冗余关键帧剔除操作,其粗略主线逻辑为:首先根据当前关键帧获取最佳共视邻近关键帧集合;然后对于集合里的每一个关键帧,统计其地图点的观测属性,如果发现超过一定量的地图点都被较多的重复观测到,则定义该关键帧为冗余关键帧,标记该关键帧为无效(SetBadFlag),减少地图中的关键帧数量,简化后续的优化过程。
接下来的步骤中需要判断是否有IMU支持,如果有IMU的场景下,则在系统启动时间(minit的变量)一定范围内对IMU启动两轮惯性标定优化,然后根据设定的时间窗口综合IMU的测量和关键帧数据(关键帧和地图点数据)对地图的尺度进行调整,确保地图的精度。
最后通过调用mpLoopCloser->InsertKeyFrame(mpCurrentKeyFrame)语句,将当前关键帧加入到闭环检测模块中。关于回环和合并检测,可以参考后续相关连载主题详细说明。
References
Leave a Reply