视觉SLAM-7-2

第七章 视觉里程计

三 3D-2D: PnP

在之前建图的基础上,已知了3D点的空间位置信息,和点投影到图像上的信息,求相机的旋转和平移。

1. DLT 直接线性变换

已知空间点P和投影点x:(其中[R|t]是3×4的增广矩阵,在这里省略了相机内参K,因为K是已知的,所以没有带入)
P = ( X , Y , Z , 1 ) T x = ( u , v , 1 ) s x = [ R ∣ t ] P P=(X,Y,Z,1)^T\\ x=(u,v,1)\\ sx=[R|t]P P=(X,Y,Z,1)Tx=(u,v,1)sx=[Rt]P
展开得到:

在这里插入图片描述

用最后一行消掉s,得到:
在这里插入图片描述

其中:
t 1 T = ( t 1 , t 2 , t 3 , t 4 ) , t 2 T = ( t 5 , t 6 , t 7 , t 8 ) , t 3 T = ( t 9 , t 10 , t 11 , t 12 ) \pmb{t_1}^T=(t_1,t_2,t_3,t_4),\pmb{t_2}^T=(t_5,t_6,t_7,t_8),\pmb{t_3}^T=(t_9,t_{10},t_{11},t_{12}) t1t1t1T=(t1,t2,t3,t4),t2t2t2T=(t5,t6,t7,t8),t3t3t3T=(t9,t10,t11,t12)
因为一共12个未知数,一对点可以有两个方程,所以需要6对点。给的点多于6对时,求最小二乘解。得到[R|t]后用QR分解投影到SO(3),然后得到R和t。

2. P3P

利用3对点求解和t,下图中是相机成像的,存在很多的相似三角形。
在这里插入图片描述

看三角形OAB得到:(余弦定理)
O A 2 + O B 2 − 2 O A ∗ O B ∗ c o s ( ∠ A O B ) = A B 2 三 角 形 A O C : O A 2 + O C 2 − 2 O A ∗ O C ∗ c o s ( ∠ A O C ) = A C 2 三 角 形 B O C : O B 2 + O C 2 − 2 O B ∗ O C ∗ c o s ( ∠ B O C ) = B C 2 OA^2+OB^2-2OA*OB*cos(\angle AOB)=AB^2\\ 三角形AOC: OA^2+OC^2-2OA*OC*cos(\angle AOC)=AC^2\\ 三角形BOC: OB^2+OC^2-2OB*OC*cos(\angle BOC)=BC^2 OA2+OB22OAOBcos(AOB)=AB2AOCOA2+OC22OAOCcos(AOC)=AC2BOCOB2+OC22OBOCcos(BOC)=BC2
上式全部除以 OC^2,记x=OA/OC,y=OB/OC,得到:
x 2 + y 2 − 2 x y ∗ c o s ( ∠ A O B ) = A B 2 / O C 2 x 2 + 1 − 2 x ∗ c o s ( ∠ A O C ) = A C 2 / O C 2 y 2 + 1 − 2 y ∗ c o s ( ∠ B O C ) = B C 2 / O C 2 x^2+y^2-2xy*cos(\angle AOB)=AB^2/OC^2\\ x^2+1-2x*cos(\angle AOC)=AC^2/OC^2\\ y^2+1-2y*cos(\angle BOC)=BC^2/OC^2 x2+y22xycos(AOB)=AB2/OC2x2+12xcos(AOC)=AC2/OC2y2+12ycos(BOC)=BC2/OC2
然后:
v = A B 2 / O C 2 , u = B C 2 / A B 2 , w = A C 2 / A B 2 u v = B C 2 / O C 2 , w v = A C 2 / O C 2 v=AB^2/OC^2,\quad u=BC^2/AB^2,\quad w=AC^2/AB^2\\ uv=BC^2/OC^2,\quad wv=AC^2/OC^2 v=AB2/OC2,u=BC2/AB2,w=AC2/AB2uv=BC2/OC2,wv=AC2/OC2
所以得到:
x 2 + y 2 − 2 x y ∗ c o s ( ∠ A O B ) = v x 2 + 1 − 2 x ∗ c o s ( ∠ A O C ) = w v y 2 + 1 − 2 y ∗ c o s ( ∠ B O C ) = u v x^2+y^2-2xy*cos(\angle AOB)=v\\ x^2+1-2x*cos(\angle AOC)=wv\\ y^2+1-2y*cos(\angle BOC)=uv x2+y22xycos(AOB)=vx2+12xcos(AOC)=wvy2+12ycos(BOC)=uv
消掉v得到:
( 1 − u ) y 2 − u x 2 − 2 y ∗ c o s ( ∠ B O C ) + 2 u x y ∗ c o s ( ∠ A O B ) + 1 = 0 ( 1 − w ) x 2 − w y 2 − 2 x ∗ c o s ( ∠ A O C ) + 2 w x y ∗ c o s ( ∠ A O B ) + 1 = 0 (1-u)y^2-ux^2-2y*cos(\angle BOC)+2uxy*cos(\angle AOB)+1=0\\ (1-w)x^2-wy^2-2x*cos(\angle AOC)+2wxy*cos(\angle AOB)+1=0 (1u)y2ux22ycos(BOC)+2uxycos(AOB)+1=0(1w)x2wy22xcos(AOC)+2wxycos(AOB)+1=0
由于知道2D点图像位置,三个余弦角可以得到,同时w,u也是可以得到的,所以可以求得x,y值。从而得到ABC在相机坐标系下的3D坐标,然后根据3D-3D的点对,计算相机运动的R,t。

