SVO全称是半直接视觉里程计(Fast Semi-Direct Monocular Visual Odometry).这里我对于半直接的理解是,通过对图像中提取的特征点图像块进行类似于直接法的匹配来计算相机位姿.
说到这里简单的说一下直接法:直接法相对于特征点法的区别在于:特征点法我们通过相邻的两帧图像之间进行特征提取,特征匹配,然后在已知相邻两帧图像中同一个特征的不同像素坐标的情况下,根据对极约束,可以求解出本质矩阵或者基础矩阵,从而求得两帧图像之间的位姿变换.特征点法中求解的最有位姿变换的依据是相邻两帧图像之间的重投影误差最小(也就是对应的像素坐标值之间差距最小).而在直接法中,基于灰度不变假设,也就是认为在同一个空间点的像素灰度值,在各个图像中是固定不变的.于是在直接法中,我们考虑已知某个空间点P和两个时刻的相机,P的世界坐标表示为**[X,Y,Z],它在相邻的两帧图像上对应的像素坐标为p1,p2**。我们要求解的是两帧图像之间的位姿变换,那么我们就要依据灰度不变假设,根据完整的投影方程: Zp=KP。其中,Z为P的深度,P为当前相机坐标系下的空间点,p为在当前帧中的像素坐标,K为相机的内参矩阵。由此我们可以获得p1=KP/Z
同理可以获得第二帧的对应关系p‘=KP’/Z‘,P’对应的是在第二帧的相机坐标系下的空间点的三维坐标,而且我们知道P和P’的关系为:P’=RP+t,即在当前帧相机坐标系下经过一个相机的位姿变换矩阵得到在第二帧的相机坐标系下的坐标。在直接法中,我们可以求出同一个世界坐标系下的一个点在相邻两帧图像上的像素坐标,我们基于灰度不变假设,通过最小化两个像素上的光度误差(通常对于两个像素坐标上的灰度值作差求取二范数),来求解最优的两帧之间的位姿变换R和t。
说了这么多,我们对于整个特征点法还有直接法有了一定的了解,接下来我们就开始详细的说一说SVO是如何将两者结合起来使用的吧。在SVO中首先给定一些约定条件如下:Ik表示第k帧图像,P表示三维坐标(x,y,z),对应的齐次像素坐标u=(u,v),三维空间点通过投影模型投影到对应图像平面上表示为:u=π(kP)
表示为第k帧的三维空间点投影为像素坐标。π为由相机的内参来决定。同样的给定像素坐标u,则对应的三维坐标点可以通过给定反向投影函数 π − 1 π^{-1} π−1和对应的深度 d u d_u du,则可以获得对应的反投影函数如下: k P = π − 1 ( u , d u ) kP=π^{-1}(u,d_u) kP=π−1(u,du).
其中 k P kP kP为第k帧图像的相机坐标系下的3D点的坐标,而且这里的深度我们是已知的(稍后会讲到)。
相机在时间戳k时刻的位置和旋转我们用刚体变换 T k , w ∈ S E ( 3 ) T_{k,w}\in SE(3) Tk,w∈SE(3)来表示,因此通过这个刚体变换矩阵,我们可以把世界坐标系下的3D点映射到相机坐标系下。公式如下: k P = T k , w ∗ w P kP=T_{k,w}*wP kP=Tk,w∗wP其中, k P kP kP为第k帧图像的相机坐标系下的3D点的坐标, w P wP wP为该3D点在世界坐标系下的坐标。因此相邻两帧图像之间的位姿变换矩阵可以表示为: T k , k − 1 = T k , w ∗ T k − 1 , w − 1 T_{k,k-1}=T_{k,w}*T^{-1}_{k-1,w}