《视觉SLAM十四讲》-- 视觉里程计 1(下)

6.4.1 直接线性变换(DLT)

已知空间中某点 P = [ X , Y , Z , 1 ] T \boldsymbol{P}=[X, Y, Z, 1]^T P=[X,Y,Z,1]T,在图像中的归一化坐标 [ u , v , 1 ] T [u, v, 1]^T [u,v,1]T,求解相机运动 R \boldsymbol{R} R t \boldsymbol{t} t。定义增广矩阵 [ R ∣ t ] [\boldsymbol{R}|\boldsymbol{t}] [Rt] 为一个 3 × 4 3\times4 3×4 矩阵,包含了旋转和平移信息(区别于变换矩阵)。满足

s [ u 1 v 1 1 ] = [ t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ] [ X Y Z 1 ] (6-25) s\left[\begin{array}{l} u_{1} \\ v_{1} \\ 1 \end{array}\right]=\left[\begin{array}{llll} t_{1} & t_{2} & t_{3} & t_{4} \\ t_{5} & t_{6} & t_{7} & t_{8} \\ t_{9} & t_{10} & t_{11} & t_{12} \end{array}\right]\left[\begin{array}{l} X \\ Y \\ Z \\ 1 \end{array}\right] \tag{6-25} s u1v11 = t1t5t9t2t6t10t3t7t11t4t8t12 XYZ1 (6-25)

用最后一行消去 s s s,得到

u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 u_1=\frac{t_1X+t_2Y+t_3Z+t_4}{t_9X+t_{10}Y+t_{11}Z+t_{12}} u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4
v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 (6-26) v_1=\frac{t_5X+t_6Y+t_7Z+t_8}{t_9X+t_{10}Y+t_{11}Z+t_{12}} \tag{6-26} v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8(6-26)

为简化表示,定义

t 1 = [ t 1 , t 2 , t 3 , t 4 ] T , t 2 = [ t 5 , t 6 , t 7 , t 8 ] T , t 3 = [ t 9 , t 10 , t 11 , t 12 ] T \boldsymbol{t_1}=[t_1,t_2, t_3, t_4]^T ,\quad \boldsymbol{t_2}=[t_5,t_6, t_7, t_8]^T ,\quad \boldsymbol{t_3}=[t_9,t_{10}, t_{11}, t_{12}]^T t1=[t1,t2,t3,t4]T,t2=[t5,t6,t7,t8]T,t3=[t9,t10,t11,t12]T

代入式(6-26),得

t 1 T P − t 3 T P u 1 = 0 \boldsymbol{t_1^T}\boldsymbol{P}-\boldsymbol{t_3^T}\boldsymbol{P}u_1=0 t1TPt3TPu1=0
t 2 T P − t 3 T P v 1 = 0 (6-27) \boldsymbol{t_2^T}\boldsymbol{P}-\boldsymbol{t_3^T}\boldsymbol{P}v_1=0 \tag{6-27} t2TPt3TPv1=0(6-27)

每对特征点提供了 2 个约束,故至少需要 6 对特征点,可得到以下线性方程组(相当于取转置):

( P 1 T 0 − u 1 P 1 T 0 P 1 T − v 1 P 1 T ⋮ ⋮ ⋮ P N T 0 − u N P N T 0 P N T − v N P N T ) ( t 1 t 2 t 3 ) = 0 (6-28) \left(\begin{array}{ccc} \boldsymbol{P}_{1}^{\mathrm{T}} & 0 & -u_{1} \boldsymbol{P}_{1}^{\mathrm{T}} \\ 0 & \boldsymbol{P}_{1}^{\mathrm{T}} & -v_{1} \boldsymbol{P}_{1}^{\mathrm{T}} \\ \vdots & \vdots & \vdots \\ \boldsymbol{P}_{N}^{\mathrm{T}} & 0 & -u_{N} \boldsymbol{P}_{N}^{\mathrm{T}} \\ 0 & \boldsymbol{P}_{N}^{\mathrm{T}} & -v_{N} \boldsymbol{P}_{N}^{\mathrm{T}} \end{array}\right)\left(\begin{array}{l} \boldsymbol{t}_{1} \\ \boldsymbol{t}_{2} \\ \boldsymbol{t}_{3} \end{array}\right)=0 \tag{6-28} P1T0PNT00P1T0PNTu1P1Tv1P1TuNPNTvNPNT t1t2t3 =0(6-28)