3. Bundle Adjustment

优化解法,最小化重投影误差,投影关系为:
s i u i = K e x p ( ξ ∧ ) P i 所 以 : u i = 1 s i K e x p ( ξ ∧ ) P i s_iu_i = K exp(\xi^{\wedge})P_i\\ 所以: u_i = \frac{1}{s_i} K exp(\xi^{\wedge})P_i siui=Kexp(ξ)Pi:ui=si1Kexp(ξ)Pi
u的真实值和计算值存在误差,要求出使该误差最小的T,就是相机的平移和旋转。
ξ ∗ = a r g m i n ξ 1 2 ∑ i = 1 n ∣ ∣ u i − 1 s i K e x p ( ξ ∧ ) P i ∣ ∣ 2 2 令 : e i = u i − 1 s i K e x p ( ξ ∧ ) P i \xi ^*=argmin_{\xi}\frac{1}{2}\sum^n_{i=1}{||u_i-\frac{1}{s_i} K exp(\xi^{\wedge})P_i||^2_2}\\ 令:e_i=u_i-\frac{1}{s_i} K exp(\xi^{\wedge})P_i ξ=argminξ21i=1nuisi1Kexp(ξ)Pi22ei=uisi1Kexp(ξ)Pi
对于优化这个目标函数,用的是李代数扰动(因为不方便直接对位姿求导为0),所以是对扰动的小量求导,也就是:
在这里插入图片描述

第一项为:
假 设 : P ′ = ( e x p ( ξ ∧ ) P ) 1 : 3 = [ X ′ , Y ′ , Z ′ ] 所 以 : s u = K P ′ 变 为 : [ s u s v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X ′ Y ′ Z ′ ] 假设:P'=(exp(\xi^{\wedge})P)_{1:3}=[X',Y',Z']\\ 所以:su=KP'变为: \\\left[ \begin{matrix} su\\sv\\1 \end{matrix} \right]= \left[ \begin{matrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} X'\\Y'\\Z' \end{matrix} \right] P=(exp(ξ)P)1:3=[X,Y,Z]su=KPsusv1=fx000fy0cxcy1XYZ

化简得到:(用第三行消掉s)
u = f x X " Z " + c x , v = f y Y " Z " + c y u=f_x\frac{X^"}{Z^"}+c_x,\quad v=f_y\frac{Y^"}{Z^"}+c_y u=fxZ"X"+cx,v=fyZ"Y"+cy
所以得到导数为:

在这里插入图片描述

