上一个博客中,我们介绍了一些关于slam的前端的设计思想的内容,这里我们继续完成slam的前后端的设计
首先我们给出slam程序中各模块的主要组成部分。
我们先理清楚到底他们干了些什么,然后再说他们怎么实现的。其实吧,现代的CPU对多线程的代码支持的越来越好,因为木法提速,只能多个人(CPU核)干。所以在PTAM把Tracking 和 Maping 分开完之后,大家一下子就觉得这样玩真的不错,一窝蜂都转成这种玩法。
所以按照国际惯例,我们还是把前后端分开处理,前端是一个跟踪器,后端干的事还挺多的,什么建图啊,BA,闭环啊,各种,看着都累。
跟踪器(定位的过程)
跟踪顾名思义就是上一帧里边的点我们特别关心他们现在在哪里,然后呢,怎么直到他们去哪里呢?我们在上一个博客中介绍了有两种方法,一种使用局部范围的直接搜索,另外只用是使用特征描述子进行匹配。匹配正确的点用来计算他们的几何关系,根绝几何关系可以恢复出相机的运动,进而重建出世界中的三维点。这样到来新的一帧之后我们都可以提取到一些新的三维点。另外我们可以对应三维点和图像中的点进行计算相机的姿态。这就是跟踪器的主要目的。
以上内容是假设更踪器在顺利跟踪的时候要干的事,那么问题来了,如果跟踪不顺利或者这就是第一帧那怎么办?
所以我们把跟踪分为三种状态,一种是第一帧,叫做初始状态,其实在单目中第二帧也属于这个状态,因为第一帧什么也干不了,就只能提特征,第二帧来了才有匹配等等。
如果如果跟踪失败,那么这个状态我们成为lost,然后对应的措施是relocalization。 我们看到的那篇posenet就是干这个的。
在跟踪中初始化的时候,计算匹配点的集合关系使用的是的一般是单应矩阵和基础矩阵。
在跟踪时候匹配当前帧和路标点,一个图像中的点,一个三维空间中的点,因此用的是PnP,优化Pose,路标点这里是假设为静止的,只有pose被优化。
那么优化完了,我们可以得到测量数据了,但是为了完成下一次的跟踪,我们还有一些工作要做。
1. update Local KeyFra