Friday 25 December 2015

一步步学习Visual odometry - Part1

在单目VO中,相机的运动和场景的3D结构都要从2D图像中获取。因为不知道绝对的距离,初始的两个相机之间的距离通常设为1.每当得到一个新的图像,相对的尺度和相机运动由已知的3D结构或者trifocal tensor得到。根据wiki,tensor是一个3x3x3的矩阵。trifocal tensor就是描述三帧之间关系的矩阵。

单目VO主要分为三类,基于特征点的方法,appearance based,和两者的混合。Nister第一次使用了VO这个词。跟之前方法不同的是,他们不是跟踪特征点,而是在每一帧里面单独检测Harris角点,然后进行匹配,这样就避免了跟踪过程中特征点的漂移。他们也不是用3D对3D的匹配,而是3D对2D的匹配,而且使用了5点算法和ransac去除outlier。还有一个是Milford提出的RatSLAM,用场景的中心做template tracking。

为了减小叠加相机姿态造成的轨迹漂移,通常在最近的m帧使用bundle adjustment优化,这个过程叫windowed BA。

在计算相机运动的时候,通过匹配特征点可以找到两帧之间的E矩阵。8点算法要求3D点不能都共面,而5点算法没有这个限制,它只需要相机标定。这里提到了Opencv中的findFundamentalMat使用了8点算法因此不是特别稳定,推荐使用5点算法。在该函数中有两个地方可以调整,一个是epipolar line的距离,一个是confidence level。根据这里,距离的设定是0.006 * maxVal。

在分解E矩阵的时候,可以得到四个可能的R,t。通过三角定位判断所有点是不是都在相机的前面,我们可以得到唯一解。这个解作为初始值再进行优化得到正确的R,t值。优化的过程就是减小反投影残差。

初始的两帧的运动确定之后,后续的尺度要以此为依据。前两帧的3D点对和对应的新的3D点对之间距离的比值就是尺度的比值。为了得到更准确的值,我们可以计算许多点的平均值或者中值。相应的,位移t也根据这个尺度调整。这里的特征点至少要在三帧中被跟踪和匹配。另外一种方法是用三帧之中特征点的trifocal constraint来计算尺度,不需要三角定位。




No comments:

Post a Comment