第二项为:在第四章中可以知道扰动模型的导数为:
ð ( T P ) ð δ ξ = [ I − P ′ ∧ 0 T 0 T ] ≜ ( T p ) ⊙ \frac{\eth(TP)}{\eth\delta\xi}= \left[ \begin{matrix} I & -P'^{\wedge}\\ 0^T & 0^T \end{matrix} \right ]\triangleq(Tp)^{\odot} ðδξð(TP)=[I0TP0T](Tp)
所以非其次的形式为:(3×6的矩阵)
ð ( P ′ ) ð δ ξ = [ I − P ′ ∧ ] \frac{\eth(P')}{\eth\delta\xi}= \left[ \begin{matrix} I & -P'^{\wedge} \end{matrix} \right] ðδξð(P)=[IP]
两项的乘积为:
在这里插入图片描述

为优化提供了方向。不仅可以优化相机位移和旋转,还可以优化3D点位置,关于3D点位置的导数为:
ð e ð P = ð e ð P ′ ∗ R \frac{\eth e}{\eth P}=\frac{\eth e}{\eth P'}*R ðPðe=ðPðeR
代码 pose_estimation_3d2d.cpp

四 3D-3D ICP

1. 用SVD解法:

给配对好的两组3D点,求其旋转和平移。可以用迭代最近点(ICP)求解。设:
P = { p 1 , . . . , p n } , P ′ = { p 1 ′ , . . . , p n ′ } ∀ i , p i = R p i ′ + t P=\{p_1,...,p_n\},P'=\{p'_1,...,p'_n\} \\ \forall i,p_i=Rp'_i+t P={p1,...,pn},P={p1,...,pn}i,pi=Rpi+t
pi的真实值与计算值之间存在误差:
e i = p i − ( R p i ′ + t ) e_i=p_i-(Rp'_i+t) ei=pi(Rpi+t)
所以就可以定义为最小二乘问题:
min ⁡ R , t J = 1 2 ∑ i = 1 n ∣ ∣ ( p i − ( R p i ′ + t ) ) ∣ ∣ 2 2 \min_{R,t}J=\frac{1}{2}\sum_{i=1}^{n}{||(p_i-(Rp'_i+t))||_2^2} R,tminJ=21i=1n(pi(Rpi+t))22
定义质心为:
在这里插入图片描述

得到:

在这里插入图片描述

其中交叉项 (pi - p - R ( pi’ - p’ ) ) 为0,因为 pi 和 p 的相对位置与 pi‘ 和 p’ 的相对位置大小是相同的,在乘上R之后,就是一样的向量,所以做差为0。所以优化目标函数可以简化为:
min ⁡ R , t J = 1 2 ∑ i = 1 n ∣ ∣ p i − p − R ( p i ′ − p ′ ) ∣ ∣ 2 + ∣ ∣ p − R p ′ − t ∣ ∣ 2 \min_{R,t}J=\frac{1}{2}\sum_{i=1}^{n}{||p_i-p-R(p_i'-p')||^2+||p-Rp'-t||^2} R,tminJ=21i=1npipR(pip)2+pRpt2
前面一项只和R有关,所以使前面一项最小得到R,然后取t使得后一项为0

如何求前面一项最小呢,分为这么几步:

定义去质心坐标:
q i = p i − p , q i ′ = p i ′ − p ′ q_i=p_i-p,\quad q'_i=p'_i-p' qi=pip,qi=pip
所以变为最小化:
R ∗ = a r g min ⁡ R 1 2 ∑ i = 1 n ∣ ∣ q i − R q i ′ ∣ ∣ 2 R^*=arg\min_R \frac{1}{2}\sum_{i=1}^{n}{||q_i-Rq'_i||^2} R=argRmin21i=1nqiRqi2
在这里插入图片描述

因为R^T * R 等于 I ,所以前两项都和R 没有关系,所以实际上优化目标函数变为:

在这里插入图片描述

然后:

在这里插入图片描述

将第二项变为0,可以得到如下公式,求出t:
t = p − R p ′ t=p-Rp' t=pRp

2. 非线性优化

非线性优化的思想是用迭代的方式去寻找最优值。当以李代数表达位姿时,目标函数改写为:
min ⁡ ξ = 1 2 ∑ i = 1 n ‖ ( p i − e x p ( ξ ∧ ) p ′ i ) ‖ 2 2 \min_ξ=\frac{1}{2}\sum_{i=1}^{n}{‖(p_i−exp(ξ^{\wedge})p′_i)‖_2^2} ξmin=21i=1n(piexp(ξ)pi)22
它关于位姿导数已推导过,使用李代数扰动模型:
∂ e ∂ δ ξ = − ( e x p ( ξ ∧ ) ∗ p i ′ ) ⊙ \frac{∂e}{∂δξ}=−(exp(ξ^∧)*p'_i)^{\odot} δξe=(exp(ξ)pi)

  • ICP问题存在唯一解和无穷多解的情况
  • 若存在唯一解,极小值点即为全局最优解
  • 在匹配已知的情况下,最小二乘实际上具有解析解,没有必要用迭代优化
  • 可以混合使用PnP和ICP优化
    • 深度值已知的点,用建模它们的3D-3D误差
    • 深度值未知的点,用建模3D-2D的重投影误差

代码:pose_estimation_3d3d.cpp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值