一 问题背景
在自动驾驶和SLAM中,经常遇到问题,知道3D世界的点集P = [x y z 1]‘,和相机观测到的在2D世界的点坐标P’=[u v 1]',如何利用这些对应点集求解位姿即R和t。
在前面两篇文章中已经介绍了普适方法,直接求误差函数对位姿向量的雅克比矩阵,然后利用高斯牛顿发进行优化,前面介绍的方法是普遍适用的方法。本节介绍的方法,只对点集匹配求解姿态适用。
二 问题建模
如下式所示,对于一组匹配点,列出一个公式。多组匹配点存在时,需要求解t1~t12。
s
[
u
v
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
]
s\begin{bmatrix} u \\ v \\1 \end{bmatrix} =\begin{bmatrix} t_1 & t_2&t_3 & t_4 \newline t_5& t_6 & t_7 & t_8 \newline t_9 & t_{10} & t_{11} & t_{12} \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}
s
uv1
=
t1t5t9t2t6t10t3t7t11t4t8t12
xyz1
令:
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
\mathbf{t_1} = \begin{bmatrix} t_1 & t_2&t_3 & t_4 \end{bmatrix}^T \newline \mathbf{t_2} = \begin{bmatrix} t_5 & t_6&t_7& t_8 \end{bmatrix}^T \newline \mathbf{t_3} = \begin{bmatrix}t_9&t_{10}& t_{11}&t_{12}\end{bmatrix}^T
t1=[t1t2t3t4]Tt2=[t5t6t7t8]Tt3=[t9t10t11t12]T
由上面的式子可得如下两个方程:
t
1
T
P
−
u
t
3
T
P
=
0
t
2
T
P
−
v
t
3
T
P
=
0
\mathbf{t_1}^TP-u\mathbf{t_3}^TP=0\newline \mathbf{t_2}^TP-v\mathbf{t_3}^TP=0
t1TP−ut3TP=0t2TP−vt3TP=0
即
[
P
T
0
−
u
P
T
0
P
T
−
u
P
T
]
[
t
1
t
2
t
3
]
=
0
\begin{bmatrix} P^T & 0 &-uP^T \newline 0 & P^T &-uP^T \end{bmatrix} \begin{bmatrix} \mathbf{t_1} \\ \mathbf{t_2}\\\mathbf{t_3} \end{bmatrix} =0
[PT00PT−uPT−uPT]
t1t2t3
=0
存在n个点时,存在2n 个方程组。
问题因此成为求解如下齐次方程最优解。
A
∗
t
=
0
A*\mathbf{t}=0
A∗t=0
三 问题求解
求解上述问题需要n大于等于6。对A矩阵求SVD分解。
[
U
Σ
V
T
]
=
s
v
d
(
A
)
\begin{bmatrix} U & \Sigma & V^T \end{bmatrix}=svd(A)
[UΣVT]=svd(A)
t 向量为V矩阵的最后一列,因此求得t1~t12。注意,此时求解结果没有加入尺度s,因此会存在一个尺度效应。
t
=
β
V
(
:
,
e
n
d
)
\mathbf{t} = \beta V(:,end)
t=βV(:,end)
进一步可以求出旋转:
R
‾
=
[
t
1
t
2
t
3
t
5
t
6
t
7
t
9
t
10
t
11
]
\overline{R} = \begin{bmatrix} t1 & t2 & t3 \\ t5 & t6 & t7 \\ t9 & t10 & t11 \end{bmatrix}
R=
t1t5t9t2t6t10t3t7t11
此时估计的 R不是标准旋转矩阵,进一步对其进行SVD分解
[
U
Σ
V
T
]
=
s
v
d
(
R
‾
)
\begin{bmatrix} U & \Sigma & V^T \end{bmatrix}=svd(\overline{R} )
[UΣVT]=svd(R)
R
=
±
U
V
T
R = \pm UV^T
R=±UVT
理论上,Sigma的对角线上元素应该非常接近,根据对角线元素可以求出尺度因子。
β
=
±
(
t
r
(
Σ
)
/
3
)
\beta = \pm (tr(\Sigma )/3)
β=±(tr(Σ)/3)
符号问题可以通过在相机坐标系下的Z一定大于0求得:
β
∗
t
3
T
∗
P
>
0
\beta *\mathbf{t_3}^T*P>0
β∗t3T∗P>0
t
=
[
t
4
t
8
t
12
]
′
t = \begin{bmatrix} t_4 & t_8 & t_{12} \end{bmatrix}'
t=[t4t8t12]′