当匹配点大于 6 对时,可用 SVD 等方法对超定方程求最小二乘解。

注意,这里我们直接将变换矩阵 T \boldsymbol{T} T 看成 12 个未知数,而忽略了其内部各元素之间的约束关系,因此我们还需要对求解结果进行处理。对于旋转矩阵 R \boldsymbol{R} R,将上述结果左边 3 × 3 3\times3 3×3 矩阵进行近似,可以采用 QR 分解或下面的方法

R ← ( R R T ) − 1 2 R \boldsymbol{R} \leftarrow\left(\boldsymbol{R} \boldsymbol{R}^{\mathrm{T}}\right)^{-\frac{1}{2}} \boldsymbol{R} R(RRT)21R

6.4.2 P3P

P3P 是另一种解 PnP 的方法,它仅使用 3 对匹配点, 对数据要求较少。

(1)P3P 需要利用给定的 3 个点的几何关系。它的输入数据为 3 对 3D-2D 匹配点。

如图,A、B、C 为 3D 点, a、b、c 为三个点在成像平面上的投影。此外,还需要一对验证点 D-d(类似对极几何,选出正确解)。

根据三角形相似

Δ O a b ∼ Δ O A B , Δ O a c ∼ Δ O A C , Δ O b c ∼ Δ O B C \Delta Oab\sim\Delta OAB, \quad \Delta Oac\sim\Delta OAC, \quad \Delta Obc\sim\Delta OBC ΔOabΔOAB,ΔOacΔOAC,ΔObcΔOBC

由余弦定理
O A 2 + O B 2 − 2 O A ⋅ O B ⋅ cos ⁡ < O a , O b > = A B 2 O A 2 + O C 2 − 2 O A ⋅ O C ⋅ cos ⁡ < O a , O c > = A C 2 O B 2 + O C 2 − 2 O B ⋅ O C ⋅ cos ⁡ < O b , O c > = B C 2 (6-29) OA^2+OB^2-2OA\cdot OB\cdot \cos=AB^2 \\ OA^2+OC^2-2OA\cdot OC\cdot \cos=AC^2 \\ OB^2+OC^2-2OB\cdot OC\cdot \cos=BC^2 \tag{6-29} OA2+OB22OAOBcos<Oa,Ob>=AB2OA2+OC22OAOCcos<Oa,Oc>=AC2OB2+OC22OBOCcos<Ob,Oc>=BC2(6-29)

两边同除 O C 2 OC^2 OC2,记 x = O A / O C x=OA/OC x=OA/OC y = O B / O C y=OB/OC y=OB/OC,得

x 2 + y 2 − 2 x y cos ⁡ < O a , O b > = A B 2 / O C 2 x 2 + 1 − 2 x cos ⁡ < O a , O c > = A C 2 / O C 2 y 2 + 1 − 2 y cos ⁡ < O b , O c > = B C 2 / O C 2 (6-30) x^2+y^2-2xy\cos=AB^2/OC^2 \\ x^2+1-2x\cos=AC^2/OC^2 \\ y^2+1-2y\cos=BC^2/OC^2 \tag{6-30} x2+y22xycos<Oa,Ob>=AB2/OC2x2+12xcos<Oa,Oc>=AC2/OC2y2+12ycos<Ob,Oc>=BC2/OC2(6-30)

v = A B 2 / O C 2 , u v = B C 2 / O C 2 , w v = A C 2 / O C 2 v=A B^{2} / O C^{2}, u v=B C^{2} / O C^{2}, w v=A C^{2} / O C^{2} v=AB2/OC2,uv=BC2/OC2,wv=AC2/OC2,则

