ORBSLAM2系列-重定位中求解位姿R,t

重定位中对于位姿的求解使用了EPnP算法和ICP算法,其中EPnP算法用于将匹配点对的2D坐标转化为3D坐标(相机坐标系),然后ICP算法使用3D坐标(世界坐标系)和3D坐标(相机坐标系)求解位姿R,t。在求解的过程中,使用RANSAC策略,用于判断求解的该位姿是否合格

EPnP算法

EPnP算法流程

在视觉slam十四讲中描述过PnP算法是解决3D-2D的位姿运动问题,我在查找资料过程中发现计算机视觉life的资料很好,非常明了的讲解了EPnP算法,在这里将整个算法讲解copy到这里,方便查看:

如有涉及侵权,望告知,可删除

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

简单梳理流程

EPnP算法最终要得到什么:并不是直接得到了位姿,而是得到了地图点在当前相机坐标系下的坐标,然后根据世界坐标和相机坐标,通过ICP算法,就求解了位姿,因此在EPnP算法中最主要求得的就是 p i c p_i^c pic ,而 p i c p_i^c pic 是由4个控制点的相机坐标对应的权重(不同坐标系下权重是相同的)合成的,那么算法的主要流程就是在求这两个东西:

  • 1.根据数据点对,求得4个控制点的世界坐标 c 1 w , c 2 w , c 3 w , c 4 w c_1^w,c_2^w,c_3^w,c_4^w c1w,c2w,c3w,c4w
  • 2.根据4个控制点的世界坐标和地图点的世界坐标,求得对应的权重 α i 1 , α i 2 , α i 3 , α i 4 \alpha_{i1},\alpha_{i2},\alpha_{i3},\alpha_{i4} αi1,αi2,αi3,αi4
  • 3.权重已经求得,就差控制点的相机坐标。根据相机成像原理,列出了矩阵 M x = 0 Mx=0 Mx=0 而其中 x x x 中的量就是4个控制点的相机坐标
  • 4.求解矩阵,就是 x = ∑ i = 1 n β i v i x=\sum_{i=1}^n \beta_iv_i x=i=1nβivi ,就引出了 β , v \beta,v β,v 分别代表这 M T M M^TM MTM 的特征值和特征向量(特征值为0时)
  • 5.由此引出了 N = 1 , 2 , 3 , 4 N=1,2,3,4 N=1,2,3,4 的情况,对不同情况分别使用刚体不变形(空间中任意两点距离不受坐标系的变化而变化),求解了不同情况下的 β , v \beta,v β,v
  • 6.得到了 β , v \beta,v β,v 就能得到 x x x ,也就是4个控制点的相机坐标,加上权重系数,就得到了地图点的相机坐标 p i c p_i^c pic

EPnP算法的流程就是要得到了地图点的相机坐标,再加上地图点的世界坐标,就可以使用下面的ICP算法求解位姿

ICP算法

在视觉slam十四讲中描述过ICP是解决3D-3D的位姿估计问题,那么这个3D分别指的就是一个空间地图点的世界坐标系中坐标和相机坐标系中坐标,由此,也表明了ICP算法的输入和输出:

  • 已知:某空间点的3D世界坐标 p i ′ p_i' pi(可以上一帧求解)和其对应的相机坐标 p i p_i pi(匹配后的当前帧相机坐标,一般都是经过EPnP才有的相机坐标)
  • 已知:相机内参矩阵 K K K
  • 未知:位姿 R , t R,t R,t

ICP算法流程

根据上面的已知和未知条件,这就是一个欧式变换问题: p i = R p i ′ + t p_i=Rp_i'+t pi=Rpi+t ,由此可以构建一个最小二乘问题:

min ⁡ R , t 1 2 ∑ i = 1 n ∣ ∣ ( p i − ( R p i ′ + t ) ) ∣ ∣ 2 2 \min \limits_{R,t}\frac{1}{2} \mathop{\sum}\limits_{i=1}^n ||(p_i-(Rp_i'+t))||_2^2 R,tmin21i=1n∣∣(pi(Rpi+t))22

下面就是求解这个最小二乘问题的流程:

  • 1.分别求世界坐标和相机坐标的质心(质心没有下标)

p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) p=\frac{1}{n} \sum_{i=1}^n(p_i), \quad p'=\frac{1}{n} \sum_{i=1}^n(p_i') p=n1i=1n(pi),p=n1i=1n(pi)

  • 2.对最小二乘问题进行适当处理:

