视觉里程计之相对位姿估计
前言
这是视觉里程计的最后一个介绍,在第一个部分介绍了特征点法用于采集图像之间的特征,在匹配好特征点后,我们可以得到两个一一对应的像素点集。接下来要做的,就是根据两组匹配好的点集,计算相机的运动了。在普通的单目成像中,我们只知道这两组点的像素坐标。而在双目和RGBD配置中,我们还知道该特征点离相机的距离。因此,该问题就出现了多种形式:
2D-2D形式:通过两个图像的像素位置来估计相机的运动。
3D-2D形式:假设已知其中一组点的3D坐标,以及另一组点的2D坐标,求相机运动。
3D-3D形式:两组点的3D坐标均已知,估计相机的运动。
那么问题就来了:是否需要为这三种情况设计不同的计算方法呢?答案是:既可以单独做,也可以统一到一个大框架里去做。
单独做的时候,2D-2D使用对极几何的方法,3D-2D使用PnP求解算法,而3D-3D则称为ICP方法
统一的框架,就是指把所有未知变量均作为优化变量,而几何关系则是优化变量之间的约束。由于噪声的存在,几何约束通常无法完美满足。于是,我们把与约束不一致的地方写进误差函数。通过最小化误差函数,来求得各个变量的估计值。这种思路也称为Bundle Adjustment(BA).
这个章节主要给大家介绍3D-2D使用PnP求解算法。
PnP
PnP(Perspective-n-Point)算法是求解3D到2D点对运动的方法,它描述了当知道 n n n个3D空间点及其投影位置时,如何估计相机的位姿。PnP问题有多种求解方法,例如,用3对点估计位姿的P3P、直接线性变换(DLT)、EPnP(Efficient PnP)等等。此外,还能用非线性优化的方式,构建最小二乘问题并迭代求解,光束法平差(Bundle Adjustment, BA)。
DLT法
考虑某个空间点 P \!\!P\!\! P在世界坐标系下的齐次坐标为 P w = ( X w , Y w , Z w , 1 ) T \!\!P_w\!\!=\!\!(X_w,\!Y_w,\!Z_w,\!1)^T\!\! Pw=(Xw,Yw,Zw,1)T ,在相机坐标系下为 P c = ( X c , Y c , Z c ) T \!\!P_c\!=\!\!(X_c,\!Y_c,\!Z_c)^T\!\! Pc=(Xc,Yc,Zc)T 。在图像 I 1 \!I_1\! I1中,投影到特征点 x 1 = ( u 1 , v 1 , 1 ) T \!x_1=(u_1,v_1,1)^T\! x1=(u1,v1,1)T(以归一化平面齐次坐标表示)。定义增广矩阵 [ R ∣ t ] \!\![R|t]\! [R∣t]为一个 3 × 4 \!3\times 4\! 3×4的矩阵,包含了旋转与平移信息。世界坐标与观测的转换关系如下,像素坐标与相机坐标系的转换,深度乘左边比较好表示:
s 1 [ u 1 v 1 1 ] = K [ X c Y c Z c ] = K [ R t ] [ X w Y w Z w 1 ] s_1\left[\begin{matrix}u_1\\v_1\\1\\\end{matrix}\right]=K\left[\begin{matrix}X_c\\Y_c\\Z_c\\\end{matrix}\right]=K\left[\begin{matrix}R&t\\\end{matrix}\right]\left[\begin{matrix}X_w \\ Y_w \\Z_w \\1\\\end{matrix}\right] s1 u1v11 =K XcYcZc =K[Rt] XwYwZw1
这里设:
T = K [ R t ] = [ t 1 t 2 t 3 t 5 t 6 t 7 t 9 t 10 t 11 t 4 t 8 t 12 ] T=K\left[\begin{matrix}R&t\\\end{matrix}\right]=\ \left[\begin{matrix}t_1&t_2&t_3\\t_5&t_6&t_7\\t_9&t_{10}&t_{11}\\\end{matrix}\ \ \ \begin{matrix}t_4\\t_8\\t_{12}\\\end{matrix}\right] T=K[Rt]= t1t5t9t2t6t10t3t7t11 t4t8t12
则原式子为:
s 1 [ u 1 v 1 1 ] = T [ X w Y w Z w 1 ] s_1\left[\begin{matrix}u_1\\v_1\\1\\\end{matrix}\right]=T\left[\begin{matrix}X_w \\ Y_w \\Z_w \\1\\\end{matrix}\right] s1 u1v11 =T XwYwZw1
如果是求相机 O 1 O_1 O1与相机 O 2 O_2 O2之间的相对关系,则这里的 P w \!P_w\! Pw就是 P 1 \!P_1\! P1,而 R , t R,t R,t为 O 1 O_1 O1在 O 2 O_2 O2下的姿态。
s 1 [ u 1 v 1 1 ] = [ t 1 t 2 t 3 t 5 t 6 t 7 t 9 t 10 t 11 t 4 t 8 t 12 ] [ X w Y w Z w 1 ] s_1\left[\begin{matrix}u_1\\v_1\\1\\\end{matrix}\right]=\ \left[\begin{matrix}t_1&t_2&t_3\\t_5&t_6&t_7\\t_9&t_{10}&t_{11}\\\end{matrix}\ \ \ \begin{matrix}t_4\\t_8\\t_{12}\\\end{matrix}\right]\left[\begin{matrix}X_w \\ Y_w \\Z_w \\1\\\end{matrix}\right] s1 u1v11 = t1t5t9t2t6t10t3t7t11 t4t8t12 XwYwZw1
简单的矩阵乘法,最后一行可以得到 s 1 s_1 s1的表达式,于是 u 1 , v 1 \!u_1,v_1\! u1,v1的值为:
u
1
=
t
1
X
W
+
t
2
Y
W
+
t
3
Z
W
+
t
4
t
9
X
W
+
t
10
Y
W
+
t
11
Z
W
+
t
12
\begin{array}{c} u_{1}=\frac{t_{1} X_{W}+t_{2} Y_{W}+t_{3} Z_{W}+t_{4}}{t_{9} X_{W}+t_{10} Y_{W}+t_{11} Z_{W}+t_{12}} \end{array}
u1=t9XW+t10YW+t11ZW+t12t1XW+t2YW+t3ZW+t4
v
1
=
t
5
X
W
+
t
6
Y
W
+
t
7
Z
W
+
t
8
t
9
X
W
+
t
10
Y
W
+
t
11
Z
W
+
t
12
\begin{array}{c} v_{1}=\frac{t_{5} X_{W}+t_{6} Y_{W}+t_{7} Z_{W}+t_{8}}{t_{9} X_{W}+t_{10} Y_{W}+t_{11} Z_{W}+t_{12}} \end{array}
v1=t9XW+t10YW+t11ZW+t12t5XW+t6YW+t7ZW+t8
为简化表示,设:
t
1
=
(
t
1
t
2
t
3
t
4
)
T
t_1=\ \left(t_1\ \begin{matrix}\ t_2&t_3&t_4\\\end{matrix}\right)^T
t1= (t1 t2t3t4)T
t
2
=
(
t
5
t
6
t
7
t
8
)
T
t_2=\ \left(t_5\ \begin{matrix}\ t_6&t_7&t_8\\\end{matrix}\right)^T
t2= (t5 t6t7t8)T
t
3
=
(
t
9
t
10
t
11
t
12
)
T
t_3=\ \left(t_9\ \begin{matrix}\ t_{10}&t_{11}&t_{12}\\\end{matrix}\right)^T
t3= (t9 t10t11t12)T
于是:
t
1
T
P
−
t
3
T
P
u
1
=
0
t_1^TP-t_3^TPu_1=0
t1TP−t3TPu1=0
t
2
T
P
−
t
3
T
P
v
1
=
0
t_2^TP-t_3^TPv_1=0
t2TP−t3TPv1=0
其中 t t t为待求变量,与求单应矩阵类似,每个点对可以提供两个关于 t t t的约束,假设一共有 N N N个特征点,则可以得到如下线性方程组:
( 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 \left(\begin{array}{ccc} \boldsymbol{P}_{1}^{T} & 0 & -u_{1} \boldsymbol{P}_{1}^{T} \\ 0 & \boldsymbol{P}_{1}^{T} & -v_{1} \boldsymbol{P}_{1}^{T} \\ \ldots & \ldots & \ldots \\ \boldsymbol{P}_{N}^{T} & 0 & -u_{N} \boldsymbol{P}_{N}^{T} \\ 0 & \boldsymbol{P}_{N}^{T} & -v_{N} \boldsymbol{P}_{N}^{T} \end{array}\right)\left(\begin{array}{c} t_{1} \\ t_{2} \\ t_{3} \end{array}\right)=0 P1T0…PNT00P1T…0PNT−u1P1T−v1P1T…−uNPNT−vNPNT t1t2t3 =0
t
\!\!t\!\!
t一共有12维,可以通过最少六对匹配点,实现对矩阵T的线性求解,这种方法称为直接线性法(DLT)。如果匹配点数大于6对,可以通过SVD方法对超定方程求最小二乘解。
求得矩阵后,需要先左乘一个内参矩阵的逆
K
−
1
\!\!K^{-1}\!\!
K−1 ,然后获得
t
\!\!t\!
t 与
t
\!\!t\!\!
t 。
需要说明的是,这种方法忽略了未知数之间的关联,比如旋转
R
∈
S
O
(
3
)
\!\!R\!\!\in\!\! SO(3)\!\!
R∈SO(3),使用这种方式求出的R矩阵不一定满足该关系,其为一个一般性矩阵,需要找一个矩阵对其进行近视,近似的方法由QR分解完成,也可以如下计算:
R ← ( R R T ) { − 1 2 } R R\ \gets\left(RR^T\right)^{\left\{-\frac{1}{2}\right\}}R R ←(RRT){−21}R
这种解法求得的解,既无尺度,也无约束,要得到尺度及约束,需要构建优化问题。
P3P
在知道世界坐标系或者其他相机坐标系下三维点与当前相机3个点的对应关系时,最少可以通过3对配对点来求当前相机相对于三维点坐标系的旋转和平移。
P3P需要利用给定的 3 个点的几何关系。它的输入数据为3对
3
D
−
2
D
3\text{D}-2\text{D}
3D−2D匹配点。记
3
D
3\text{D}
3D点为
A
,
B
,
C
A,B,C
A,B,C,
2
D
2\text{D}
2D点为
a
,
b
,
c
a,b,c
a,b,c,其中小写字母代表的点为对应大写字母代表的点在相机成像平面上的投影,如下图所示:
P3P算法求得的结果,是另一个坐标系中三维点(比如世界坐标系中的
A
,
B
,
C
A,B,C
A,B,C),在当前坐标系下的坐标(比如相机成像平面的
a
,
b
,
c
a,b,c
a,b,c对应的相机坐标系下的3D坐标)。从而把一个3D-2D的关联,转化为3D-3D的关联,把PnP问题转换为ICP问题,通过求解ICP的方式获得旋转和平移。需要注意的是,P3P算法最后方程的解有四个,需要额外的一个点来验证,一般会选取重投影误差最小的解作为最优解。
三维点
A
,
B
,
C
A,B,C
A,B,C,相机成像平面点
a
,
b
,
c
a,b,c
a,b,c和相机光心
O
O
O组成的三角形有如下对应关系:
Δ
O
a
b
−
Δ
O
A
B
,
Δ
O
b
c
−
Δ
O
B
C
,
Δ
O
a
c
−
Δ
O
A
C
\Delta O_{ab}-\Delta O_{AB},\quad\Delta O_{bc}-\Delta O_{BC},\quad\Delta O_{ac}-\Delta O_{AC}
ΔOab−ΔOAB,ΔObc−ΔOBC,ΔOac−ΔOAC
根据余弦定理,对于这个大的空间三角形,有如下关系:
O
A
2
+
O
B
2
−
2
O
A
⋅
O
B
⋅
cos
⟨
a
,
b
⟩
=
A
B
2
O
B
2
+
O
C
2
−
2
O
B
⋅
O
C
⋅
cos
⟨
b
,
c
⟩
=
B
C
2
O
A
2
+
O
C
2
−
2
O
A
⋅
O
C
⋅
cos
⟨
a
,
c
⟩
=
A
C
2
.
\begin{array}{l} O A^{2}+O B^{2}-2 O A \cdot O B \cdot \cos \langle a, b\rangle=A B^{2} \\ O B^{2}+O C^{2}-2 O B \cdot O C \cdot \cos \langle b, c\rangle=B C^{2} \\ O A^{2}+O C^{2}-2 O A \cdot O C \cdot \cos \langle a, c\rangle=A C^{2} . \end{array}
OA2+OB2−2OA⋅OB⋅cos⟨a,b⟩=AB2OB2+OC2−2OB⋅OC⋅cos⟨b,c⟩=BC2OA2+OC2−2OA⋅OC⋅cos⟨a,c⟩=AC2.
对该方程进行消元,方法是除以
O
C
2
OC^2
OC2,并设
x
=
O
A
/
O
C
,
y
=
O
B
/
O
C
x=OA/OC,y=OB/OC
x=OA/OC,y=OB/OC,则方程变为:
x
2
+
y
2
−
2
⋅
x
⋅
y
⋅
cos
⟨
a
,
b
⟩
=
A
B
2
O
C
2
x
2
+
1
−
2
⋅
x
⋅
cos
⟨
a
,
c
⟩
=
A
C
2
O
C
2
y
2
+
1
−
2
⋅
y
⋅
cos
⟨
b
,
c
⟩
=
B
C
2
O
C
2
\begin{array}{l} x^{2}+y^{2}-2 \cdot x \cdot y \cdot \cos \langle a, b\rangle =\frac{A B^{2}}{O C^{2}} \\ x^{2}+1-2 \cdot x \cdot \cos \langle a, c\rangle=\frac{A C^{2}}{O C^{2}} \\ y^{2}+1-2 \cdot y \cdot \cos \langle b, c\rangle=\frac{B C^{2}}{O C^{2}} \end{array}
x2+y2−2⋅x⋅y⋅cos⟨a,b⟩=OC2AB2x2+1−2⋅x⋅cos⟨a,c⟩=OC2AC2y2+1−2⋅y⋅cos⟨b,c⟩=OC2BC2
然后再进行替换,令:
u
=
A
B
2
O
C
2
,
v
=
B
C
2
A
B
2
,
w
=
A
C
2
A
B
2
u\ =\ \frac{AB^2}{OC^2},\ v=\frac{BC^2}{AB^2},\ w=\frac{AC^2}{AB^2}
u = OC2AB2, v=AB2BC2, w=AB2AC2
可得:
x 2 + y 2 − 2 ⋅ x ⋅ y ⋅ cos ⟨ a , b ⟩ = u x 2 + 1 − 2 ⋅ x ⋅ cos ⟨ a , c ⟩ = w u y 2 + 1 − 2 ⋅ y ⋅ cos ⟨ b , c ⟩ = u v \begin{aligned} &x^2+y^2-2 \cdot x \cdot y \cdot \cos\langle a,b \rangle = u \\ &x^2 + 1 - 2 \cdot x \cdot \cos\langle a,c \rangle=wu \\ &y^2 + 1 - 2 \cdot y \cdot \cos\langle b,c \rangle=uv \end{aligned} x2+y2−2⋅x⋅y⋅cos⟨a,b⟩=ux2+1−2⋅x⋅cos⟨a,c⟩=wuy2+1−2⋅y⋅cos⟨b,c⟩=uv
将第一个式子,带入第二第三个式子,可得:
(
1
−
w
)
x
2
−
w
⋅
y
2
−
2
⋅
x
⋅
cos
⟨
a
,
c
⟩
+
2
⋅
w
⋅
x
⋅
y
⋅
cos
⟨
a
,
b
⟩
+
1
=
0
(
1
−
v
)
y
2
−
v
⋅
x
2
−
2
⋅
y
⋅
cos
⟨
b
,
c
⟩
+
2
⋅
v
⋅
x
⋅
y
⋅
cos
⟨
a
,
b
⟩
+
1
=
0
\begin{aligned} &(1-w)x^2-w \cdot y^2 - 2 \cdot x \cdot \cos\langle a,c \rangle + 2 \cdot w \cdot x \cdot y \cdot \cos\langle a, b \rangle + 1 = 0 \\ &(1-v)y^2-v \cdot x^2 - 2 \cdot y \cdot \cos\langle b,c \rangle + 2 \cdot v \cdot x \cdot y \cdot \cos\langle a, b \rangle + 1 = 0 \end{aligned}
(1−w)x2−w⋅y2−2⋅x⋅cos⟨a,c⟩+2⋅w⋅x⋅y⋅cos⟨a,b⟩+1=0(1−v)y2−v⋅x2−2⋅y⋅cos⟨b,c⟩+2⋅v⋅x⋅y⋅cos⟨a,b⟩+1=0
因为
A
B
C
\!\!ABC\!\!
ABC之间的相对位置关系是不变的,所以其中
v
,
w
\!v,w\!
v,w值为已知值,而三个角度余弦值可以通过像素观测坐标求得,对于上述方程,只有
x
,
y
\!x,y\!
x,y为未知数,为一个二元二次方程组,求解这个方程组,需要用到吴消元法。
它可以将原方程等效成一组特征列(Characteristic Serial, CS),凡是原方程组的解都会是CS的解,但是CS的解不一定是原方程的解,所以需要验证,这里的等效方程为:
{
a
4
x
4
+
a
3
x
3
+
a
2
x
2
+
a
1
x
1
+
a
0
=
0
b
1
y
−
b
0
=
0
\begin{cases} a_4 x^4+a_3 x^3 + a_2 x^2 + a_1 x^1 + a_0 = 0 \\ b_1 y - b_0 = 0 \end{cases}
{a4x4+a3x3+a2x2+a1x1+a0=0b1y−b0=0
求得了
x
,
y
\!x,y\!
x,y的值,就可以求取
O
A
,
O
B
,
O
C
\!\!OA,\!OB,\!OC\!\!
OA,OB,OC的值,根据下面的公式,
A
B
\!\!AB\!\!
AB已知,可以先求
O
C
\!\!OC\!\!
OC,然后分别求解
O
B
,
O
A
\!\!OB,OA\!
OB,OA:
x
2
+
y
2
−
2
⋅
x
⋅
y
⋅
c
o
s
<
a
,
b
>
=
A
B
2
O
C
2
y
=
O
B
O
C
,
x
=
O
A
O
C
x^2 + y^2 - 2 \cdot x \cdot y \cdot cos<a,b>=\frac{AB^2}{OC^2}\qquad y=\frac{OB}{OC},x=\frac{OA}{OC}
x2+y2−2⋅x⋅y⋅cos<a,b>=OC2AB2y=OCOB,x=OCOA
求得三个点在相机坐标系下的深度之后,就可以通过像素坐标与三维点的投影关系,求出相机坐标系下点的坐标。
A
=
a
⃗
⋅
∥
P
A
∥
\bm{A}=\vec{a} \cdot \left \| \bm{PA} \right \|
A=a⋅∥PA∥
附:吴消元法系数
p
=
2
⋅
c
o
s
<
a
,
c
>
q
=
2
⋅
c
o
s
<
b
,
c
>
r
=
2
⋅
c
o
s
<
a
,
b
>
p=2 \cdot cos<a,c> \quad q = 2\cdot cos<b, c> \quad r=2\cdot cos<a,b>
p=2⋅cos<a,c>q=2⋅cos<b,c>r=2⋅cos<a,b>
{
a
4
=
a
2
+
b
2
−
2
a
−
2
b
+
2
(
1
−
r
2
)
b
a
+
1
a
3
=
−
2
q
a
2
−
r
p
b
2
+
4
q
a
+
(
2
q
+
p
r
)
b
+
(
r
2
q
−
2
q
+
r
p
)
a
b
−
2
q
a
2
=
(
2
+
q
2
)
a
2
+
(
p
2
+
r
2
−
2
)
b
2
−
(
4
+
2
q
2
)
a
−
(
p
q
r
+
p
2
)
b
−
(
p
q
r
+
r
2
)
a
b
+
q
2
+
2
a
1
=
−
2
q
a
2
−
r
p
b
2
+
4
q
a
+
(
p
r
+
q
p
2
−
2
q
)
b
+
(
r
p
+
2
q
)
a
b
−
2
q
a
0
=
a
2
+
b
2
−
2
a
+
(
2
−
p
2
)
b
−
2
a
b
+
1
b
1
=
b
(
(
p
2
−
p
q
r
+
r
2
)
a
+
(
p
2
−
r
2
)
b
−
p
2
+
p
q
r
−
r
2
)
2
b
0
=
(
(
1
−
a
−
b
)
x
2
+
(
a
−
1
)
q
x
−
a
+
b
+
1
)
)
(
(
r
3
(
a
2
+
b
2
−
2
a
−
2
b
+
(
2
−
r
2
)
a
b
+
1
)
x
3
+
r
2
(
p
+
p
a
2
−
2
r
q
a
b
+
2
r
q
b
−
2
r
q
−
2
p
a
−
2
p
b
+
p
r
2
b
+
4
r
q
a
+
q
r
3
a
b
−
2
r
q
a
2
+
2
p
a
b
+
p
b
2
−
r
2
p
b
2
)
x
2
+
(
r
5
(
b
2
−
a
b
)
−
r
4
p
q
b
+
r
3
(
q
2
−
4
a
−
2
q
2
a
+
q
2
a
2
+
2
a
2
−
2
b
2
+
2
)
+
r
2
(
4
p
q
a
−
2
p
q
a
b
+
2
p
q
b
−
2
p
q
−
2
p
q
a
2
)
+
r
(
p
2
b
2
−
2
p
2
b
+
2
p
2
a
b
−
2
p
2
a
+
p
2
+
p
2
a
2
)
)
x
+
(
2
p
r
2
−
2
r
3
q
+
p
3
−
2
p
2
q
r
+
p
q
2
r
2
)
a
2
+
(
p
3
−
2
p
r
2
)
b
2
+
(
4
q
r
3
−
4
p
r
2
−
2
p
3
+
4
p
2
q
r
−
2
p
q
2
r
2
)
a
+
(
−
2
q
r
3
+
p
r
4
+
2
p
2
q
r
−
2
p
3
)
b
+
(
2
p
3
+
2
q
r
3
−
2
p
2
q
r
)
a
b
+
p
q
2
r
2
−
2
p
2
q
r
+
2
p
r
2
+
p
3
−
2
r
3
q
)
\left\{\begin{aligned} a_{4}= & a^{2}+b^{2}-2 a-2 b+2\left(1-r^{2}\right) b a+1 \\ a_{3}= & -2 q a^{2}-r p b^{2}+4 q a+(2 q+p r) b+\left(r^{2} q-2 q+r p\right) a b-2 q \\ a_{2}= & \left(2+q^{2}\right) a^{2}+\left(p^{2}+r^{2}-2\right) b^{2}-\left(4+2 q^{2}\right) a-\left(p q r+p^{2}\right) b-\left(p q r+r^{2}\right) a b+q^{2}+2 \\ a_{1}= & -2 q a^{2}-r p b^{2}+4 q a+\left(p r+q p^{2}-2 q\right) b+(r p+2 q) a b-2 q \\ a_{0}= & a^{2}+b^{2}-2 a+\left(2-p^{2}\right) b-2 a b+1 \\ b_{1}= & b\left(\left(p^{2}-p q r+r^{2}\right) a+\left(p^{2}-r^{2}\right) b-p^{2}+p q r-r^{2}\right)^{2} \\ b_{0}= & \left.\left((1-a-b) x^{2}+(a-1) q x-a+b+1\right)\right) \\ & \left(\left(r^{3}\left(a^{2}+b^{2}-2 a-2 b+\left(2-r^{2}\right) a b+1\right) x^{3}+\right.\right. \\ & r^{2}\left(p+p a^{2}-2 r q a b+2 r q b-2 r q-2 p a-2 p b+p r^{2} b+4 r q a+q r^{3} a b-2 r q a^{2}+2 p a b+p b^{2}-r^{2} p b^{2}\right) x^{2}+ \\ & \left(r^{5}\left(b^{2}-a b\right)-r^{4} p q b+r^{3}\left(q^{2}-4 a-2 q^{2} a+q^{2} a^{2}+2 a^{2}-2 b^{2}+2\right)+r^{2}\left(4 p q a-2 p q a b+2 p q b-2 p q-2 p q a^{2}\right)+\right. \\ & \left.r\left(p^{2} b^{2}-2 p^{2} b+2 p^{2} a b-2 p^{2} a+p^{2}+p^{2} a^{2}\right)\right) x+ \\ & \left(2 p r^{2}-2 r^{3} q+p^{3}-2 p^{2} q r+p q^{2} r^{2}\right) a^{2}+\left(p^{3}-2 p r^{2}\right) b^{2}+\left(4 q r^{3}-4 p r^{2}-2 p^{3}+4 p^{2} q r-2 p q^{2} r^{2}\right) a+ \\ & \left(-2 q r^{3}+p r^{4}+2 p^{2} q r-2 p^{3}\right) b+\left(2 p^{3}+2 q r^{3}-2 p^{2} q r\right) a b+ \\ & \left.p q^{2} r^{2}-2 p^{2} q r+2 p r^{2}+p^{3}-2 r^{3} q\right) \end{aligned}\right.
⎩
⎨
⎧a4=a3=a2=a1=a0=b1=b0=a2+b2−2a−2b+2(1−r2)ba+1−2qa2−rpb2+4qa+(2q+pr)b+(r2q−2q+rp)ab−2q(2+q2)a2+(p2+r2−2)b2−(4+2q2)a−(pqr+p2)b−(pqr+r2)ab+q2+2−2qa2−rpb2+4qa+(pr+qp2−2q)b+(rp+2q)ab−2qa2+b2−2a+(2−p2)b−2ab+1b((p2−pqr+r2)a+(p2−r2)b−p2+pqr−r2)2((1−a−b)x2+(a−1)qx−a+b+1))((r3(a2+b2−2a−2b+(2−r2)ab+1)x3+r2(p+pa2−2rqab+2rqb−2rq−2pa−2pb+pr2b+4rqa+qr3ab−2rqa2+2pab+pb2−r2pb2)x2+(r5(b2−ab)−r4pqb+r3(q2−4a−2q2a+q2a2+2a2−2b2+2)+r2(4pqa−2pqab+2pqb−2pq−2pqa2)+r(p2b2−2p2b+2p2ab−2p2a+p2+p2a2))x+(2pr2−2r3q+p3−2p2qr+pq2r2)a2+(p3−2pr2)b2+(4qr3−4pr2−2p3+4p2qr−2pq2r2)a+(−2qr3+pr4+2p2qr−2p3)b+(2p3+2qr3−2p2qr)ab+pq2r2−2p2qr+2pr2+p3−2r3q)
EPnP
EPnP算法最后求解在相机坐标系下,
3
D
\!3D\!
3D点在控制点下坐标时,复杂度为
O
(
n
)
\!\!O(n)\!\!
O(n),其中
n
\!\!n\!\!
n为配对点对数,比较高效,其名称也是如此得来的。其求解的思路为,先通过世界坐标系或者上一坐标系下3D点的坐标,计算出四个控制点坐标。基于控制点坐标,计算出3D点在控制点坐标系下坐标,而可以证明,在世界坐标系下控制点坐标,与在此时相机坐标系下控制点坐标是相同的。于是问题转为求此时相机坐标系下控制点坐标,此时先假设四个局部坐标系下控制点坐标,通过控制点坐标与观测坐标对应关系,即针孔相机投影,每一对匹配点,可以得到两个方程。把所有配对点都联立方程,得到一个12个未知数,
2
n
\!2n\!
2n个方程的齐次方程组,求解这个方程,方法为求矩阵零特征值的特征向量。由于方程组解系中非共线解向量数量和矩阵的秩与12的差值有关,这里只考虑有1到4个非共线解向量的情况。求得解后,再通过世界坐标系下控制点坐标与局部坐标系下控制点坐标具有相同的相对位置关系,得到解系中系数,从而得到相机坐标系下控制点坐标。这样就把3D-2D的关联,转为3D-3D的关联,最后使用带匹配关系的ICP算法,得到两个坐标系下的R和t。这时候会有四组解,取其中重投影误差最小的一组解为最后的解。
其中求解解系中系数时,可以用高斯牛顿法建立世界坐标系下控制点相对坐标与局部坐标系下相对坐标之差,对系数进一步优化。
所以这些算法,都是线性代数,非线性优化。
下面对该算法进行介绍:
与其他方法相比,EPnP方法的复杂度为O(n),对于点对数量较多的PnP问题,非常高效。
核心思想是将3D点表示为4个控制点的组合,优化也只针对4个控制点,所以速度很快,在求解 Mx=0时,最多考虑了4个奇异向量,因此精度也很高。
第一步,选择世界坐标系下控制点坐标:
选择3D点的质心,作为第一个控制点,
c 1 w = 1 n ∑ i = 1 n P i w \bm{c}_1^w=\frac{1}{n}\sum_{i=1}^{n} \bm{P}_i^w c1w=n1∑i=1nPiw
对n个3D点进行去重心操作:
A
=
[
(
P
1
w
)
T
−
(
c
1
w
)
t
⋯
(
P
n
w
)
T
−
(
c
1
w
)
t
]
\bm{A}=\begin{bmatrix} (\bm{P}_1^w)^T-(\bm{c}_1^w)^t \\ \cdots \\ (\bm{P}_n^w)^T-(\bm{c}_1^w)^t \end{bmatrix}
A=
(P1w)T−(c1w)t⋯(Pnw)T−(c1w)t
计算A的协方差矩阵,并求其特征值与对应的特征向量,剩余的三个控制点,由这三个特征值与特征向量构成:
c 2 w = c 1 w + λ 1 V 1 c 3 w = c 1 w + λ 2 V 2 c 4 w = c 1 w + λ 3 V 3 \begin{aligned} &\mathbf{c}_2^{w} = \mathbf{c}_1^{w} + \sqrt{\lambda_1}\mathbf{V}_1 \\ &\mathbf{c}_3^{w} = \mathbf{c}_1^{w} + \sqrt{\lambda_2}\mathbf{V}_2 \\ &\mathbf{c}_4^{w} = \mathbf{c}_1^{w} + \sqrt{\lambda_3}\mathbf{V}_3 \\ \end{aligned} c2w=c1w+λ1V1c3w=c1w+λ2V2c4w=c1w+λ3V3
第二步,求解齐次重心坐标,也就是在上面的控制点坐标系下的坐标:
P i w = ∑ j = 1 4 α i j c j w , w i t h ∑ j = 1 4 α i j = 1 \bm{P}_{i}^{w}=\sum_{j=1}^{4}\alpha_{ij}\bm{c}_{j}^{w},\quad with \, \sum_{j=1}^{4}\alpha_{ij}=1 Piw=∑j=14αijcjw,with∑j=14αij=1
建立3D点坐标与控制点坐标关系:
[
P
i
w
1
]
=
C
[
α
i
1
α
i
2
α
i
3
α
i
4
]
=
[
c
1
w
c
2
w
c
3
w
c
4
w
1
1
1
1
]
[
α
i
1
α
i
2
α
i
3
α
i
4
]
\begin{bmatrix} \bm{P}_{i}^{w} \\ 1 \end{bmatrix} = \bm{C} \begin{bmatrix} \alpha_{i1} \\ \alpha_{i2} \\ \alpha_{i3} \\ \alpha_{i4} \\ \end{bmatrix} = \begin{bmatrix} \bm{c}_1^{w} & \bm{c}_2^{w} & \bm{c}_3^{w} & \bm{c}_4^{w} \\ 1 & 1 & 1 & 1 \end{bmatrix} \begin{bmatrix} \alpha_{i1} \\ \alpha_{i2} \\ \alpha_{i3} \\ \alpha_{i4} \end{bmatrix}
[Piw1]=C
αi1αi2αi3αi4
=[c1w1c2w1c3w1c4w1]
αi1αi2αi3αi4
及:
[
α
i
1
α
i
2
α
i
3
α
i
4
]
4
×
1
=
[
c
1
w
c
2
w
c
3
w
c
4
w
1
1
1
1
]
4
×
4
−
1
[
P
i
w
1
]
4
×
1
=
C
−
1
[
P
i
w
1
]
\begin{bmatrix} \alpha_{i1} \\ \alpha_{i2} \\ \alpha_{i3} \\ \alpha_{i4} \end{bmatrix}_{4\times1} = \begin{bmatrix} \bm{c}_1^{w} & \bm{c}_2^{w} & \bm{c}_3^{w} & \bm{c}_4^{w} \\ 1 & 1 & 1 & 1 \end{bmatrix}_{4\times 4}^{-1} \begin{bmatrix} \bm{P}_i^w \\ 1 \end{bmatrix}_{4\times1} = \bm{C}^{-1} \begin{bmatrix} \bm{P}_i^w \\ 1 \end{bmatrix}
αi1αi2αi3αi4
4×1=[c1w1c2w1c3w1c4w1]4×4−1[Piw1]4×1=C−1[Piw1]
对于世界坐标系与当前相机坐标系下观测点之间转换关系,有:
c
j
c
=
[
R
t
]
[
c
j
w
1
]
\mathbf{c}_{j}^{c} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} \mathbf{c}_{j}^{w} \\ 1 \end{bmatrix}
cjc=[Rt][cjw1]
p i c = [ R t ] [ p i w 1 ] = [ R t ] [ ∑ j = 1 4 α i j c j w 1 ] \mathbf{p}_{i}^{c} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} \mathbf{p}_{i}^{w} \\ 1 \end{bmatrix} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} \sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{w} \\ 1 \end{bmatrix} pic=[Rt][piw1]=[Rt][∑j=14αijcjw1]
p
i
c
=
[
R
t
]
[
∑
j
=
1
4
α
i
j
c
j
w
∑
j
=
1
4
α
i
j
]
=
∑
j
=
1
4
α
i
j
[
R
t
]
[
c
j
w
1
]
=
∑
j
=
1
4
α
i
j
c
j
c
\mathbf{p}_{i}^{c} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} \sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{w} \\ \sum_{j=1}^{4} \alpha_{i j} \end{bmatrix} = \sum_{j=1}^{4} \alpha_{i j} \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \begin{bmatrix} \mathbf{c}_{j}^{w} \\ 1 \end{bmatrix} = \sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{c}
pic=[Rt][∑j=14αijcjw∑j=14αij]=j=1∑4αij[Rt][cjw1]=j=1∑4αijcjc
即,相机坐标系下控制点也是由世界坐标系下控制点刚体转换而来的,而控制点的系数不变。
第三步,在相机坐标系下,使用控制点坐标系数,建立观测方程:
w
i
[
u
i
v
i
1
]
=
[
f
u
0
u
c
0
f
v
v
c
0
0
1
]
∑
j
=
1
4
α
i
j
[
x
j
c
y
j
c
z
j
c
]
w_i \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} = \begin{bmatrix} f_u & 0 & u_c \\ 0 & f_v & v_c \\ 0 & 0 & 1 \end{bmatrix} \sum_{j=1}^{4}\alpha_{ij} \begin{bmatrix} x_j^{c} \\ y_j^c \\ z_j^c \end{bmatrix}
wi
uivi1
=
fu000fv0ucvc1
∑j=14αij
xjcyjczjc
从而可以得到两个线性方程:
$$
∑
j
=
1
4
α
i
j
f
u
x
j
c
+
α
i
j
(
u
c
−
u
i
)
z
j
c
=
0
∑
j
=
1
4
α
i
j
f
v
y
j
c
+
α
i
j
(
v
c
−
v
j
)
z
j
c
=
0
\begin{aligned} &\sum_{j=1}^{4}\alpha_{ij}f_ux_j^c + \alpha_{ij}(u_c-u_i)z_j^c=0 \\ &\sum_{j=1}^{4}\alpha_{ij}f_vy_j^c+\alpha_{ij}(v_c-v_j)z_j^c=0 \end{aligned}
j=1∑4αijfuxjc+αij(uc−ui)zjc=0j=1∑4αijfvyjc+αij(vc−vj)zjc=0
把所有n 个点串联起来,我们可以得到一个线性方程组:
上式中,齐次重心坐标,相机内参数和2D像点坐标都是已知量,未知量是4个控制点在相机坐标系下的坐标。共12个位置参数,一个像点可以列2个方程,n 个像点可以列出2n 个方程。
其中 x = [ c 1 c T , c 2 c T , c 3 c T , c 4 c T ] \text{x}=[c_1^{c^T},c_2^{c^T},c_3^{c^T},c_4^{c^T}] x=[c1cT,c2cT,c3cT,c4cT], x \text{x} x就是控制点在摄像头坐标系下的坐标,显然这是一个 12 × 1 12 \times 1 12×1的向量,且 x \text{x} x在 M M M的右零空间中,或者 x ∈ k e r ( M ) \text{x}\in ker(M) x∈ker(M):
x = ∑ i = 1 N β i v i \text{x}=\sum_{i=1}^{N}\beta_i \text{v}_i x=∑i=1Nβivi
上式中, v i \text{v}_i vi是 M M M的 N N N个零特征值对应的 N N N特征向量。对于第 i i i个控制点:
c i c = ∑ k = 1 N β k v k [ i ] \bm{c}_i^c=\sum_{k=1}^N \beta_k \text{v}_k^{[i]} cic=∑k=1Nβkvk[i]
求得特征向量后,还需要求解系数β,该步通过世界坐标系下控制点相对坐标与局部坐标系下控制点相对坐标一样来解决:
根据仿真发现
M
T
M
M^TM
MTM为0的特征值的个数喝摄像头的焦距有关(注意:是和焦距有关,而不是和参考点的位置有关!),EPnP算法建议只考虑
N
=
1
,
2
,
3
,
4
N=1,2,3,4
N=1,2,3,4的情况。摄像头的外参描述的只是坐标变换,不会改变控制点之间的距离
,
∥
c
i
c
−
c
j
c
∥
2
=
∥
c
i
w
−
c
j
w
∥
2
\left \| \bm{c}_i^c - \bm{c}_j^c \right \|^2=\left \| \bm{c}_i^w - \bm{c}_j^w \right \|^2
cic−cjc
2=
ciw−cjw
2,
∥
∑
k
=
1
N
β
k
v
k
[
i
]
−
∑
k
=
1
N
β
k
v
k
[
j
]
∥
2
=
∥
c
i
w
−
c
j
w
∥
2
\left \| \sum_{k=1}^{N}\beta_k \bm{\text{v}}_k^{[i]}-\sum_{k=1}^{N}\beta_k \bm{\text{v}}_k^{[j]} \right\|^2 = \left \| \bm{c}_i^w - \bm{c}_j^w \right \|^2
∑k=1Nβkvk[i]−∑k=1Nβkvk[j]
2=
ciw−cjw
2
这是一个关于
{
β
k
}
k
=
1
,
⋯
,
N
\{\beta_k\}_{k=1,\cdots,N}
{βk}k=1,⋯,N的二次方程,这个方程的特点是没有关于
{
β
}
k
=
1
,
⋯
,
N
\{\beta\}_{k=1,\cdots,N}
{β}k=1,⋯,N的一次项。如果将这些二次项
β
i
β
j
\beta_i\beta_j
βiβj变量替换为
β
i
j
\beta_{ij}
βij,那么该方程是
{
β
i
j
}
i
,
j
=
1
,
⋯
,
N
\{\beta_{ij}\}_{i,j=1,\cdots,N}
{βij}i,j=1,⋯,N的线性方程了。对于4个控制点,可以得到
C
4
2
=
6
C_{4}^{2}=6
C42=6个这样的方程。
如果不挖掘任何附加条件,
N
N
N取不同值的时候,新的线性未知数的个数分别为:
○
N
=
1
N=1
N=1,线性未知数的个数为1;
○
N
=
2
N=2
N=2,线性未知数的个数为3;
○
N
=
3
N=3
N=3,线性未知数的个数为6;
○
N
=
4
N=4
N=4,线性未知数的个数为10;
N
=
4
N\!=\!4\!
N=4的时候,未知数的个数多于方程的个数了。注意到
β
a
b
β
c
d
=
β
a
β
b
β
c
β
d
=
β
a
′
b
′
β
c
′
d
′
\!\beta_{ab}\beta_{cd}\!=\!\beta_{a}\beta_{b}\beta_{c}\beta_{d}\!=\beta_{a'b'}\beta_{c'd'}\!
βabβcd=βaβbβcβd=βa′b′βc′d′,其中
{
a
′
,
b
′
,
c
′
,
d
′
}
\!\{a',b',c',d'\}\!
{a′,b′,c′,d′}是
{
a
,
b
,
c
,
d
}
\{a,b,c,d \}
{a,b,c,d}的一个排列,我们可以减少未知数的个数。举例,如果我们求出了
β
11
,
β
12
,
β
13
\beta_{11},\beta_{12},\beta_{13}
β11,β12,β13,那么我们可以得到
β
23
=
β
12
β
13
β
11
\beta_{23}=\frac{\beta_{12}\beta_{13}}{\beta_{11}}
β23=β11β12β13。这样,即使对于
N
=
4
N=4
N=4,我们也可以求解出
{
β
i
j
}
i
,
j
=
1
,
⋯
,
N
\{\beta_{ij}\}_{i,j=1,\cdots,N}
{βij}i,j=1,⋯,N了。
高斯-牛顿最优化
优化的目标函数为:
Error
(
β
)
=
∑
(
i
,
j
)
s
.
t
.
i
<
j
(
∥
c
i
c
−
c
j
c
∥
2
−
∥
c
i
w
−
c
j
w
∥
2
)
2
\text{Error}(\beta)=\sum_{(i,j)s.t.\,\,i<j}\left( \left\| \bm{c}_i^{c} - \bm{c}_j^c \right\|^2 - \left\| \bm{c}_i^{w} - \bm{c}_j^w \right\|^2\right)^2
Error(β)=∑(i,j)s.t.i<j(
cic−cjc
2−
ciw−cjw
2)2
这是一个无约束的非线性最优化问题,简单。
求得系数后,便可以得到世界坐标系下3D点坐标在相机坐标系下坐标,接下来使用icp算法进行求解。
icp算法求解的步骤为:
Step1:计算点云质心坐标
P
c
c
=
1
n
∑
i
=
1
n
P
i
c
\begin{aligned} &\bm{\text{P}}_c^c=\frac{1}{n}\sum_{i=1}^{n}\bm{P}_i^c \end{aligned}
Pcc=n1i=1∑nPic
P
c
w
=
1
n
∑
i
=
1
n
P
i
w
\begin{aligned} &\bm{\text{P}}_c^w=\frac{1}{n}\sum_{i=1}^{n}\bm{P}_i^w \end{aligned}
Pcw=n1i=1∑nPiw
Step2:点云去质心
P
ˉ
c
=
[
(
p
1
c
)
T
−
(
p
c
c
)
T
⋯
(
p
n
c
)
T
−
(
p
c
c
)
T
]
\bm{\bar{\text{P}}}^c= \begin{bmatrix} ({\bm{\text{p}}_1^c})^T-({\bm{\text{p}}_c^c})^T \\ \cdots \\ ({\bm{\text{p}}_n^c})^T-({\bm{\text{p}}_c^c})^T \end{bmatrix}
Pˉc=
(p1c)T−(pcc)T⋯(pnc)T−(pcc)T
P
ˉ
c
=
[
(
p
1
w
)
T
−
(
p
c
w
)
T
⋯
(
p
n
w
)
T
−
(
p
c
w
)
T
]
\bm{\bar{\text{P}}}^c= \begin{bmatrix} ({\bm{\text{p}}_1^w})^T-({\bm{\text{p}}_c^w})^T \\ \cdots \\ ({\bm{\text{p}}_n^w})^T-({\bm{\text{p}}_c^w})^T \end{bmatrix}
Pˉc=
(p1w)T−(pcw)T⋯(pnw)T−(pcw)T
Step3:计算旋转矩阵 R \text{R} R
W
=
(
P
ˉ
c
)
T
P
ˉ
w
\text{W}=\left(\bm{\bar{\text{P}}}^c\right)^T \bm{\bar{\text{P}}}^w
W=(Pˉc)TPˉw
[
U
Σ
V
]
=
SVD
(
W
)
[\bm{\text{U}\Sigma \text{V}}]=\text{SVD}(\bm{\text{W}})
[UΣV]=SVD(W)
R
=
UV
T
\bm{\text{R}}=\bm{\text{UV}^T}
R=UVT
如果 d e t ( R ) < 0 , R ( 2 , : ) = − R ( 2 , : ) det(\bm{\text{R}})<0,\,\bm{\text{R}}(2,:)=-\bm{\text{R}}(2,:) det(R)<0,R(2,:)=−R(2,:)
Step4:计算平移向量t
t = p c c − Rp c w \bm{\text{t}}=\bm{\text{p}}_c^c-\bm{\text{Rp}}_c^w t=pcc−Rpcw
注意上面提到R和t有四种情况的解,最后通过计算反投影误差。采用反投影误差最小的求解结果。
ICP
ICP方法是用于求解
3
D
−
3
D
\!\!3\text{D}\!-\!3\text{D}\!\!
3D−3D的位姿估计问题,ICP算法为迭代最近点算法,是求两个点云之间精配准的算法,其流程主要如下:
(一) 寻找最近点
(二) 计算loss,得到当前使loss最小的旋转和平移
(三) 变换原点云,再次寻找最近点
(四) 判断此时距离是否小于某个阈值,即收敛,没有则再次回到1进行迭代。
计算的loss函数如下,其中pt,ps为target点云下对应点及source点云下对应点。
R ∗ , t ∗ = arg min R , t 1 ∣ P s ∣ ∑ i = 1 ∣ P s ∣ ∣ p t i − ( R ⋅ p s i + t ) ∣ 2 R^\ast,t^\ast=\arg{\min\limits_{R,t} }\frac{1}{{\left|P_s\right|} } \sum_{i=1}^{\left|P_s\right|}{\left|p_t^i-\left(R\cdot p_s^i+t\right)\right|^2} R∗,t∗=argR,tmin∣Ps∣1∑i=1∣Ps∣ pti−(R⋅psi+t) 2
第一步,寻找最近点,有如下两种方法:
1.设置距离阈值,当点与点距离小于一定阈值就认为找到了对应点,不用遍历完整个点集;
2.使用 ANN(Approximate Nearest Neighbor) 加速查找,常用的有 KD-tree;KD-tree 建树的计算复杂度为 O(N log(N)),查找通常复杂度为 O(log(N))(最坏情况下 O(N))。
第二步,寻找最优变换
对于 point-to-point ICP 问题,求最优变换是有闭形式解(closed-form solution)的,可以借助 SVD 分解来计算。
计算两个点云的质心μt, μs
μ p = 1 n ∑ i = 1 n p i μ q = 1 n ∑ i = 1 n q i \mu_p=\frac{1}{n}\sum_{i=1}^{n}p_i \mu_q=\frac{1}{n} \sum_{i=1}^{n}q_i μp=n1∑i=1npiμq=n1∑i=1nqi
对匹配点距离误差进行变换:
1
2
∑
i
=
1
n
∥
q
i
−
Rp
i
−
t
∥
2
=
1
2
∑
i
=
1
n
∥
q
i
−
Rp
i
−
t
−
(
μ
q
−
R
μ
p
)
+
(
μ
q
−
R
μ
p
)
∥
2
=
1
2
∑
i
=
1
n
∥
(
q
i
−
μ
q
−
R
(
p
i
−
μ
p
)
)
+
(
μ
q
−
R
μ
p
−
t
)
∥
2
=
1
2
∑
i
=
1
n
(
∥
q
i
−
μ
q
−
R
(
p
i
−
μ
p
)
∥
2
+
∥
μ
q
−
R
μ
p
−
t
∥
2
+
2
(
q
i
−
μ
q
−
R
(
p
i
−
μ
p
)
)
T
(
μ
q
−
R
μ
p
−
t
)
)
\begin{aligned} &\frac{1}{2}\sum_{i=1}^{n} \left\| \bm{\text{q}}_i-\bm{\text{Rp}}_i- \bm{\text{t}} \right\|^2 \\ =&\frac{1}{2}\sum_{i=1}^{n} \left\| \bm{\text{q}}_i-\bm{\text{Rp}}_i- \bm{\text{t}} - (\mu_q-\bm{\text{R}\mu}_p)+(\bm{\mu}_q-\bm{\text{R}\mu}_p) \right\|^2 \\ =&\frac{1}{2}\sum_{i=1}^{n} \left\| \bm{(\text{q}}_i-\bm{\mu}_q - \bm{\text{R}}(\bm{\text{p}}_i-\bm{\mu_p}))+(\bm{\mu}_q-\bm{\text{R}\mu}_p -\bm{\text{t}}) \right\|^2 \\ =&\frac{1}{2}\sum_{i=1}^{n}\left( \left\| \bm{\text{q}}_i-\bm{\mu}_q - \bm{\text{R}}(\bm{\text{p}}_i-\bm{\mu_p}) \right\|^2+ \left\| \bm{\mu}_q-\bm{\text{R}\mu}_p -\bm{\text{t}} \right\|^2+ 2(\bm{\text{q}}_i-\bm{\mu_q}-\bm{\text{R}}(\bm{\text{p}}_i-\bm{\mu_p}))^T (\bm{\mu_q}-\bm{\text{R}}\bm{\mu_p-t}) \right) \end{aligned}
===21i=1∑n∥qi−Rpi−t∥221i=1∑n
qi−Rpi−t−(μq−Rμp)+(μq−Rμp)
221i=1∑n
(qi−μq−R(pi−μp))+(μq−Rμp−t)
221i=1∑n(
qi−μq−R(pi−μp)
2+
μq−Rμp−t
2+2(qi−μq−R(pi−μp))T(μq−Rμp−t))
对于最后一项,有
∑ i = 1 n ( q i − μ q − R ( p i − μ p ) ) T ( μ q − R μ p − t ) = ( μ q − R μ p − t ) T ∑ i = 1 n ( q i − μ q − R ( p i − μ p ) ) = ( μ q − R μ p − t ) T ( n μ q − n μ q − R ( n μ p − n μ p ) ) = 0 \begin{aligned} &\sum_{i=1}^{n} (\bm{q}_i - \bm{\mu}_q - \bm{R}(\bm{p}_i - \bm{\mu}_p))^T (\bm{\mu}_q - \bm{R}\bm{\mu}_p - \bm{t}) \\ &= (\bm{\mu}_q - \bm{R}\bm{\mu}_p - \bm{t})^T \sum_{i=1}^{n} (\bm{q}_i - \bm{\mu}_q - \bm{R}(\bm{p}_i - \bm{\mu}_p)) \\ &= (\bm{\mu}_q - \bm{R}\bm{\mu}_p - \bm{t})^T (n\bm{\mu}_q - n\bm{\mu}_q - \bm{R}(n\bm{\mu}_p - n\bm{\mu}_p)) \\ &= \bm{0} \end{aligned} i=1∑n(qi−μq−R(pi−μp))T(μq−Rμp−t)=(μq−Rμp−t)Ti=1∑n(qi−μq−R(pi−μp))=(μq−Rμp−t)T(nμq−nμq−R(nμp−nμp))=0
再进一步变换:
令 p i ′ = p i − μ p , q i ′ = q i − μ q \bm{\text{p}}_i^{\prime}=\bm{\text{p}}_i-\bm{\mu}_p,\,\bm{\text{q}}_i^{\prime}=\bm{\text{q}}_i-\bm{\mu}_q pi′=pi−μp,qi′=qi−μq,目标函数简化为:
1 2 ∑ i = 1 n ( ∥ q i ′ − R p i ′ ∥ 2 + ∥ μ q − R μ p − t ∥ 2 ) \frac{1}{2}\sum_{i=1}^{n}\left(\left\| \bm{\text{q}}_i^{\prime}-\bm{\text{R}}\bm{\text{p}}_i^{\prime} \right\|^2+\left\| \bm{\mu}_q-\bm{\text{R}}\bm{\mu}_p-\bm{t} \right\|^2\right) 21∑i=1n(∥qi′−Rpi′∥2+ μq−Rμp−t 2)
设 R ∗ , t ∗ \bm{\text{R}}^\ast,\bm{\text{t}}^\ast R∗,t∗为最优解,可以将优化变为如下问题:
(一)
R
∗
=
arg min
R
1
2
∑
i
=
1
n
∥
q
i
′
−
R
p
i
′
∥
2
\bm{\text{R}}^\ast=\argmin_{\bm{\text{R}}}\frac{1}{2}\sum_{i=1}^{n}\left\| \bm{\text{q}}_i^\prime-\bm{\text{R}}\bm{\text{p}}_i^\prime \right\|^2
R∗=argminR21∑i=1n∥qi′−Rpi′∥2
(二)
t
∗
=
μ
q
−
R
μ
p
\bm{\text{t}}^\ast = \bm{\mu}_q-\bm{\text{R}}\bm{\mu}_p
t∗=μq−Rμp
对于第一步,有:
R
∗
=
arg
min
R
1
2
∑
i
=
1
n
(
(
q
i
′
)
T
q
i
+
(
p
i
′
)
T
R
T
R
p
i
′
−
2
(
q
i
′
)
T
R
p
i
′
)
=
arg
min
R
1
2
∑
i
=
1
n
(
(
q
i
′
)
T
q
i
+
I
−
2
(
q
i
′
)
T
R
p
i
′
)
=
arg
min
R
∑
i
=
1
n
−
(
q
i
′
)
T
R
p
i
′
\begin{aligned} \bm{R}^\ast &= \arg\min_{\bm{R}} \frac{1}{2} \sum_{i=1}^{n} \left( (\bm{q}_i^\prime)^T \bm{q}_i + (\bm{p}_i^\prime)^T \bm{R}^T\bm{R} \bm{p}_i^\prime - 2(\bm{q}_i^\prime)^T \bm{R} \bm{p}_i^\prime \right) \\ &= \arg\min_{\bm{R}} \frac{1}{2} \sum_{i=1}^{n} \left( (\bm{q}_i^\prime)^T \bm{q}_i + \bm{I} - 2(\bm{q}_i^\prime)^T \bm{R} \bm{p}_i^\prime \right) \\ &= \arg\min_{\bm{R}} \sum_{i=1}^{n} -(\bm{q}_i^\prime)^T \bm{R} \bm{p}_i^\prime \end{aligned}
R∗=argRmin21i=1∑n((qi′)Tqi+(pi′)TRTRpi′−2(qi′)TRpi′)=argRmin21i=1∑n((qi′)Tqi+I−2(qi′)TRpi′)=argRmini=1∑n−(qi′)TRpi′
对这个优化,有如下最优解:
令 W = ∑ i = 1 n q i ′ p i ′ T \bm{\text{W}}=\sum_{i=1}^{n}\bm{\text{q}}_i^\prime {\bm{\text{p}}_i^\prime}^T W=∑i=1nqi′pi′T,通过SVD分解有
W = U Σ V T \bm{\text{W}}=\bm{\text{U}}\Sigma\bm{\text{V}}^T W=UΣVT
求得旋转和平移为:
当 W \bm{\text{W}} W满秩事有:
Σ = [ σ 1 0 0 0 σ 2 0 0 0 σ 3 ] \Sigma= \begin{bmatrix} \sigma_1 & 0 & 0 \\ 0 & \sigma_2 & 0 \\ 0 & 0 & \sigma_3 \end{bmatrix} Σ= σ1000σ2000σ3
且对应唯一的 U , V \bm{\text{U}},\bm{\text{V}} U,V组合,对应地
R ∗ = U V T t ∗ = μ q − R μ p \begin{aligned} &\bm{\text{R}}^\ast=\bm{\text{U}}\bm{\text{V}}^T \\ &\bm{\text{t}}^\ast=\bm{\mu}_q-\bm{\text{R}}\bm{\mu}_p \end{aligned} R∗=UVTt∗=μq−Rμp
一般需要对求得的旋转矩阵进行检查,即判断其是否为一个旋转矩阵,判断方式如下:
最后还需要进行Orientation rectification,即验证
R
∗
=
V
U
T
\bm{R}^\ast=\bm{V}\bm{U}^T
R∗=VUT是不是一个旋转矩阵(检查是否有
∣
R
∣
=
1
|R|=1
∣R∣=1, 因为存在
∣
R
∣
=
−
1
|R|=-1
∣R∣=−1的可能,此时
R
R
R表示的不是旋转而是一个reflection,所以我们还要给上述优化解加上一个
∣
R
∣
=
1
|R|=1
∣R∣=1的约束)。
根据矩阵行列式的性质,以及
U,V
\bm{\text{U,V}}
U,V都是正交阵:
∣ M ∣ = ∣ V T ∣ ∣ U ∣ ∣ R ∣ = ∣ V T ∣ ∣ U ∣ = ± 1 \begin{aligned} |\bm{M}|&=|\bm{V}^T||\bm{U}||\bm{R}| \\ &=|\bm{V}^T||\bm{U}|=\pm1 \end{aligned} ∣M∣=∣VT∣∣U∣∣R∣=∣VT∣∣U∣=±1
如果 ∣ V U T ∣ = 1 \!|VUT|\!=\!1\! ∣VUT∣=1,则 ∣ M ∣ = 1 \!|M|\!=\!1\! ∣M∣=1, R ∗ = V U T \!\bm{R}^\ast\!=\!VU^T\! R∗=VUT已经给出最有旋转:如果 ∣ V U T ∣ = − 1 \!|VU^T|\!=\!-1\! ∣VUT∣=−1,则 ∣ M ∣ = − 1 \!|M|\!=\!-1\! ∣M∣=−1,我们需要求解此时的 R \!R\! R,也就是分析 M \!M\! M应该具有何种形式。经分析可得出结论:当 ∣ M ∣ = − 1 \!|M|\!=\!-1\! ∣M∣=−1时,使得 t r a c e ( Σ M ) \!trace(\Sigma M)\! trace(ΣM)最大的 M M M为:
M = [ 1 0 0 0 1 0 0 0 − 1 ] M= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} M= 10001000−1
综合考虑 ∣ M ∣ = 1 \!|M|\!=\!1\! ∣M∣=1和 ∣ M ∣ = − 1 \!|M|\!=\!-1\! ∣M∣=−1两种情况,我们可以得到:
R ∗ = V [ 1 0 0 0 1 0 0 0 ∣ V U T ∣ ] U T R^\ast=V \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & |VU^T| \end{bmatrix} U^T R∗=V 10001000∣VUT∣ UT
第三步,迭代
每一次迭代我们都会得到当前的最优变换参数
R
k
,
t
k
R_k,t_k\!
Rk,tk,然后将该变换作用于当前源点云;"找最近对应点"和"求解最优变换"这两步不停迭代进行,直到满足迭代终止条件,常用的终止条件有:
1.
R
k
,
t
k
R_k,t_k\!
Rk,tk的变化量小于一定值
2.loss 变化量小于一定值
3.达到最大迭代次数
迭代结束后,把所有的平移和旋转求和,就是我们要求的平移和旋转了。
参考:https://www.guyuehome.com/46511