1.问题描述
给定两个在d维空间中对应的点集合
P
=
{
p
1
,
p
2
,
…
,
p
n
}
P = \{ p_1,p_2 ,\dots , p_n\}
P={p1,p2,…,pn}和
Q
=
{
q
1
,
q
2
,
…
,
q
n
}
Q = \{ q_1 ,q_2, \dots , q_n \}
Q={q1,q2,…,qn},为了计算出它们之间的刚体变换,即
R
R
R 和
t
t
t,可以将其建模为如下的数学形式:
(
R
,
t
)
=
a
r
g
m
i
n
∑
i
=
1
n
w
i
∣
∣
(
R
p
i
+
t
)
−
q
i
∣
∣
2
(1)
(R,t)=argmin \sum_{i=1}^n w_i||(Rp_i+t)-q_i||^2 \tag{1}
(R,t)=argmini=1∑nwi∣∣(Rpi+t)−qi∣∣2(1)
w
i
w_i
wi 表示每个点对之间的权重。
2. 计算转移矩阵
首先,对公式(1)求导,可以得到:
0
=
∂
F
∂
t
=
∑
i
=
1
n
2
w
i
(
R
p
i
+
t
−
q
i
)
=
2
t
(
∑
i
=
1
n
w
i
)
+
2
R
(
∑
i
=
1
n
w
i
p
i
)
−
2
∑
i
=
1
n
w
i
q
i
(2)
0=\frac{\partial F}{\partial t} = \sum_{i=1}^{n}2w_i(Rp_i +t-q_i) = 2t(\sum_{i=1}^nw_i)+ 2R(\sum_{i=1}^nw_ip_i)-2\sum_{i=1}^{n}w_iq_i \tag{2}
0=∂t∂F=i=1∑n2wi(Rpi+t−qi)=2t(i=1∑nwi)+2R(i=1∑nwipi)−2i=1∑nwiqi(2)
现在,引入点集合P的中心点
p
^
\hat p
p^和点集合Q的中心点
q
^
\hat q
q^,它们分别为:
p
^
=
∑
i
=
1
n
w
i
p
i
∑
i
=
1
n
w
i
q
^
=
∑
i
=
1
n
w
i
q
i
∑
i
=
1
n
w
i
(3)
\hat p = \frac{\sum_{i=1}^{n}w_ip_i}{\sum_{i=1}^{n}w_i} \\ \hat q = \frac{\sum_{i=1}^{n}w_iq_i}{\sum_{i=1}^{n}w_i} \tag{3}
p^=∑i=1nwi∑i=1nwipiq^=∑i=1nwi∑i=1nwiqi(3)
公式(2)两边同时除以,
∑
i
=
1
n
w
i
\sum_{i=1}^nw_i
∑i=1nwi则得到:
0
∑
i
=
1
n
w
i
=
2
t
(
∑
i
=
1
n
w
i
)
∑
i
=
1
n
w
i
+
2
R
(
∑
i
=
1
n
w
i
p
i
)
∑
i
=
1
n
w
i
−
2
∑
i
=
1
n
w
i
q
i
∑
i
=
1
n
w
i
0
=
2
t
+
2
R
p
^
−
2
q
^
q
^
−
R
p
^
=
t
(4)
\frac{0}{\sum_{i=1}^nw_i} = \frac{2t(\sum_{i=1}^nw_i)}{\sum_{i=1}^nw_i}+ \frac{2R(\sum_{i=1}^nw_ip_i)}{\sum_{i=1}^nw_i}-\frac{2\sum_{i=1}^{n}w_iq_i }{\sum_{i=1}^nw_i}\\ 0 = 2t+2R\hat p-2\hat q \\ \hat q-R\hat p = t \tag{4}
∑i=1nwi0=∑i=1nwi2t(∑i=1nwi)+∑i=1nwi2R(∑i=1nwipi)−∑i=1nwi2∑i=1nwiqi0=2t+2Rp^−2q^q^−Rp^=t(4)
将等式
t
=
q
^
−
R
p
^
t = \hat q-R\hat p
t=q^−Rp^替换到公式(1)可以得到:
∑
i
=
1
n
w
i
∣
∣
(
R
p
i
+
t
)
−
q
i
∣
∣
2
=
∑
i
=
1
n
w
i
∣
∣
R
p
i
+
q
^
−
R
p
^
−
q
i
∣
∣
2
=
∑
i
=
1
n
w
i
∣
∣
R
(
p
i
−
p
^
)
−
(
q
i
−
q
^
)
∣
∣
2
(5)
\sum_{i=1}^n w_i||(Rp_i+t)-q_i||^2\\ = \sum_{i=1}^n w_i||Rp_i+ \hat q-R\hat p -q_i||^2 \\= \sum_{i=1}^n w_i||R(p_i-\hat p)-(q_i-\hat q)||^2 \tag{5}
i=1∑nwi∣∣(Rpi+t)−qi∣∣2=i=1∑nwi∣∣Rpi+q^−Rp^−qi∣∣2=i=1∑nwi∣∣R(pi−p^)−(qi−q^)∣∣2(5)
公式(5)看出,我们可以利用集合
X
X
X和集合
Y
Y
Y表示
p
i
−
p
^
p_i-\hat p
pi−p^和
q
i
−
q
^
q_i-\hat q
qi−q^,用
x
i
x_i
xi和
y
i
y_i
yi分别表示新数据集合中的点。
x
i
:
=
p
i
−
p
^
y
i
:
=
q
i
−
q
^
(6)
x_i : = p_i-\hat p \\ y_i := q_i - \hat q \tag{6}
xi:=pi−p^yi:=qi−q^(6)
这时所以公式(1)可以等价于为:
R
=
a
r
g
m
i
n
∑
i
=
1
n
w
i
∣
∣
R
x
i
−
y
i
∣
∣
2
(7)
R = argmin\sum_{i=1}^{n} w_i ||Rx_i-y_i||^2 \tag{7}
R=argmini=1∑nwi∣∣Rxi−yi∣∣2(7)
3. 计算旋转矩阵
首先,扩展公式(7):
∑
i
=
1
n
∣
∣
R
x
i
−
y
i
∣
∣
2
=
(
R
x
i
−
y
i
)
T
(
R
x
i
−
y
i
)
=
(
x
i
T
R
T
−
y
i
T
)
(
R
x
i
−
y
i
)
=
x
i
T
R
T
R
x
i
−
y
i
T
R
x
i
−
x
i
T
R
T
y
i
+
y
i
T
y
i
=
R
T
R
=
I
x
i
T
x
i
−
y
i
T
R
x
i
−
x
i
T
R
T
y
i
+
y
i
T
y
i
(8)
\sum_{i=1}^{n} ||Rx_i-y_i||^2 = (Rx_i - y_i)^T(Rx_i-y_i)=(x_i^TR^T-y_i^T)(Rx_i-y_i)\\ = x_i^T R^T R x_i -y_i^TRx_i-x_i^T R^Ty_i + y_i^Ty_i \\ \overset{R^TR=I}{=}x_i^Tx_i -y_i^TRx_i -x_i^TR^Ty_i + y_i^Ty_i \tag{8}
i=1∑n∣∣Rxi−yi∣∣2=(Rxi−yi)T(Rxi−yi)=(xiTRT−yiT)(Rxi−yi)=xiTRTRxi−yiTRxi−xiTRTyi+yiTyi=RTR=IxiTxi−yiTRxi−xiTRTyi+yiTyi(8)
在公式(8)中,需要注意的是:
x
i
T
R
T
y
i
x_i^TR^Ty_i
xiTRTyi是一个标量,因为在集合中的每个点
x
i
x_i
xi是
1
×
d
1\times d
1×d维的矢量,旋转矩阵
R
R
R是一个
d
×
d
d\times d
d×d维度的矩阵,
y
i
y_i
yi 是一个
d
×
1
d\times 1
d×1的矢量。
[
]
1
×
d
[
]
d
×
d
[
]
d
×
1
=
[
]
1
×
1
\left[\right]_{1\times d}\left[\right]_{d\times d} \left[\right]_{d\times 1} = \left[\right]_{1\times 1}
[]1×d[]d×d[]d×1=[]1×1
对任意的标量a,它满足
a
T
=
a
a^T = a
aT=a,且在公式(8)中:
x
i
T
R
T
y
i
=
(
x
i
T
R
T
y
i
)
T
=
y
i
T
R
x
i
x_i^T R^T y_i = (x_i^T R^Ty_i)^T=y_i^T R x_i
xiTRTyi=(xiTRTyi)T=yiTRxi
所以公式(8)可以变成:
∣
∣
R
x
i
−
y
i
∣
∣
2
=
x
i
T
x
i
−
2
y
i
T
R
x
i
+
y
i
T
y
i
(9)
||Rx_i-y_i||^2 =x_i^Tx_i -2y_i^TRx_i+y_i^Ty_i \tag{9}
∣∣Rxi−yi∣∣2=xiTxi−2yiTRxi+yiTyi(9)
现在重新对公式(9)进行扩展,我们可以看出:
a
r
g
m
i
n
∑
i
=
1
n
w
i
∣
∣
R
x
i
−
y
i
∣
∣
2
=
a
r
g
m
i
n
∑
i
=
1
n
w
i
(
x
i
T
x
i
−
2
y
i
T
R
x
i
+
y
i
T
y
i
)
=
a
r
g
m
i
n
(
∑
i
=
1
n
w
i
x
i
T
x
i
−
2
∑
i
=
1
n
w
i
y
i
T
R
x
i
+
∑
i
=
1
n
w
i
y
i
T
y
i
)
argmin\sum_{i=1}^n w_i || Rx_i - y_i||^2 = argmin\sum_{i=1}^n w_i(x_i^Tx_i -2y_i^TRx_i+y_i^Ty_i) \\ =argmin(\sum_{i=1}^nw_ix_i^Tx_i - 2\sum_{i=1}^nw_iy_i^TRx_i+\sum_{i=1}^nw_iy_i^Ty_i)
argmini=1∑nwi∣∣Rxi−yi∣∣2=argmini=1∑nwi(xiTxi−2yiTRxi+yiTyi)=argmin(i=1∑nwixiTxi−2i=1∑nwiyiTRxi+i=1∑nwiyiTyi)
因为
∑
i
=
1
n
w
i
x
i
T
x
i
\sum_{i=1}^n w_i x_i^Tx_i
∑i=1nwixiTxi 和
∑
i
=
1
n
w
i
y
i
T
y
i
\sum_{i=1}^{n} w_i y_i^T y_i
∑i=1nwiyiTyi 不依赖于旋转矩阵
R
R
R,所以
a
r
g
m
i
n
∑
i
=
1
n
w
i
∣
∣
R
x
i
−
y
i
∣
∣
2
=
a
r
g
m
i
n
(
−
2
∑
i
=
1
n
w
i
y
i
T
R
x
i
)
=
a
r
g
m
a
x
(
∑
i
=
1
n
w
i
y
i
T
R
x
i
)
argmin\sum_{i=1}^n w_i || Rx_i - y_i||^2 =argmin(-2 \sum_{i=1}^{n} w_i y_i^TRx_i) = argmax(\sum_{i=1}^{n} w_i y_i^TRx_i)
argmini=1∑nwi∣∣Rxi−yi∣∣2=argmin(−2i=1∑nwiyiTRxi)=argmax(i=1∑nwiyiTRxi)
另外,
∑
i
=
1
n
w
i
y
i
T
R
x
i
=
[
w
1
w
2
⋱
w
n
]
[
y
1
T
y
2
T
⋮
y
n
T
]
[
R
]
[
x
1
x
2
⋯
x
n
]
=
[
w
1
y
1
T
w
2
y
2
T
⋮
w
n
y
n
]
[
R
x
1
R
x
2
⋯
R
x
n
]
=
[
w
1
y
1
T
R
x
1
w
2
y
2
T
R
x
2
⋱
w
n
y
n
T
R
x
n
]
\sum_{i=1}^{n} w_i y_i^T R x_i = \left[ \begin{matrix}w_1 & & & \\ & w_2 & & \\ & & \ddots & \\ & & & w_n \end{matrix} \right] \left[ \begin{matrix} y_1^T \\ y_2^T \\ \vdots \\ y_n^T \end{matrix}\right] \left [ \begin{matrix} & & & \\ & R & \\ & & &\end{matrix}\right] \left[ \begin{matrix} x_1 & x_2 & \cdots & x_n \end{matrix} \right] \\ =\left[ \begin{matrix} w_1 y_1^T \\ w_2 y_2^T \\ \vdots \\ w_n y_n\end{matrix} \right] \left[ \begin{matrix} Rx_1 & Rx_2 & \cdots & Rx_n \end{matrix} \right] \\ = \left[ \begin{matrix} w_1y_1^TRx_1 & & & \\ & w_2y_2^TRx_2 & & \\ & & \ddots & \\ & & & w_ny_n^TRx_n \end{matrix} \right]
i=1∑nwiyiTRxi=⎣⎢⎢⎡w1w2⋱wn⎦⎥⎥⎤⎣⎢⎢⎢⎡y1Ty2T⋮ynT⎦⎥⎥⎥⎤⎣⎡R⎦⎤[x1x2⋯xn]=⎣⎢⎢⎢⎡w1y1Tw2y2T⋮wnyn⎦⎥⎥⎥⎤[Rx1Rx2⋯Rxn]=⎣⎢⎢⎡w1y1TRx1w2y2TRx2⋱wnynTRxn⎦⎥⎥⎤
所以,我们可以得到
∑
i
=
1
n
w
i
y
i
T
R
x
i
=
t
r
(
W
Y
T
R
X
)
\sum_{i=1}^{n} w_i y_i^T R x_i =tr(WY^TRX)
i=1∑nwiyiTRxi=tr(WYTRX)
其中,
W
=
d
i
a
g
(
w
1
,
.
.
.
,
w
n
)
W =diag(w_1,...,w_n)
W=diag(w1,...,wn) ,
Y
=
[
y
1
y
2
⋯
y
n
]
T
Y = \left[ \begin{matrix} y_1 & y_2 & \cdots & y_n \end{matrix} \right]^T
Y=[y1y2⋯yn]T ,
X
=
[
x
1
x
2
⋯
x
n
]
X = \left[ \begin{matrix} x_1 & x_2 & \cdots & x_n \end{matrix} \right]
X=[x1x2⋯xn]
且矩阵的迹满足某种特性,
t
r
(
A
B
)
=
t
r
(
B
A
)
tr(AB) = tr(BA)
tr(AB)=tr(BA)
则,
∑
i
=
1
n
w
i
y
i
T
R
x
i
=
t
r
(
W
Y
T
R
X
)
=
t
r
(
(
W
Y
T
)
(
R
X
)
)
=
t
r
(
(
R
X
)
(
W
Y
T
)
)
=
t
r
(
R
X
W
Y
T
)
\sum_{i=1}^{n} w_i y_i^T R x_i =tr(WY^TRX) = tr ((WY^T)(RX))=tr ((RX)(WY^T))=tr(RXWY^T)
i=1∑nwiyiTRxi=tr(WYTRX)=tr((WYT)(RX))=tr((RX)(WYT))=tr(RXWYT)
令
S
=
X
W
Y
T
S = XWY^T
S=XWYT
∑
i
=
1
n
w
i
y
i
T
R
x
i
=
t
r
(
R
X
W
Y
T
)
=
S
=
X
W
Y
T
t
r
(
R
S
)
=
S
V
D
t
r
(
R
U
Σ
V
T
)
=
t
r
(
(
Σ
V
T
)
(
R
U
)
)
=
t
r
(
Σ
V
T
R
U
)
\sum_{i=1}^{n} w_i y_i^T R x_i =tr(RXWY^T)\overset{S = XWY^T} {=}tr(RS)\overset{SVD}{=}tr(RU\Sigma V^T) =tr((\Sigma V^T) (RU))=tr(\Sigma V^T RU)
i=1∑nwiyiTRxi=tr(RXWYT)=S=XWYTtr(RS)=SVDtr(RUΣVT)=tr((ΣVT)(RU))=tr(ΣVTRU)
需要注意的是:
V
V
V,
R
R
R,
U
U
U是正交矩阵,所以
M
=
V
T
R
U
M = V^T RU
M=VTRU同样也是正交矩阵。这也意味这在矩阵M中,每一列的向量
m
j
m_j
mj,
m
j
T
m
j
=
1
m_j^T m_j = 1
mjTmj=1,因此,
t
r
(
Σ
M
)
=
(
σ
1
σ
2
⋱
σ
d
)
(
m
11
m
12
⋯
m
1
d
m
21
m
22
⋯
m
2
d
⋮
⋮
⋱
⋮
m
d
1
m
d
2
⋯
m
d
d
)
=
∑
i
=
1
d
σ
i
m
i
i
≤
∑
i
=
1
d
σ
i
tr(\Sigma M) = \left(\begin{matrix} \sigma_1 & & & \\ & \sigma_2 & & \\ & & \ddots & \\ & & & \sigma_d \end{matrix} \right) \left(\begin{matrix} m_{11} & m_{12} & \cdots & m_{1d} \\ m_{21} & m_{22} & \cdots & m_{2d} \\ \vdots & \vdots & \ddots & \vdots \\ m_{d1} & m_{d2} & \cdots & m_{dd} \end{matrix} \right) = \sum_{i=1}^{d} \sigma_i m_{ii} \leq \sum_{i=1}^{d} \sigma_i
tr(ΣM)=⎝⎜⎜⎛σ1σ2⋱σd⎠⎟⎟⎞⎝⎜⎜⎜⎛m11m21⋮md1m12m22⋮md2⋯⋯⋱⋯m1dm2d⋮mdd⎠⎟⎟⎟⎞=i=1∑dσimii≤i=1∑dσi
为了求得最大化的R,
a
r
g
m
a
x
(
∑
i
=
1
n
w
i
y
i
T
R
x
i
)
argmax(\sum_{i=1}^{n} w_i y_i^TRx_i)
argmax(∑i=1nwiyiTRxi),则
I
=
M
=
V
T
R
U
V
=
R
U
R
=
V
U
T
I = M = V^T RU \\ V = RU \\ R = VU^T
I=M=VTRUV=RUR=VUT
计算出R之后,转移矩阵
t
t
t为:
t
=
q
^
−
R
p
^
t = \hat q - R \hat p
t=q^−Rp^
总结一下:
给定两个在d维空间中对应的点集合 P = { p 1 , p 2 , … , p n } P = \{ p_1,p_2 ,\dots , p_n\} P={p1,p2,…,pn}和 Q = { q 1 , q 2 , … , q n } Q = \{ q_1 ,q_2, \dots , q_n \} Q={q1,q2,…,qn},为了计算出它们之间的刚体变换,即 R R R 和 t t t,其过程如下:
- 构建上述问题的模型为:
( R , t ) = a r g m i n ∑ i = 1 n w i ∣ ∣ ( R p i + t ) − q i ∣ ∣ 2 (R,t)=argmin \sum_{i=1}^n w_i||(Rp_i+t)-q_i||^2 (R,t)=argmini=1∑nwi∣∣(Rpi+t)−qi∣∣2
2.对两个点集合进行去中心化,得到新的点集合 X X X和 Y Y Y,表示为:
p ^ = ∑ i = 1 n w i p i ∑ i = 1 n w i q ^ = ∑ i = 1 n w i q i ∑ i = 1 n w i x i : = p i − p ^ y i : = q i − q ^ \hat p = \frac{\sum_{i=1}^{n}w_ip_i}{\sum_{i=1}^{n}w_i} \\ \hat q = \frac{\sum_{i=1}^{n}w_iq_i}{\sum_{i=1}^{n}w_i} \\ x_i : = p_i-\hat p \\ y_i := q_i - \hat q p^=∑i=1nwi∑i=1nwipiq^=∑i=1nwi∑i=1nwiqixi:=pi−p^yi:=qi−q^
此时,转移矩阵
t = q ^ − R p ^ t = \hat q - R \hat p t=q^−Rp^ - 步骤一中的问题转化为:
R = argmin ∑ i = 1 n w i ∣ ∣ R x i − y i ∣ ∣ 2 = argmax ∑ i = 1 n w i y i T R x i = argmax t r ( W Y T R X ) = argmax t r ( R X W Y T ) = argmax t r ( R X W Y T ) = S V D argmax t r ( R U Σ V T ) = argmax t r ( Σ V T R U ) R = \text{argmin} \sum_{i=1}^{n} w_i ||Rx_i-y_i||^2 \\ = \text{argmax} \sum_{i=1}^n w_i y_i^T R x_i \\ =\text{argmax} ~ tr(WY^T R X) \\ = \text{argmax} ~tr(R X WY^T ) \\ =\text{argmax} ~ tr(R X WY^T) \\ \overset{SVD}{=}\text{argmax} ~tr(R U\Sigma V^T ) =\text{argmax} ~tr(\Sigma V^TR U ) R=argmini=1∑nwi∣∣Rxi−yi∣∣2=argmaxi=1∑nwiyiTRxi=argmax tr(WYTRX)=argmax tr(RXWYT)=argmax tr(RXWYT)=SVDargmax tr(RUΣVT)=argmax tr(ΣVTRU) - 为了使得
t
r
(
Σ
V
T
R
U
)
tr(\Sigma V^TR U )
tr(ΣVTRU)达到最大值,
I = V T R U I = V^TR U I=VTRU
逐步化简:
V = R U R = V U T V = RU \\ R = VU^T V=RUR=VUT
所以, t t t可以根据公式 t = q ^ − R q ^ t = \hat q - R \hat q t=q^−Rq^ 计算出来。
至此,就计算出两个点集合之间的选装矩阵 R R R和转移矩阵 t t t。另外,针对本章的推导,我写了一小段python代码验证了一下,有兴趣的可以看一下。计算两个对应点集之间的旋转矩阵R和转移矩阵T
【参考文献】
【1】Least-Squares Rigid Motion Using SVD