1 2 ∑ i = 1 n ∣ ∣ ( p i − ( R p i ′ + t ) ) ∣ ∣ 2 2 = 1 2 ∑ i = 1 n ∣ ∣ p i − R p i ′ − t − p + R p ′ + p − R p ′ ∣ ∣ 2 = 1 2 ∑ i = 1 n ∣ ∣ ( p i − p − R ( p i ′ − p ′ ) ) + ( p − R p ′ − t ) ∣ ∣ 2 = 1 2 ∑ i = 1 n ( ∣ ∣ p i − p − R ( p i ′ − p ′ ) ∣ ∣ 2 + ∣ ∣ p − R p ′ − t ∣ ∣ 2 + 2 ( p i − p − R ( p i ′ − p ′ ) ) T ( p − R p ′ − t ) ) \begin{align} \frac{1}{2} \mathop{\sum}\limits_{i=1}^n ||(p_i-(Rp_i'+t))||_2^2 &= \frac{1}{2} \sum_{i=1}^n ||p_i-Rp_i'-t-p+Rp'+p-Rp'||^2 \\ &= \frac{1}{2} \sum_{i=1}^n ||(p_i-p-R(p_i'-p'))+(p-Rp'-t)||^2 \\ &= \frac{1}{2} \sum_{i=1}^n (||p_i-p-R(p_i'-p')||^2+||p-Rp'-t||^2 + 2(p_i-p-R(p_i'-p'))^T(p-Rp'-t)) \end{align} 21i=1n∣∣(pi(Rpi+t))22=21i=1n∣∣piRpitp+Rp+pRp2=21i=1n∣∣(pipR(pip))+(pRpt)2=21i=1n(∣∣pipR(pip)2+∣∣pRpt2+2(pipR(pip))T(pRpt))

  • 3.上面式子中最后一项在求和之后为0,因此只剩下前两项,而这两项都与质心有关:设 q i = p i − p    ,    q i ′ = p i ′ − p ′ q_i=p_i-p \;,\; q_i'=p_i'-p' qi=pip,qi=pip 上面式子就转化如下并展开范数计算:

a r g min ⁡ R 1 2 ∑ i = 1 n ∣ ∣ q i − R q i ′ ∣ ∣ 2 = 1 2 ∑ i = 1 n ( q i T q i + q i ′ T R T T q i ′ − 2 q i T R q i ′ ) arg\min_{R} \frac{1}{2} \sum_{i=1}^n ||q_i-Rq_i'||^2 = \frac{1}{2} \sum_{i=1}^n (q_i^Tq_i+q_i'^TR^TTq_i'-2q_i^TRq_i') argRmin21i=1n∣∣qiRqi2=21i=1n(qiTqi+qiTRTTqi2qiTRqi)

  • 4.上面式子中,第一项与 R R R 无关,第二项由于 R t R = I R^tR=I RtR=I 也与 R R R 无关,因此这个优化函数变为:
    • 迹的相关性质(迹是对角线之和):
    • 二次型的迹: x T A x = t r ( x T A x ) = t r ( A x x T ) = t r ( x x T A ) x^TAx=tr(x^TAx)=tr(Axx^T)=tr(xx^TA) xTAx=tr(xTAx)=tr(AxxT)=tr(xxTA)
    • 矩阵相乘的迹: t r ( A B ) = t r ( B A ) tr(AB)=tr(BA) tr(AB)=tr(BA)
    • 常数的迹依然是常数

min ⁡ R ∑ i = 1 n − q i T R q i ′ = min ⁡ R ∑ i = 1 n − t r ( R q i ′ q i T ) = min ⁡ R − t r ( R ∑ i = 1 n q i ′ q i T ) 即: max ⁡ R t r ( R W ) 设 W = ∑ i = 1 n q i ′ q i T \min_{R} \sum_{i=1}^n -q_i^TRq_i' =\min_{R} \sum_{i=1}^n -tr(Rq_i'q_i^T) = \min_{R}-tr(R\sum_{i=1}^n q_i'q_i^T) \\ 即:\max_R tr(RW) \quad 设W=\sum_{i=1}^n q_i'q_i^T Rmini=1nqiTRqi=Rmini=1ntr(RqiqiT)=Rmintr(Ri=1nqiqiT)即:Rmaxtr(RW)W=i=1nqiqiT

  • 5.经过迹的相关性质,就变为求解 t r ( R W ) tr(RW) tr(RW) 最大时的 R R R 。对 W W W 进行SVD分解: W = U Σ V T W=U\Sigma V^T W=UΣVT

t r ( R W ) = t r ( R U Σ V T ) = t r ( Σ V T R U ) tr(RW)=tr(RU\Sigma V^T)=tr(\Sigma V^T R U) tr(RW)=tr(RUΣVT)=tr(ΣVTRU)

  • 6.设其中 M = V T R U M=V^TRU M=VTRU ,因为等式右边全是正交矩阵,因此 M M M 也是正交矩阵,因此满足 ∣ m i j ∣ ≤ 1 |m_{ij}| \le1 mij1
    • 正交矩阵性质:正交矩阵每个元素绝对值都小于等于1,如果有一个元素为1,那么这个元素所在的行列的其余元素一定都为零。

设: t r ( Σ M ) = t r ( ( σ 1 σ 2 . . . σ i ) ( m 11 m 12 . . . m 1 i m 21 m 22 . . . m 2 i . . . . . . . . . . . . m i 1 m i 2 . . . m i i ) ) = ∑ i − 1 n σ i m i i ≤ ∑ i = 1 n σ i 设:tr(\Sigma M)=tr( \begin{pmatrix} \sigma_1 & & &\\ & \sigma_2 & &\\ & & ... & \\ & & & \sigma_i \end{pmatrix} \begin{pmatrix} m_{11} & m_{12} & ... & m_{1i}\\ m_{21} & m_{22} & ... & m_{2i}\\ ... & ... & ...& ...\\ m_{i1} & m_{i2} & ... & m{ii} \end{pmatrix} )= \sum_{i-1}^n \sigma_im_{ii} \le \sum_{i=1}^n \sigma_i 设:tr(ΣM)=tr( σ1σ2...σi m11m21...mi1m12m22...mi2............m1im2i...mii )=i1nσimiii=1nσi

  • 7.需注意的是上面要求的是 t r ( Σ M ) tr(\Sigma M) tr(ΣM) 的最大值,也就意味着只有当 m i i m_{ii} mii 最大时成立,即 m i i = 1 m_{ii}=1 mii=1 M M M 正交,那么 M = E M=E M=E 得到了 R R R ,对于 t t t ,只需要让之前的一个式子为0可求得:

根据: E = M = V T R U ⇒ R = U V T 根据: p − R p ′ − t = 0 ⇒ t = p − R p ′ 根据:E=M=V^TRU \quad \Rightarrow \quad R = UV^T\\ 根据:p-Rp'-t=0 \quad \Rightarrow \quad t=p-Rp' 根据:E=M=VTRUR=UVT根据:pRpt=0t=pRp

ORBSLAM2中使用

ORBSLAM2中的使用其实就是上面的算法流程,下面是参考计算机视觉life的内容,比较精简:

在这里插入图片描述

RANSAC策略

在初始化求解基础矩阵F或者单应矩阵H时使用过RANSAC策略,那时候表明过:RANSAC(Random Sample Consensus)随机采样一致性是从一组含有外点的数据集中,通过迭代的方式估计出符合该数据集的数学模型的参数。因此,它也可以用来检测出数据集中的外点。总体思想就是通过数据集中的一部分点建立符合内点的数学模型,然后计算其他点与该模型之间的距离,超过阈值就认为是外点,重复迭代k次取内点多的那一次结果。

在初始化时使用了误差分数对结果进行筛选,而在重定位中,是迭代多次选取内点数量多的那一次结果(就如上面说的),而这个判断该点是否为外点,就是使用的重投影误差,将3D点投影到当前帧图像上,计算其与匹配的2D点坐标的最小二乘误差,具体流程如下:

  • 1.从匹配的3D-2D点对中随机找4个对,作为计算位姿使用的输入
  • 2.使用随机的4个点对经过EPnP算法和ICP算法,计算位姿R,t
  • 3.使用计算得到的位姿,对每个点对(整个匹配点对)计算其是否为外点:根据重投影误差是否超过阈值判断
  • 4.循环多次上面的过程(迭代多次),当计算的当前位姿的内点数量大于阈值,就进行精确求解:
    • 4-1.使用内点经过EPnP算法和ICP算法,计算位姿R,t(不是4个点了)
    • 4-2.使用计算得到的位姿,对每个点对计算其是否为外点(看看精确位姿是否有外点变为内点):根据重投影误差是否超过阈值判断
    • 4-3.如果精确位姿的内点数量足够,就返回这个位姿,否则退出来这个精确求解,继续进行粗糙求解
  • 5.如果有精确位姿并且内点数量足够,就直接返回位姿,就结束了重定位的位姿求解过程;如果精确求解后没有达到要求的内点数量,就选择一个差不多的位姿返回(但是也要大于最小的内点数量阈值)

总结

在重定位中求解位姿的具体函数在代码中详细的注释,就不再一一列举,因为整个过程就如上面所介绍的算法流程一样,一一对比就能看明白。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值