x 2 + y 2 − 2 x y cos ⁡ < O a , O b > − v = 0 x 2 + 1 − 2 x cos ⁡ < O a , O c > − w v = 0 y 2 + 1 − 2 y cos ⁡ < O b , O c > − u v = 0 (6-31) x^2+y^2-2xy\cos-v=0 \\ x^2+1-2x\cos-wv=0 \\ y^2+1-2y\cos-uv=0 \tag{6-31} x2+y22xycos<Oa,Ob>v=0x2+12xcos<Oa,Oc>wv=0y2+12ycos<Ob,Oc>uv=0(6-31)

将第一个式子中的 v v v 代入后面两式,整理得

( 1 − u ) y 2 − u x 2 − 2 y cos ⁡ < O b , O c > + 2 u x y cos ⁡ < O a , O b > + 1 = 0 (1-u)y^2-ux^2-2y\cos+2uxy\cos+1=0 (1u)y2ux22ycos<Ob,Oc>+2uxycos<Oa,Ob>+1=0
( 1 − w ) x 2 − w x 2 − 2 x cos ⁡ < O a , O c > + 2 w x y cos ⁡ < O a , O b > + 1 = 0 (6-32) (1-w)x^2-wx^2-2x\cos+2wxy\cos+1=0 \tag{6-32} (1w)x2wx22xcos<Oa,Oc>+2wxycos<Oa,Ob>+1=0(6-32)

注意,我们已知三个点的空间坐标及其相机投影,也就是说 u = B C 2 / A B 2 , w = A C 2 / A B 2 u=B C^{2} / A B^{2}, w=A C^{2} / A B^{2} u=BC2/AB2,w=AC2/AB2 已知,三个余弦值也已知。这样,可以将上式看成关于 x x x y y y 的二元二次方程。

该方程最多有四个解,用验证点计算最可能的解,从而得到三个点此时在相机坐标系下的 3D 坐标,之后再用 3D-3D 的点对,计算出相机运动(见 7.5 节)。

6.4.3 最小化重投影误差求解 PnP

(1)除了上面的线性变换方法,我们还可以把 PnP 问题构建成一个关于重投影误差的非线性最小二乘问题。线性方法往往是 先求相机位姿,再求空间点位置,而非线性优化则是把他们同时看成优化变量。这种把 相机和三维点放在一起进行最小化 的问题,统称为 Bundle Adjustment(BA)。

(2)

假设我们已知 n n n 个三维空间点 P P P 和他们的投影 p p p,希望求出相机位姿 R \boldsymbol{R} R t \boldsymbol{t} t,它的李代数为 ξ \boldsymbol{\xi} ξ。假设其中某点的空间坐标为 P i = [ X i , Y i , Z i ] T \boldsymbol{P}_i=[X_i,Y_i,Z_i]^T Pi=[Xi,Yi,Zi]T,其投影的像素坐标为 u i = [ u i , v i ] T \boldsymbol{u}_i=[u_i,v_i]^T ui=[ui,vi]T,两者关系如下:

s i [ u i v i 1 ] = K exp ⁡ ( ξ ∧ ) [ X i Y i Z i 1 ] (6-32) s_{i}\left[\begin{array}{l} u_{i} \\ v_{i} \\ 1 \end{array}\right]=\boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right)\left[\begin{array}{c} X_{i} \\ Y_{i} \\ Z_{i} \\ 1 \end{array}\right] \tag{6-32} si uivi1 =Kexp(ξ) XiYiZi1 (6-32)

其中 s i s_i si 为深度。将上式写成矩阵形式

s i u i = K exp ⁡ ( ξ ∧ ) P s_i\boldsymbol{u}_i=\boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right)\boldsymbol{P} siui=Kexp(ξ)P

但是,由于噪声的存在,等式往往不会成立,而是会有偏差。因此,我们将误差求和,构建一个最小二乘问题,寻找最优的位姿,使得误差最小:

ξ ∗ = arg ⁡ min ⁡ ξ 1 2 ∑ i = 1 n ∥ e i ∥ 2 2 = arg ⁡ min ⁡ ξ 1 2 ∑ i = 1 n ∥ u i − 1 s i K exp ⁡ ( ξ ∧ ) P i ∥ 2 2 (6-33) \boldsymbol{\xi}^{*}=\arg \min _{\boldsymbol{\xi}} \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{e}_i\right\|_{2}^{2}=\arg \min _{\boldsymbol{\xi}} \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{u}_{i}-\frac{1}{s_{i}} \boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}_{i}\right\|_{2}^{2} \tag{6-33} ξ=argξmin21i=1nei22=argξmin21i=1n uisi1Kexp(ξ)Pi 22(6-33)

注意,这里的误差采用非齐次坐标,即只有两维(最后一维误差一直为零)。

(3)前面我们已经讲过非线性优化方法,关键在于梯度的确定。这里将误差 e \boldsymbol{e} e 线性化:

e ( x + Δ x ) ≈ e ( x ) + J T Δ x (6-34) \boldsymbol{e}(\boldsymbol{x}+\Delta \boldsymbol{x}) \approx \boldsymbol{e}(\boldsymbol{x})+\boldsymbol{J}^{\mathrm{T}} \Delta \boldsymbol{x} \tag{6-34} e(x+Δx)e(x)+JTΔx(6-34)

其中,误差 e \boldsymbol{e} e 为 2 维, x \boldsymbol{x} x 为相机位姿(也就是变换矩阵的李代数)6 维,那么 J T \boldsymbol{J}^{\mathrm{T}} JT 就是 2 × 6 2 \times 6 2×6 维矩阵。这里的 J T \boldsymbol{J}^{\mathrm{T}} JT 是误差 e \boldsymbol{e} e 关于李代数的一阶导数,下面进行推导。

记点 P P P 变换到相机坐标系下的空间点坐标为 P ′ \boldsymbol{P'} P,并且将前三维取出来(注意维度):

P ′ = ( exp ⁡ ( ξ ∧ ) P ) 1 : 3 = [ X ′ , Y ′ , Z ′ ] T (6-35) \boldsymbol{P'}=(\exp \left(\boldsymbol{\xi}^{\wedge}\right)\boldsymbol{P})_{1:3}=[X',Y',Z']^T \tag{6-35} P=(exp(ξ)P)1:3=[X,Y,Z]T(6-35)

相机坐标再到像素坐标:

s u = K P ′ (6-36) s\boldsymbol{u}=\boldsymbol{K}\boldsymbol{P'} \tag{6-36} su=KP(6-36)

展开

s [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X ′ Y ′ Z ′ ] (6-37) s\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} X^{\prime} \\ Y^{\prime} \\ Z^{\prime} \end{array}\right] \tag{6-37} s uv1 = fx000fy0cxcy1 XYZ (6-37)

利用第 3 行消去 s s s(也就是深度),得

u = f x X ′ Z ′ + c x , v = f y Y ′ Z ′ + c y (6-38) u=f_x\frac{X'}{Z'}+c_x, \quad v=f_y\frac{Y'}{Z'}+c_y \tag{6-38} u=fxZX+cx,v=fyZY+cy(6-38)

我们对 ξ ∧ \boldsymbol{\xi}^{\wedge} ξ 左乘扰动变量 δ ξ \delta \boldsymbol{\xi} δξ,然后考虑 e \boldsymbol{e} e 关于扰动量的导数(也就是 J T \boldsymbol{J}^T JT

J T = ∂ e ∂ δ ξ = lim ⁡ δ ξ → 0 e ( δ ξ ⊕ ξ ) − e ( ξ ) δ ξ = ∂ e ∂ P ′ ∂ P ′ ∂ δ ξ (6-39) \boldsymbol{J}^T=\frac{\partial \boldsymbol{e}}{\partial \delta \boldsymbol{\xi}}=\lim _{\delta \boldsymbol{\xi} \rightarrow 0} \frac{\boldsymbol{e}(\delta \boldsymbol{\xi} \oplus \boldsymbol{\xi})-\boldsymbol{e}(\boldsymbol{\xi})}{\delta \boldsymbol{\xi}}=\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}} \frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}} \tag{6-39} JT=δξe=δξ0limδξe(δξξ)e(ξ)=PeδξP(6-39)

