slam特征点深度 svd_单目SLAM的本质矩阵与尺度

本文探讨了单目SLAM中从本质矩阵恢复运动与尺度的问题。本质矩阵计算后通过SVD得到四组解,通过旋转矩阵行列式筛选及路标点正深度比例选择正确解。尺度问题源于路标点深度不确定性,导致相机间平移缩放不一致。为统一尺度,可以使用PnP方法避免直接计算本质矩阵,通过至少6对匹配点求解相机位姿,防止尺度漂移。
摘要由CSDN通过智能技术生成

本文按照以下顺序讨论:从本质矩阵恢复运动与尺度问题的来源

进一步讨论尺度

1.从本质矩阵恢复运动与尺度问题的来源

equation?tex=x_1

equation?tex=x_2 是两帧之间的匹配像素点的归一化平面坐标,

equation?tex=E%3Dt%5E%7B%5Cland%7DR 是本质矩阵(Essential Matrix)。则有

equation?tex=x_2%5ETEx_1%3D0+%5Ctag%7B1%7D

将(1)展开得

equation?tex=%5Cbegin%7Bbmatrix%7D+x_2+%26+y_2+%26+1+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+E_%7B11%7D+%26+E_%7B12%7D+%26+E_%7B13%7D+%5C%5C+E_%7B21%7D+%26+E_%7B22%7D+%26+E_%7B23%7D+%5C%5C+E_%7B31%7D+%26+E_%7B32%7D+%26+E_%7B33%7D+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+x_1+%26+y_1+%26+1+%5Cend%7Bbmatrix%7D+%3D+0+%5Ctag%7B2%7D

将矩阵相乘的形式拆开得到

equation?tex=%5Cbegin%7Bbmatrix%7D+x_2x_1+%26+x_2y_1+%26+x_2+%26+y_2x_1+%26+y_2y_1+%26+y_2+%26+x_1+%26+y_1+%26+1+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+E_%7B11%7D+%5C%5C+E_%7B12%7D+%5C%5C+E_%7B13%7D+%5C%5C+%5Cvdots+%5C%5C++E_%7B33%7D+%5Cend%7Bbmatrix%7D+%3D+0+%5Ctag%7B3%7D

可以发现,对方程左边进行任意缩放都不会影响方程的解,这就是尺度问题的来由。所以

equation?tex=E 虽然有9个未知数,但是有一个变量可以看做是缩放因子,因此实际只有8个未知量(5个自由度),所以可以用八点法(五点不好算)构建方程组(4)来求解。

equation?tex=%5Cbegin%7Bbmatrix%7D+x_2%5E1x_1%5E1+%26+x_2%5E1y_1%5E1+%26+x_2%5E1+%26+y_2%5E1x_1%5E1+%26+y_2%5E1y_1%5E1+%26+y_2%5E1+%26+x_1%5E1+%26+y_1%5E1+%26+1+%5C%5C+x_2%5E2x_1%5E2+%26+x_2%5E2y_1%5E2+%26+x_2%5E2+%26+y_2%5E2x_1%5E2+%26+y_2%5E2y_1%5E2+%26+y_2%5E2+%26+x_1%5E2+%26+y_1%5E2+%26+1+%5C%5C+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26+%5Cvdots+%26%5Cvdots+%5C%5C+x_2%5E8x_1%5E8+%26+x_2%5E8y_1%5E8+%26+x_2%5E8+%26+y_2%5E8x_1%5E8+%26+y_2%5E8y_1%5E8+%26+y_2%5E8+%26+x_1%5E8+%26+y_1%5E8+%26+1+%5C%5C+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+E_%7B11%7D+%5C%5C+E_%7B12%7D+%5C%5C+E_%7B13%7D+%5C%5C+%5Cvdots+%5C%5C++E_%7B33%7D+%5Cend%7Bbmatrix%7D+%3D+0+%5Ctag%7B4%7D

