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