这里 ⊕ \oplus 表示左乘。先求第一项

∂ e ∂ P ′ = − [ ∂ u ∂ X ′ ∂ u ∂ Y ′ ∂ u ∂ Z ′ ∂ v ∂ X ′ ∂ v ∂ Y ′ ∂ v ∂ Z ′ ] = − [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] (6-40) \frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}}=-\left[\begin{array}{ccc} \frac{\partial u}{\partial X^{\prime}} & \frac{\partial u}{\partial Y^{\prime}} & \frac{\partial u}{\partial Z^{\prime}} \\ \frac{\partial v}{\partial X^{\prime}} & \frac{\partial v}{\partial Y^{\prime}} & \frac{\partial v}{\partial Z^{\prime}} \end{array}\right]=-\left[\begin{array}{ccc} \frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\ 0 & \frac{f_{y}}{Z^{\prime}} & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}} \end{array}\right] \tag{6-40} Pe=[XuXvYuYvZuZv]=[Zfx00ZfyZ′2fxXZ′2fyY](6-40)

第二项为变换后的空间点关于李代数的导数

∂ P ′ ∂ δ ξ = ∂ ( T P ) ∂ δ ξ = ( T P ) ⊙ = [ I − P ′ ∧ 0 T 0 T ] (6-41) \frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}}=\frac{\partial(\boldsymbol{T} \boldsymbol{P})}{\partial \delta \boldsymbol{\xi}}=(\boldsymbol{T} \boldsymbol{P})^{\odot}=\left[\begin{array}{cc} \boldsymbol{I} & -\boldsymbol{P}^{\prime \wedge} \\ \mathbf{0}^{\mathrm{T}} & \mathbf{0}^{\mathrm{T}} \end{array}\right] \tag{6-41} δξP=δξ(TP)=(TP)=[I0TP0T](6-41)

取出前三维,即

∂ P ′ ∂ δ ξ = [ I − P ′ ∧ ] = [ 1 0 0 0 Z − Y 0 1 0 − Z 0 X 0 0 1 Y − X 0 ] (6-42) \frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}}=\left[\begin{array}{cc} \boldsymbol{I} & -\boldsymbol{P}^{\prime \wedge} \end{array}\right]=\left[\begin{array}{cccccc} 1 & 0 & 0 & 0 & Z & -Y \\ 0 & 1 & 0 & -Z & 0 & X \\ 0 & 0 & 1 & Y & -X & 0 \\ \end{array}\right] \tag{6-42} δξP=[IP]= 1000100010ZYZ0XYX0 (6-42)

两项相乘,得到 2 × 6 2 \times 6 2×6 的雅克比矩阵

J T = ∂ e ∂ δ ξ = − [ f x Z ′ 0 − f x X ′ Z ′ 2 − f x X ′ Y ′ Z ′ 2 f x + f x X ′ 2 Z ′ 2 − f x Y ′ Z ′ 0 f y Z ′ − f y Y ′ Z ′ 2 − f y − f y Y ′ 2 Z ′ 2 f y X ′ Y ′ Z ′ 2 f y X ′ Z ′ ] (6-43) \boldsymbol{J}^T=\frac{\partial \boldsymbol{e}}{\partial \delta \boldsymbol{\xi}}=-\left[\begin{array}{cccccc} \frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} & -\frac{f_{x} X^{\prime} Y^{\prime}}{Z^{\prime 2}} & f_{x}+\frac{f_{x} X^{\prime 2}}{Z^{\prime 2}} & -\frac{f_{x} Y^{\prime}}{Z^{\prime}} \\ 0 & \frac{f_{y}}{Z^{\prime}} & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}} & -f_{y}-\frac{f_{y} Y^{\prime 2}}{Z^{\prime 2}} & \frac{f_{y} X^{\prime} Y^{\prime}}{Z^{\prime 2}} & \frac{f_{y} X^{\prime}}{Z^{\prime}} \end{array}\right] \tag{6-43} JT=δξe=[Zfx00ZfyZ′2fxXZ′2fyYZ′2fxXYfyZ′2fyY′2fx+Z′2fxX′2Z′2fyXYZfxYZfyX](6-43)