求解完线性方程组(4)后,我们需要从

equation?tex=E 中恢复相机的运动

equation?tex=R

equation?tex=t 。这个过程可以用奇异值分解(SVD)完成。设

equation?tex=E+ 的SVD为

equation?tex=E%3DU%5CSigma+V%5ET+%5Ctag%7B5%7D

对于任意一个

equation?tex=E+ ,可以得到两个可能的

equation?tex=t

equation?tex=R 与之对应

equation?tex=%5Cbegin%7Balignat%7D%7B2%7D++t_1+%26%3D+u_3++%26%5Cquad+R_1+%26%3D+UWV%5ET+%5C%5C++t_2+%26%3D+-u_3++%26%5Cquad+R_2+%26%3D+UW%5ETV%5ET+%5Cend%7Balignat%7D+%5Ctag%7B6%7D

其中,

equation?tex=t%3D%5Cpm+u_3%3D%5Cpm+U%280%2C0%2C1%29%5ET 是U的最后一列,如果尺度不定时将模长归一化为1,即

equation?tex=+%5Cleft%5C%7C+t%5Cright%5C%7C%3D1 。而

equation?tex=W%3D%5Cbegin%7Bbmatrix%7D+0+%26+-1+%260%5C%5C+1+%26+0+%260%5C%5C+0+%26+0+%261+%5Cend%7Bbmatrix%7D 。图1 从本质矩阵恢复得到的四组解

这样一共会产生四组解(如图1所示),需要经过两步筛选得到正确解:

1.筛选旋转矩阵,剔除反射矩阵。

这一步可以计算分解得到的旋转矩阵的行列式实现,因为旋转矩阵的行列式为1,而反射矩阵的行列式为-1。

在ORB-SLAM实现如下:

R1 = u*W*vt;

if(cv::determinant(R1)<0)

R1=-R1;

R2 = u*W.t()*vt;

if(cv::determinant(R2)<0)

R2=-R2;

在VINS-Mono中实现如下:

/* VINS-Mono实现 */

//本质矩阵svd分解得到4组Rt解,这里的R是R_21 decomposeE(E, R1, R2, t1, t2);

// 旋转矩阵的行列式为1,反射矩阵行列式为-1 // 将E改成-E后,SVD分解得到的结果中,U=-U,其余两项不变 if (determinant(R1) + 1.0 < 1e-09)

{

E = -E;

decomposeE(E, R1, R2, t1, t2);

}

2.筛选出路标点在两个相机中都具有正深度的解。

在VINS-Mono中实现如下:

//通过三角化得到的正深度比例选择Rt解 double ratio1 = max(testTriangulation(ll, rr, R1, t1), testTriangulation(ll, rr, R1, t2));

double ratio2 = max(testTriangulation(ll, rr, R2, t1), testTriangulation(ll, rr, R2, t2));

cv::Mat_ ans_R_cv = ratio1 > ratio2 ? R1 : R2;

2.进一步讨论尺度

从(3)可知,尺度问题来源于单目SLAM中路标点的深度具有不确定性(所以才反投影到归一化平面上),也就是说尺度缩放实际作用的是两个相机之间的平移缩放。图2 深度不确定引起相机之间的平移缩放从图中也可以看出,由于尺度scale的关系,不同的t,决定了以后计算点P的深度也是不同的,所以恢复的物体深度也是跟尺度scale有关的,这就是论文中常说的结构恢复structure reconstruction,只是恢复了物体的结构框架,而不是实际意义的物体尺寸。并且要十分注意,每两对图像计算E并恢复R,T时,他们的尺度都不是一样的,本来是同一点,在不同尺寸下,深度不一样了,这时候地图map它最头痛了,所以这个尺度需要统一。

那怎么统一尺度呢?

思路1:缩放不同的尺度进行统一。

思路2:因为尺度不一致是计算本质矩阵

equation?tex=E 引起的,另一种常用的思路就是避开本质矩阵的计算。

思路1容易理解,但思路2具体怎么实现呢?这就涉及到PnP(Perspective-n-Point)方法。Pnp是求解3D-2D点对运动的方法。它描述了当知道n个3D空间点及其投影位置时,如何估计相机的位姿

考虑投影方程

equation?tex=s%5Cbegin%7Bbmatrix%7D+u+%5C%5C+v+%5C%5C+1+%5Cend%7Bbmatrix%7D+%3D+%5Cbegin%7Bbmatrix%7D+t_1+%26+t_2+%26+t_3+%26+t_4+%5C%5C+t_5+%26+t_6+%26+t_7+%26+t_8+%5C%5C+t_9+%26+t_%7B10%7D+%26+t_%7B11%7D+%26+t_%7B12%7D+%5C%5C+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+X+%5C%5C+Y+%5C%5C+Z+%5C%5C+1+%5Cend%7Bbmatrix%7D+%5Ctag%7B7%7D

可以用最后一行将尺度因子

equation?tex=s 消去,这也是后续尺度与初始尺度统一的原因。得到两个约束:

equation?tex=%5Cbegin%7Balignat%7D%7B2%7D+u+%26%3D+%5Cfrac%7Bt_1X%2Bt_2Y%2Bt_3Z%2Bt_4%7D%7Bt_9X%2Bt_%7B10%7DY%2Bt_%7B11%7DZ%2Bt_%7B12%7D%7D++%2C%26%5Cquad++v+%26%3D+%5Cfrac%7Bt_5X%2Bt_6Y%2Bt_7Z%2Bt_8%7D%7Bt_9X%2Bt_%7B10%7DY%2Bt_%7B11%7DZ%2Bt_%7B12%7D%7D++%5Cend%7Balignat%7D+%5Ctag%7B8%7D

为了简化表示,定义:

equation?tex=T_1%3D%5Cbegin%7Bbmatrix%7D+t_1+%26+t_2+%26+t_3+%26+t_4+%5C%5C+%5Cend%7Bbmatrix%7D%2C+T_2+%3D+%5Cbegin%7Bbmatrix%7D+t_5+%26+t_6+%26+t_7+%26+t_8++%5Cend%7Bbmatrix%7D%2C+T_3%3D%5Cbegin%7Bbmatrix%7D+t_9+%26+t_%7B10%7D+%26+t_%7B11%7D+%26+t_%7B12%7D+%5Cend%7Bbmatrix%7D%5C%5C

则有:

equation?tex=T_1%5ETP-T_3%5ETPu%3D0%5C%5C+T_2%5ETP-T_3%5ETPv%3D0%5C%5C

假设有N个特征点,则可以列出如下线性方程:

equation?tex=%5Cbegin%7Bbmatrix%7D+P_1%5ET+%260+%26-u_1P_1%5ET+%5C%5C+0+%26+P_1%5ET+%26+-v_1P_1%5ET+%5C%5C+%5Cvdots+%26+%5Cvdots+%26++%5Cvdots+%5C%5C+P_N%5ET+%260+%26-u_NP_N%5ET+%5C%5C+0+%26+P_N%5ET+%26+-v_NP_N%5ET+%5C%5C+%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D+T_1+%5C%5C+T_1+%5C%5C+T_3+%5Cend%7Bbmatrix%7D+%3D+0+%5Ctag%7B9%7D

equation?tex=T 一共12维,因此最少可以通过6对匹配点求解(9)。当匹配点大于6时,可以使用SVD等方法对超定方程求最小二乘解。

但由于匹配误差等原因,两帧之间的位姿变换总会出现误差,当这些误差积累之后,便产生了尺度漂移。

在ORB-SLAM中,作者就是使用了PnP方法求解后续帧的位姿变换。

参考^《视觉SLAM十四讲 从理论到实践》

^《Multiple View Geometry in Computer Vision.2nd Edition》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值