(4)除了优化位姿,我们还希望优化特征点的空间位置,也就是需要求误差 e \boldsymbol{e} e 关于空间点 P \boldsymbol{P} P 的导数。由链式求导法则:

∂ e ∂ P = ∂ e ∂ P ′ ∂ P ′ ∂ P (6-44) \frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}}=\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}^{\prime}} \frac{\partial \boldsymbol{P}^{\prime}}{\partial \boldsymbol{P}} \tag{6-44} Pe=PePP(6-44)
第一项已由式(6-40)求出。关于第二项,有

P ′ = R P + t \boldsymbol{P}^{\prime}=\boldsymbol{RP}+\boldsymbol{t} P=RP+t

∂ P ′ ∂ P = R \frac{\partial \boldsymbol{P}^{\prime}}{\partial \boldsymbol{P}}=\boldsymbol{R} PP=R

合并第一、二两项,得

∂ e ∂ P = − [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] R (6-45) \frac{\partial \boldsymbol{e}}{\partial \boldsymbol{P}}=-\left[\begin{array}{ccc} \frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\ 0 & \frac{f_{y}}{Z^{\prime}} & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}} \end{array}\right]\boldsymbol{R} \tag{6-45} Pe=[Zfx00ZfyZ′2fxXZ′2fyY]R(6-45)

至此,我们推导出了观测相机方程关于相机位姿和特征点的两个导数矩阵,后续进行优化迭代。

6.5 3D-3D:ICP

假设有一组匹配好的 3D 点(例如对两幅 RGB-D 图像进行匹配):

P = { p 1 , ⋯   , p n } , P ′ = { p 1 ′ , ⋯   , p n ′ } \boldsymbol{P}=\left\{\boldsymbol{p}_{1}, \cdots, \boldsymbol{p}_{n}\right\}, \quad \boldsymbol{P}^{\prime}=\left\{\boldsymbol{p}_{1}^{\prime}, \cdots, \boldsymbol{p}_{n}^{\prime}\right\} P={p1,,pn},P={p1,,pn}

现在,想要找一个欧式变换 R \boldsymbol{R} R t \boldsymbol{t} t,使得

∀ i , p i = R p i ′ + t \forall i, \boldsymbol{p}_{i}=\boldsymbol{R} \boldsymbol{p}_{i}^{\prime}+\boldsymbol{t} i,pi=Rpi+t

采用迭代最近点(ICP)求解:一种是利用线性代数的求解,一种是利用非线性优化方式的求解。

6.5.1 SVD 方法

(1)定义第 i i i 对点的误差项为:

e i = p i − ( R p i ′ + t ) (6-46) \boldsymbol{e}_i=\boldsymbol{p}_i-(\boldsymbol{Rp}_i^{\prime}+\boldsymbol{t}) \tag{6-46} ei=pi(Rpi+t)(6-46)

构建最小二乘问题,求出使误差平方和最小的 R \boldsymbol{R} R t \boldsymbol{t} t

min ⁡ R , t 1 2 ∑ i = 1 n ∥ ( p i − ( R p i ′ + t ) ) ∥ 2 2 (6-47) \min _{\boldsymbol{R}, \boldsymbol{t}} \frac{1}{2} \sum_{i=1}^{n}\left\|\left(\boldsymbol{p}_{i}-\left(\boldsymbol{R} \boldsymbol{p}_i^{\prime}+\boldsymbol{t}\right)\right)\right\|_{2}^{2} \tag{6-47} R,tmin21i=1n(pi(Rpi+t))22(6-47)

定义两组点的质心:

p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) (6-48) \boldsymbol{p}=\frac{1}{n}\sum_{i=1}^{n}(\boldsymbol{p_i}),\quad \boldsymbol{p'}=\frac{1}{n}\sum_{i=1}^{n}(\boldsymbol{p'_i}) \tag{6-48} p=n1i=1n(pi)p=n1i=1n(pi)(6-48)

则式(4-47)可写为

1 2 ∑ i = 1 n ∥ p i − ( R p i ′ + t ) ∥ 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 ) ) (6-49) \begin{aligned} \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{p}_{i}-\left(\boldsymbol{R} \boldsymbol{p}_{i}{ }^{\prime}+\boldsymbol{t}\right)\right\|^{2}=& \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{p}_{i}-\boldsymbol{R} \boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{t}-\boldsymbol{p}+\boldsymbol{R} \boldsymbol{p}^{\prime}+\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}\right\|^{2} \\ =& \frac{1}{2} \sum_{i=1}^{n}\left\|\left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{p}^{\prime}\right)\right)+\left(\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right)\right\|^{2} \\ =& \frac{1}{2} \sum_{i=1}^{n}\left(\left\|\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{p}^{\prime}\right)\right\|^{2}+\left\|\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right\|^{2}+\right.\\ &\left.2\left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{p}^{\prime}\right)\right)^{\mathrm{T}}\left(\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right)\right) \end{aligned} \tag{6-49} 21i=1npi(Rpi+t)2===21i=1npiRpitp+Rp+pRp221i=1n(pipR(pip))+(pRpt)221i=1n(pipR(pip)2+pRpt2+2(pipR(pip))T(pRpt))(6-49)
注意到,后一项 ( p i − p − R ( p i ′ − p ′ ) ) \left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{p}^{\prime}\right)\right) (pipR(pip)) 求和后等于零。则目标函数变为

min ⁡ R , t J = 1 2 ∑ i = 1 n ( ∥ p i − p − R ( p i ′ − p ′ ) ∥ 2 + ∥ p − R p ′ − t ∥ 2 (6-50) \min _{\boldsymbol{R}, \boldsymbol{t}} J= \frac{1}{2} \sum_{i=1}^{n}\left(\left\|\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}{ }^{\prime}-\boldsymbol{p}^{\prime}\right)\right\|^{2}+\left\|\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right\|^{2}\right. \tag{6-50} R,tminJ=21i=1n(pipR(pip)2+pRpt2(6-50)

观察左右两项,发现左边只和旋转 R \boldsymbol{R} R 有关,而右边和 R \boldsymbol{R} R t \boldsymbol{t} t 都有关。因此,只要我们获得了 R \boldsymbol{R} R,再令第二项等于零就可求出 t \boldsymbol{t} t。于是,ICP 可分为三个步骤求解:

——————————————————————————————————————————————————————————

① 计算两组点的质心 p \boldsymbol{p} p`、 p ′ \boldsymbol{p'} p,然后计算每个点的去质心坐标:

q i = p i − p , q i ′ = p i ′ − p ′ \boldsymbol{q_i}=\boldsymbol{p_i}-\boldsymbol{p},\quad \boldsymbol{q'_i}=\boldsymbol{p'_i}-\boldsymbol{p'} qi=pip,qi=pip

② 先优化第一项,求出 R \boldsymbol{R} R

R ∗ = arg ⁡ min ⁡ R 1 2 ∑ i = 1 n ∥ q i − R q i ′ ∥ 2 \boldsymbol{R}^*=\arg \min_{\boldsymbol{R}}\frac{1}{2} \sum_{i=1}^{n}\|\boldsymbol{q_i}-\boldsymbol{R}\boldsymbol{q'_i}\|^2 R=argRmin21i=1nqiRqi2

③ 令第二项等于零,求出 t \boldsymbol{t} t

t ∗ = p − R p ′ \boldsymbol{t}^*=\boldsymbol{p}-\boldsymbol{R}\boldsymbol{p'} t=pRp

——————————————————————————————————————————————————————————

下面主要进行第二步的推导,以求出 R \boldsymbol{R} 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 R q i ′ − 2 q i T R q i ′ ) (6-51) \frac{1}{2} \sum_{i=1}^{n}\|\boldsymbol{q_i}-\boldsymbol{R}\boldsymbol{q'_i}\|^2=\frac{1}{2} \sum_{i=1}^{n}(\boldsymbol{q_i}^T\boldsymbol{q_i}+\boldsymbol{q'_i}^T\boldsymbol{R}^T\boldsymbol{R}\boldsymbol{q'_i}-2\boldsymbol{q_i}^T\boldsymbol{R}\boldsymbol{q'_i}) \tag{6-51} 21i=1nqiRqi2=21i=1n(qiTqi+qiTRTRqi2qiTRqi)(6-51)

注意到,第一项和 R \boldsymbol{R} R 无关,第二项中 R T R = I \boldsymbol{R^TR=I} RTR=I,亦与 R \boldsymbol{R} R 无关。因此,目标优化函数变为

∑ i = 1 n − q i T R q i ′ = ∑ i = 1 n − t r ( R q i ′ q i T ) = − t r ( R ∑ i = 1 n q i ′ q i T ) (6-52) \sum_{i=1}^{n}-\boldsymbol{q_i}^\mathrm{T}\boldsymbol{R}\boldsymbol{q'_i}=\sum_{i=1}^{n}-\mathrm{tr}(\boldsymbol{R}\boldsymbol{q'_i}\boldsymbol{q_i}^T)=-\mathrm{tr}(\boldsymbol{R}\sum_{i=1}^{n}\boldsymbol{q'_i}\boldsymbol{q_i}^\mathrm{T}) \tag{6-52} i=1nqiTRqi=i=1ntr(RqiqiT)=tr(Ri=1nqiqiT)(6-52)

注意,这里用了矩阵内积和迹的关系。

定义

W = q i q i ′ T (6-53) \boldsymbol{W}=\boldsymbol{q_i}\boldsymbol{q'_i}^\mathrm{T} \tag{6-53} W=qiqiT(6-53)

W \boldsymbol{W} W 是一个 3 × 3 3\times3 3×3 的矩阵,对其进行 SVD 分解,得

W = U Σ V T \boldsymbol{W}=\boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^\mathrm{T} W=UΣVT

W \boldsymbol{W} W 满秩时,求得

R = U V T (6-54) \boldsymbol{R}=\boldsymbol{U}\boldsymbol{V}^\mathrm{T} \tag{6-54} R=UVT(6-54)

R \boldsymbol{R} R 的行列式为负,则取 − R -\boldsymbol{R} R 作为最优值。

6.5.2 非线性优化方法

用李代数表示位姿,则目标函数可写成

min ⁡ ξ = 1 2 ∑ i = 1 n ∥ ( p i − exp ⁡ ( ξ ∧ ) p i ′ ) ∥ 2 2 (6-55) \min _{\boldsymbol{\xi}} = \frac{1}{2} \sum_{i=1}^{n}\|(\boldsymbol{p}_{i}-\exp (\boldsymbol{\xi}^{\wedge})\boldsymbol{p'_i})\|_{2}^{2} \tag{6-55} ξmin=21i=1n(piexp(ξ)pi)22(6-55)

类似式(6-39)、(6-40)、(6-41),可推导单个误差项关于位姿的数,即

∂ e ∂ δ ξ = ∂ e ∂ p ∂ p ∂ δ ξ = − 1 ⋅ ( exp ⁡ ( ξ ∧ ) p i ′ ) ⊙ = − ( exp ⁡ ( ξ ∧ ) p i ′ ) ⊙ (6-56) \frac{\partial \boldsymbol{e}}{\partial \delta \boldsymbol{\xi}}=\frac{\partial \boldsymbol{e}}{\partial \boldsymbol{p}}\frac{\partial \boldsymbol{p}}{\partial \delta \boldsymbol{\xi}}=-1\cdot(\exp (\boldsymbol{\xi}^{\wedge})\boldsymbol{p'_i})^{\odot}=-(\exp (\boldsymbol{\xi}^{\wedge})\boldsymbol{p'_i})^{\odot} \tag{6-56} δξe=peδξp=1(exp(ξ)pi)=(exp(ξ)pi)(6-56)

求出梯度后,便可不断迭代优化, 直至求出最优解。

你可能感兴趣的:(视觉SLAM十四讲,算法)