ORB-SLAM闭环端相似变换
论文:Closed-form solution of absolute orientation using unit quaternions
参考资料
[1]Horn B K P . Closed-form solution of absolute orientation using unit quaternions[J]. Journal of the Optical Society of America A, 1987, 4(4):629-642.
[3] 一起学ORBSLAM2(10)ORBSLAM中的相似变换矩阵的计算
问题模型
如上图,已知空间中有
n
n
n个三维点,它们能够被两个不同的笛卡尔直角坐标系测量到,在
L
\mathbf{L}
L坐标系下三维点坐标为
r
i
l
,
i
=
1
,
.
.
.
,
n
r_i^l, \ i=1,...,n
ril, i=1,...,n,在
R
\mathbf{R}
R坐标系下三维点坐标为
r
i
r
,
i
=
1
,
.
.
.
,
n
r_i^r, \ i=1,...,n
rir, i=1,...,n,需要求解两坐标系间的相似变换
S
i
m
3
Sim3
Sim3:
[
s
R
t
0
1
]
\begin{bmatrix} sR & t\\ 0 & 1 \end{bmatrix}
[sR0t1]
这个问题实际上是3D点对运动估计的问题(3D-3D),3D-3D问题一般使用ICP方法求6自由度的解,但是该问题是求相似变换,多了尺度因子
s
s
s,因此是求7自由度的解。
相似变换矩阵各参数意义可参考高翔博士《视觉SLAM十四讲》。
求解方法
1. 计算旋转 R R R
选取3对匹配点,在 L \mathbf{L} L坐标系中为 [ r l , 1 , r l , 2 , r l , 3 ] [r_{l,1},r_{l,2},r_{l,3}] [rl,1,rl,2,rl,3]和在 R \mathbf{R} R坐标系中为 [ r r , 1 , r r , 2 , r r , 3 ] [r_{r,1},r_{r,2},r_{r,3}] [rr,1,rr,2,rr,3],重建左右两边的坐标系,如下图:
x
l
^
=
x
l
∣
∣
x
l
∣
∣
y
l
^
=
y
l
∣
∣
y
l
∣
∣
z
l
^
=
x
l
^
×
y
l
^
(1)
\hat{x_l}=\frac{x_l}{||x_l||} \\ \hat{y_l}=\frac{y_l}{||y_l||} \\ \hat{z_l}=\hat{x_l} \times \hat{y_l} \tag1
xl^=∣∣xl∣∣xlyl^=∣∣yl∣∣ylzl^=xl^×yl^(1)
其中
x
l
=
r
l
,
2
−
r
l
,
1
y
l
=
(
r
l
,
3
−
r
l
,
1
)
−
[
(
r
l
,
3
−
r
l
,
1
)
⋅
x
l
^
]
x
l
^
(1)
x_l=r_{l,2}-r_{l,1}\\ y_l=(r_{l,3}-r_{l,1})-[(r_{l,3}-r_{l,1})\cdot \hat{x_l}]\hat{x_l} \tag1
xl=rl,2−rl,1yl=(rl,3−rl,1)−[(rl,3−rl,1)⋅xl^]xl^(1)
右边坐标同理建立新的坐标系,且令:
M
l
=
∣
x
l
^
,
y
l
^
,
z
l
^
∣
M
r
=
∣
x
r
^
,
y
r
^
,
z
r
^
∣
(2)
M_l=|\hat{x_l},\hat{y_l},\hat{z_l}| \\ M_r=|\hat{x_r},\hat{y_r},\hat{z_r}| \tag2
Ml=∣xl^,yl^,zl^∣Mr=∣xr^,yr^,zr^∣(2)
如果左边坐标系有一个向量
r
l
r_l
rl,那么计算
M
l
T
r
l
M_l^Tr_l
MlTrl(注:属于绝对变换,
M
T
=
M
−
1
M^T=M^{-1}
MT=M−1,因为
M
M
M是正交矩阵)可以将其转换到世界坐标系下,再将其转到右边坐标系下:
r
r
=
M
r
M
l
T
r
l
(3)
r_r=M_rM_l^Tr_l \tag3
rr=MrMlTrl(3)
显然可得到两坐标系间(从左侧坐标系旋转到右侧坐标系)的旋转矩阵:
R
=
M
r
M
l
T
(4)
R=M_rM_l^T \tag4
R=MrMlT(4)
2. 计算平移量 t t t
找 n n n对匹配点对,在左右坐标系中分别为 { r l , i } \{r_{l,i}\} {rl,i}和 { r r , i } \{r_{r,i}\} {rr,i}, i = 1 , . . . , n i=1,...,n i=1,...,n。
匹配点之间经相似变换
S
i
m
3
Sim3
Sim3:
r
r
=
s
R
(
r
l
)
+
r
0
(5)
r_r=sR(r_l)+r_0 \tag5
rr=sR(rl)+r0(5)
其中
s
s
s是尺度因子,
R
R
R是旋转矩阵,
r
0
r_0
r0是坐标系间的平移量。
但是事实上,除非匹配点对数据非常完美,否则式(5)难以精确地求出平移向量,因此我们可以使用最小二乘法的思路去求解,设置平移量的残差为:
e
i
=
r
r
,
i
−
s
R
(
r
l
,
i
)
−
r
0
(6)
e_i=r_{r,i}-sR(r_{l,i})-r_0 \tag6
ei=rr,i−sR(rl,i)−r0(6)
构建最小二乘问题:
m
i
n
∑
i
=
1
n
∣
∣
e
i
∣
∣
2
(7)
min\sum_{i=1}^{n}||e_i||^2 \tag7
mini=1∑n∣∣ei∣∣2(7)
就匹配点对在各坐标系下的质心:
r
l
ˉ
=
1
n
∑
i
=
1
n
r
l
,
i
,
r
r
ˉ
=
1
n
∑
i
=
1
n
r
r
,
i
(8)
\bar{r_l}=\frac{1}{n}\sum_{i=1}^{n}r_{l,i}, \ \ \bar{r_r}=\frac{1}{n}\sum_{i=1}^{n}r_{r,i} \tag8
rlˉ=n1i=1∑nrl,i, rrˉ=n1i=1∑nrr,i(8)
定义新的坐标系:
r
l
,
i
′
=
r
l
,
i
−
r
l
ˉ
,
r
r
,
i
′
=
r
r
,
i
−
r
r
ˉ
(9)
r'_{l,i}=r_{l,i}-\bar{r_l}, \ \ \ \ r'_{r,i}=r_{r,i}-\bar{r_r} \tag9
rl,i′=rl,i−rlˉ, rr,i′=rr,i−rrˉ(9)
显然:
∑
i
=
1
n
r
l
,
i
′
=
0
,
∑
i
=
1
n
r
r
,
i
′
=
0
(10)
\sum_{i=1}^nr'_{l,i}=0, \ \ \ \ \sum_{i=1}^nr'_{r,i}=0 \tag{10}
i=1∑nrl,i′=0, i=1∑nrr,i′=0(10)
式(6)可重新表达成:
e
i
=
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
−
r
0
′
r
0
′
=
r
0
−
r
r
ˉ
+
s
R
(
r
l
ˉ
)
(11)
e_i=r'_{r,i}-sR(r'_{l,i})-r'_0 \\ r'_0=r_0-\bar{r_r}+sR(\bar{r_l}) \tag{11}
ei=rr,i′−sR(rl,i′)−r0′r0′=r0−rrˉ+sR(rlˉ)(11)
最小二乘问题:
m
i
n
∑
i
=
1
n
∣
∣
e
i
∣
∣
2
=
m
i
n
∑
i
=
1
n
∣
∣
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
−
r
0
′
∣
∣
2
(12)
min\sum_{i=1}^{n}||e_i||^2 = min\sum_{i=1}^{n}||r'_{r,i}-sR(r'_{l,i})-r'_0||^2 \\ \tag{12}
mini=1∑n∣∣ei∣∣2=mini=1∑n∣∣rr,i′−sR(rl,i′)−r0′∣∣2(12)
其中:
∑
i
=
1
n
∣
∣
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
−
r
0
′
∣
∣
2
=
∑
i
=
1
n
∣
∣
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
∣
∣
2
−
2
r
0
′
⋅
∑
i
=
1
n
[
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
]
+
n
∣
∣
r
0
′
∣
∣
2
(13)
\sum_{i=1}^{n}||r'_{r,i}-sR(r'_{l,i})-r'_0||^2 \\ =\sum_{i=1}^{n}||r'_{r,i}-sR(r'_{l,i})||^2-2r'_0\cdot \sum_{i=1}^{n}[r'_{r,i}-sR(r'_{l,i})]+n||r'_0||^2 \tag{13}
i=1∑n∣∣rr,i′−sR(rl,i′)−r0′∣∣2=i=1∑n∣∣rr,i′−sR(rl,i′)∣∣2−2r0′⋅i=1∑n[rr,i′−sR(rl,i′)]+n∣∣r0′∣∣2(13)
根据(10),可知式(13)的第二项为0,第一项与
r
0
′
r'_0
r0′无关,第三项不可能为负,容易知当且仅当
r
0
′
=
0
r'_0=0
r0′=0时,残差项之和最小,根据(11),得到:
r
0
=
r
r
ˉ
−
s
R
(
r
l
ˉ
)
(14)
r_0=\bar{r_r}-sR(\bar{r_l})\tag{14}
r0=rrˉ−sR(rlˉ)(14)
当
r
0
′
=
0
r'_0=0
r0′=0时,残差项可以写成:
e
i
=
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
(15)
e_i=r'_{r,i}-sR(r'_{l,i})\tag{15}
ei=rr,i′−sR(rl,i′)(15)
最小二乘问题(12)改写成:
m
i
n
∑
i
=
1
n
∣
∣
e
i
∣
∣
2
=
m
i
n
∑
i
=
1
n
∣
∣
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
∣
∣
(16)
min\sum_{i=1}^{n}||e_i||^2 = min\sum_{i=1}^{n}||r'_{r,i}-sR(r'_{l,i})|| \tag{16}
mini=1∑n∣∣ei∣∣2=mini=1∑n∣∣rr,i′−sR(rl,i′)∣∣(16)
3. 计算尺度因子 s s s
现在的问题转化为寻找
s
s
s是的式子(16)的值最小,首先存在一条约束式:
∣
∣
R
(
r
l
,
i
′
)
∣
∣
2
=
∣
∣
r
l
,
i
′
∣
∣
2
(17)
||R(r'_{l,i})||^2=||r'_{l,i}||^2 \tag{17}
∣∣R(rl,i′)∣∣2=∣∣rl,i′∣∣2(17)
利用(17),将(16)展开得到:
∑
i
=
1
n
∣
∣
r
r
,
i
′
∣
∣
2
−
2
s
∑
i
=
1
n
r
r
,
i
′
⋅
R
(
r
l
,
i
′
)
+
s
2
∑
i
=
1
n
∣
∣
r
l
,
i
′
∣
∣
2
(18)
\sum_{i=1}^{n}||r'_{r,i}||^2-2s\sum_{i=1}^{n}r'_{r,i}\cdot R(r'_{l,i})+s^2 \sum_{i=1}^{n}||r'_{l,i}||^2 \tag{18}
i=1∑n∣∣rr,i′∣∣2−2si=1∑nrr,i′⋅R(rl,i′)+s2i=1∑n∣∣rl,i′∣∣2(18)
可以将上式各项缩写,表达成如下:
S
r
−
2
s
D
+
s
2
S
l
(19)
S_r-2sD+s^2S_l \tag{19}
Sr−2sD+s2Sl(19)
对(19)进行配方,得到:
∑
i
=
1
n
∣
∣
e
i
∣
∣
2
=
(
s
S
l
−
D
/
S
l
)
2
+
(
S
r
S
l
−
D
2
)
/
S
l
(20)
\sum_{i=1}^{n}||e_i||^2 =(s\sqrt{S_l}-D/\sqrt{S_l})^2+(S_rS_l-D^2)/S_l \tag{20}
i=1∑n∣∣ei∣∣2=(sSl−D/Sl)2+(SrSl−D2)/Sl(20)
(20)中只有第一项与
s
s
s有关,因此为了使第一项的值最小,可以得到
s
s
s:
s
=
(
∑
i
=
1
n
r
r
,
i
′
⋅
R
(
r
l
,
i
′
)
)
/
∑
i
=
1
n
∣
∣
r
l
,
i
′
∣
∣
2
(21)
s=(\sum_{i=1}^{n}r'_{r,i}\cdot R(r'_{l,i}))/\sum_{i=1}^{n}||r'_{l,i}||^2\tag{21}
s=(i=1∑nrr,i′⋅R(rl,i′))/i=1∑n∣∣rl,i′∣∣2(21)
注:当已知两个系统中的一个系统的坐标比另一个系统的坐标精度高得多时,上述两个不对称结果中的一个可能是合适的。
如果两组测量中的误差相似,则对误差项使用对称表达式更为合理:
在最小二乘问题里,残差项(15)与下式等价:
e
i
=
1
s
r
r
,
i
′
−
s
R
(
r
l
,
i
′
)
(22)
e_i=\frac{1}{\sqrt{s}}r'_{r,i}-\sqrt{s}R(r'_{l,i}) \tag{22}
ei=s1rr,i′−sR(rl,i′)(22)
然后残差项之和为:
∑
i
=
1
n
∣
∣
e
i
∣
∣
2
=
1
s
∑
i
=
1
n
∣
∣
r
r
,
i
′
∣
∣
2
−
2
∑
i
=
1
n
r
r
,
i
′
⋅
R
(
r
l
,
i
′
)
+
s
∑
i
=
1
n
∣
∣
r
l
,
i
′
∣
∣
2
(23)
\sum_{i=1}^{n}||e_i||^2 =\frac{1}{s}\sum_{i=1}^{n}||r'_{r,i}||^2-2\sum_{i=1}^{n}r'_{r,i}\cdot R(r'_{l,i})+s\sum_{i=1}^{n}||r'_{l,i}||^2 \tag{23}
i=1∑n∣∣ei∣∣2=s1i=1∑n∣∣rr,i′∣∣2−2i=1∑nrr,i′⋅R(rl,i′)+si=1∑n∣∣rl,i′∣∣2(23)
同样可以缩写成:
1
s
S
r
−
2
D
+
s
S
l
(24)
\frac{1}{s}S_r-2D+sS_l \tag{24}
s1Sr−2D+sSl(24)
对(24)配方,得到:
(
s
S
l
−
1
s
S
r
)
2
+
2
(
S
l
S
r
−
D
)
(25)
(\sqrt{s}S_l-\frac{1}{\sqrt{s}}S_r)^2+2(S_lS_r-D) \tag{25}
(sSl−s1Sr)2+2(SlSr−D)(25)
显然当
s
=
S
r
/
S
l
s=S_r/S_l
s=Sr/Sl时使得第一项的值最小:
s
=
(
∑
i
=
1
n
∣
∣
r
r
,
i
′
∣
∣
2
/
∑
i
=
1
n
∣
∣
r
l
,
i
′
∣
∣
2
)
1
2
(26)
s=(\sum_{i=1}^{n}||r'_{r,i}||^2/\sum_{i=1}^{n}||r'_{l,i}||^2)^\frac{1}{2}\tag{26}
s=(i=1∑n∣∣rr,i′∣∣2/i=1∑n∣∣rl,i′∣∣2)21(26)
对称表达式求解结果的好处是:允许我们在不知道选择的情况下确定尺度因子
s
s
s。重要的是,旋转的确定不受我们选择比例因子的三个值之一的影响。
不过我们需要清楚的是,在ORB-SLAM2中,求尺度因子时采用了第一种方法,没有使用对称表达式。
在每种情况下,当D尽可能大时,误差能取得最小值。也就是说,我们必须选择使
∑
i
=
1
n
r
r
,
i
′
⋅
R
(
r
l
,
i
′
)
\sum_{i=1}^{n}r'_{r,i} \cdot R(r'_{l,i})
∑i=1nrr,i′⋅R(rl,i′)尽可能大的旋转值
R
R
R.
D
=
∑
i
=
1
n
r
r
,
i
′
⋅
R
(
r
l
,
i
′
)
(26-1)
D =\sum_{i=1}^{n}r'_{r,i} \cdot R(r'_{l,i}) \tag{26-1}
D=i=1∑nrr,i′⋅R(rl,i′)(26-1)
为了接下来的求解,将引入四元数表达,首先需要清楚一些定理。
定义两个四元数:
q
˙
=
q
0
+
i
q
x
+
j
q
y
+
k
q
z
r
˙
=
r
0
+
i
r
x
+
j
r
y
+
k
r
z
(27)
\dot{q}=q_0+iq_x+jq_y+kq_z \\ \tag{27} \dot{r}=r_0+ir_x+jr_y+kr_z
q˙=q0+iqx+jqy+kqzr˙=r0+irx+jry+krz(27)
两四元数乘积(需要注意不满足交换律):
r ˙ q = ( r 0 q 0 − r x q x − r y q y − r z q z ) + i ( r 0 q x + r x q 0 + r y q z − r z q y ) + j ( r 0 q y − r x q z + r y q 0 + r z q x ) + k ( r 0 q z + r x q y − r y q x + r z q 0 ) \begin{aligned} \dot{r} q=&\left(r_{0} q_{0}-r_{x} q_{x}-r_{y} q_{y}-r_{z} q_{z}\right) \\ &+i\left(r_{0} q_{x}+r_{x} q_{0}+r_{y} q_{z}-r_{z} q_{y}\right) \\ &+j\left(r_{0} q_{y}-r_{x} q_{z}+r_{y} q_{0}+r_{z} q_{x}\right) \\ &+k\left(r_{0} q_{z}+r_{x} q_{y}-r_{y} q_{x}+r_{z} q_{0}\right) \end{aligned} r˙q=(r0q0−rxqx−ryqy−rzqz)+i(r0qx+rxq0+ryqz−rzqy)+j(r0qy−rxqz+ryq0+rzqx)+k(r0qz+rxqy−ryqx+rzq0)
也可以表示成矩阵形式:
r
˙
q
˙
=
[
r
0
−
r
x
−
r
y
−
r
z
r
x
r
0
−
r
z
r
y
r
y
r
z
r
0
−
r
x
r
z
−
r
y
r
x
r
0
]
q
˙
=
I
R
q
˙
(28)
\dot{r}\dot{q}= \begin{bmatrix} r_0& -r_x& -r_y & -r_z\\ r_x& r_0& -r_z& r_y\\ r_y& r_z& r_0& -r_x\\ r_z& -r_y& r_x& r_0 \end{bmatrix} \dot{q} = \mathbb{I}\mathbb{R}\dot{q} \tag{28}
r˙q˙=⎣⎢⎢⎡r0rxryrz−rxr0rz−ry−ry−rzr0rx−rzry−rxr0⎦⎥⎥⎤q˙=IRq˙(28)
或者:
q
˙
r
˙
=
[
r
0
−
r
x
−
r
y
−
r
z
r
x
r
0
r
z
−
r
y
r
y
−
r
z
r
0
r
x
r
z
r
y
−
r
x
r
0
]
q
˙
=
I
R
ˉ
q
˙
(29)
\dot{q}\dot{r}= \begin{bmatrix} r_0& -r_x& -r_y & -r_z\\ r_x& r_0& r_z& -r_y\\ r_y& -r_z& r_0& r_x\\ r_z& r_y& -r_x& r_0 \end{bmatrix} \dot{q} = \bar{\mathbb{I}\mathbb{R}}\dot{q} \tag{29}
q˙r˙=⎣⎢⎢⎡r0rxryrz−rxr0−rzry−ryrzr0−rx−rz−ryrxr0⎦⎥⎥⎤q˙=IRˉq˙(29)
请注意,
I
R
\mathbb{I}\mathbb{R}
IR与
I
R
ˉ
\bar{\mathbb{I}\mathbb{R}}
IRˉ不同的是,右下角的3×3子矩阵是移位的。这再次说明了四元组乘法的非互换性。注意,
I
R
\mathbb{I}\mathbb{R}
IR和
I
R
ˉ
\bar{\mathbb{I}\mathbb{R}}
IRˉ的每一列(或每一行)的元素的平方之和等于:
r
0
2
+
r
x
2
+
r
y
2
+
r
z
2
(30)
r_0^2+r_x^2+r_y^2+r_z^2 \tag{30}
r02+rx2+ry2+rz2(30)
实际上就是
r
˙
⋅
r
˙
\dot{r}\cdot \dot{r}
r˙⋅r˙。
因此四元数的点乘实际就是向量点乘:
p
˙
⋅
q
˙
=
p
0
q
0
+
p
x
q
x
+
p
y
q
y
+
p
z
q
z
(31)
\dot{p}\cdot \dot{q}=p_0q_0+p_xq_x+p_yq_y+p_zq_z \tag{31}
p˙⋅q˙=p0q0+pxqx+pyqy+pzqz(31)
常用公式:
( q p ˙ ) ⋅ ( q ˙ r ˙ ) = ( q ˙ ⋅ q ˙ ) ( p ˙ ⋅ r ˙ ) , ( p q ˙ ) ⋅ r ˙ = p ˙ ⋅ ( r ˙ q ˙ ∗ ) , \begin{array}{r} (\dot{q p}) \cdot(\dot{q} \dot{r})=(\dot{q} \cdot \dot{q})(\dot{p} \cdot \dot{r}), \\ (\dot{p q}) \cdot \dot{r}=\dot{p} \cdot\left(\dot{r} \dot{q}^{*}\right), \end{array} (qp˙)⋅(q˙r˙)=(q˙⋅q˙)(p˙⋅r˙),(pq˙)⋅r˙=p˙⋅(r˙q˙∗),
向量可以用纯虚四元数来表示,例如有向量
r
⃗
=
(
x
,
y
,
z
)
T
\vec{r}=(x,y,z)^T
r=(x,y,z)T,可以将其表示为:
r
˙
=
0
+
i
x
+
j
y
+
k
z
(32)
\dot{r}=0+ix+jy+kz \tag{32}
r˙=0+ix+jy+kz(32)
对于纯虚四元数,有如下特性:
I
R
T
=
−
I
R
I
R
ˉ
T
=
−
I
R
ˉ
(33)
\mathbb{I}\mathbb{R}^T=-\mathbb{I}\mathbb{R} \\ \bar{\mathbb{I}\mathbb{R}}^T=-\bar{\mathbb{I}\mathbb{R}} \tag{33}
IRT=−IRIRˉT=−IRˉ(33)
使用四元数表示旋转:
r
˙
=
q
˙
r
˙
q
˙
∗
(34)
\dot{r}=\dot{q}\dot{r}\dot{q}^* \tag{34}
r˙=q˙r˙q˙∗(34)
根据(28)和(29),可以得到:
q
˙
r
˙
q
˙
∗
=
(
Q
r
˙
)
q
˙
∗
=
Q
ˉ
T
(
Q
r
˙
)
=
(
Q
ˉ
T
Q
)
r
˙
(35)
\dot{q}\dot{r}\dot{q}^*=(Q\dot{r})\dot{q}^*=\bar{Q}^T(Q\dot{r})=(\bar{Q}^TQ)\dot{r} \tag{35}
q˙r˙q˙∗=(Qr˙)q˙∗=QˉT(Qr˙)=(QˉTQ)r˙(35)
Q
ˉ
T
Q
=
[
q
˙
⋅
q
˙
0
0
0
0
(
q
0
2
+
q
x
2
−
q
y
2
−
q
z
2
)
2
(
q
x
q
y
−
q
0
q
z
)
2
(
q
x
q
z
+
q
0
q
y
)
0
2
(
q
y
q
x
+
q
0
q
z
)
(
q
0
2
−
q
x
2
+
q
y
2
−
q
z
2
)
2
(
q
y
q
z
−
q
0
q
x
)
0
2
(
q
z
q
x
−
q
0
q
y
)
2
(
q
z
q
y
+
q
0
q
x
)
(
q
0
2
−
q
x
2
−
q
y
2
+
q
z
2
)
]
\bar{Q}^{T} Q=\left[\begin{array}{cccc} \dot{q} \cdot \dot{q} & 0 & 0 & 0 \\ 0 & \left(q_{0}^{2}+q_{x}^{2}-q_{y}^{2}-q_{z}^{2}\right) & 2\left(q_{x} q_{y}-q_{0} q_{z}\right) & 2\left(q_{x} q_{z}+q_{0} q_{y}\right) \\ 0 & 2\left(q_{y} q_{x}+q_{0} q_{z}\right) & \left(q_{0}^{2}-q_{x}^{2}+q_{y}^{2}-q_{z}^{2}\right) & 2\left(q_{y} q_{z}-q_{0} q_{x}\right) \\ 0 & 2\left(q_{z} q_{x}-q_{0} q_{y}\right) & 2\left(q_{z} q_{y}+q_{0} q_{x}\right) & \left(q_{0}^{2}-q_{x}^{2}-q_{y}^{2}+q_{z}^{2}\right) \end{array}\right]
QˉTQ=⎣⎢⎢⎡q˙⋅q˙0000(q02+qx2−qy2−qz2)2(qyqx+q0qz)2(qzqx−q0qy)02(qxqy−q0qz)(q02−qx2+qy2−qz2)2(qzqy+q0qx)02(qxqz+q0qy)2(qyqz−q0qx)(q02−qx2−qy2+qz2)⎦⎥⎥⎤
因此,若
r
˙
\dot{r}
r˙为纯虚四元数的话,
r
˙
′
\dot{r}'
r˙′也是。如果
q
˙
⋅
q
˙
=
1
\dot{q}\cdot \dot{q}=1
q˙⋅q˙=1,
Q
ˉ
T
Q
\bar{Q}^TQ
QˉTQ的右下角3X3子矩阵必然是正交矩阵。实际上,可以看出
Q
ˉ
T
Q
\bar{Q}^TQ
QˉTQ的右下角3X3子矩阵就是我们需要寻找的旋转矩阵
R
R
R。并且有:
r
′
=
R
r
(36)
r'=Rr \tag{36}
r′=Rr(36)
4. 寻找最优旋转
根据前面的四元数知识,式(26-1)可以改写成:
D
=
∑
i
=
1
n
(
q
˙
r
˙
l
,
i
′
q
˙
∗
)
⋅
r
˙
l
,
i
′
=
∑
i
=
1
n
(
q
˙
r
˙
l
,
i
′
)
⋅
(
r
˙
l
,
i
′
q
˙
)
(37)
D=\sum_{i=1}^{n}(\dot{q}\dot{r}'_{l,i}\dot{q}^*)\cdot \dot{r}'_{l,i}\\ =\sum_{i=1}^{n}(\dot{q}\dot{r}'_{l,i})\cdot (\dot{r}'_{l,i}\dot{q}) \tag{37}
D=i=1∑n(q˙r˙l,i′q˙∗)⋅r˙l,i′=i=1∑n(q˙r˙l,i′)⋅(r˙l,i′q˙)(37)
q ˙ r l , i ′ = [ 0 − x l , i ′ − y l , i ′ − z l , i ′ x ′ l , i 0 z l , i ′ − y ′ l , i y ′ l , i − z l , i ′ 0 x l , i ′ z l , i ′ y l , i ′ − x l , i ′ 0 ] q ˙ = R ‾ l , i q ˙ \dot{q} r_{l, i}^{\prime}=\left[\begin{array}{cccc} 0 & -x_{l, i}^{\prime} & -y_{l, i}^{\prime} & -z_{l, i}^{\prime} \\ x^{\prime}{ }_{l, i} & 0 & z_{l, i}^{\prime} & -y^{\prime}{ }_{l, i} \\ y^{\prime}{ }_{l, i} & -z_{l, i}^{\prime} & 0 & x_{l, i}^{\prime} \\ z_{l, i}^{\prime} & y_{l, i}^{\prime} & -x_{l, i}^{\prime} & 0 \end{array}\right] \dot{q}=\overline{\mathbb{R}}_{l, i} \dot{q} q˙rl,i′=⎣⎢⎢⎡0x′l,iy′l,izl,i′−xl,i′0−zl,i′yl,i′−yl,i′zl,i′0−xl,i′−zl,i′−y′l,ixl,i′0⎦⎥⎥⎤q˙=Rl,iq˙
r ˙ r , i ′ q ˙ = [ 0 − x r , i ′ − y r , i ′ − z r , i ′ x r , i ′ 0 − z r , i ′ y ′ ′ y r , i ′ z r , i ′ 0 − x ′ r , i z r , i ′ − y r , i ′ x r , i ′ 0 ] q ˙ = R r , i q ˙ \dot{r}_{r, i}^{\prime} \dot{q}=\left[\begin{array}{cccc} 0 & -x_{r, i}^{\prime} & -y_{r, i}^{\prime} & -z_{r, i}^{\prime} \\ x_{r, i}^{\prime} & 0 & -z_{r, i}^{\prime} & y^{\prime}{ }^{\prime} \\ y_{r, i}^{\prime} & z_{r, i}^{\prime} & 0 & -x^{\prime}{ }_{r, i} \\ z_{r, i}^{\prime} & -y_{r, i}^{\prime} & x_{r, i}^{\prime} & 0 \end{array}\right] \dot{q}=\mathbb{R}_{r, i} \dot{q} r˙r,i′q˙=⎣⎢⎢⎡0xr,i′yr,i′zr,i′−xr,i′0zr,i′−yr,i′−yr,i′−zr,i′0xr,i′−zr,i′y′′−x′r,i0⎦⎥⎥⎤q˙=Rr,iq˙
因此(37)可以改写成:
∑
i
=
1
n
(
R
‾
l
,
i
q
˙
)
⋅
(
R
r
,
i
q
˙
)
\sum_{i=1}^{n}\left(\overline{\mathbb{R}}_{l, i} \dot{q}\right) \cdot\left(\mathbb{R}_{r, i} \dot{q}\right)
i=1∑n(Rl,iq˙)⋅(Rr,iq˙)
或者:
∑
i
=
1
n
q
˙
T
R
‾
l
,
i
T
R
r
,
i
q
˙
\sum_{i=1}^{n} \dot{q}^{T} \overline{\mathbb{R}}_{l, i}^{T} \mathbb{R}_{r, i} \dot{q}
i=1∑nq˙TRl,iTRr,iq˙
按照分配率,得到:
q
˙
T
(
∑
i
=
1
n
R
‾
l
,
i
T
R
r
,
i
)
q
˙
\dot{q}^{T}\left(\sum_{i=1}^{n} \overline{\mathbb{R}}_{l, i}^{T} \mathbb{R}_{r, i}\right) \dot{q}
q˙T(i=1∑nRl,iTRr,i)q˙
或者:
q
˙
∘
(
∑
i
=
1
n
N
i
)
⋅
q
˙
=
q
˙
T
N
q
˙
\dot{q}^{\circ}\left(\sum_{i=1}^{n} N_{i}\right) \cdot \dot{q}=\dot{q}^{T} N \dot{q}
q˙∘(i=1∑nNi)⋅q˙=q˙TNq˙
很容易可以证明当 N i N_i Ni矩阵是对称时, N N N也必然是对称矩阵。
存在一个矩阵
M
M
M:
M
=
∑
i
=
1
n
r
l
,
i
′
r
r
,
i
′
T
M=\sum_{i=1}^{n}r'_{l,i}r'^T_{r,i}
M=i=1∑nrl,i′rr,i′T
其元素是左坐标系中匹配点的坐标与右坐标系中匹配点的坐标之和。事实证明,这个矩阵包含了解决旋转最小二乘问题所需的所有信息。我们可以通过写出M的形式来区别各个元素:
M
=
[
S
x
x
S
x
y
S
x
z
S
y
x
S
y
y
S
y
z
S
z
x
S
z
y
S
z
z
]
(38)
M=\begin{bmatrix} S_{xx}& S_{xy} & S_{xz}\\ \tag{38} S_{yx}& S_{yy} & S_{yz}\\ S_{zx}& S_{zy} & S_{zz} \end{bmatrix}
M=⎣⎡SxxSyxSzxSxySyySzySxzSyzSzz⎦⎤(38)
其中
S
x
x
=
∑
i
=
1
n
x
l
,
i
′
x
r
,
i
′
S
x
y
=
∑
i
=
1
n
x
l
,
i
′
y
r
,
i
′
.
.
.
.
.
.
a
n
d
s
o
o
n
(39)
S_{xx}=\sum_{i=1}^{n}x'_{l,i}x'_{r,i}\\ S_{xy}=\sum_{i=1}^{n}x'_{l,i}y'_{r,i} \\ \tag{39} ......and\ so\ on
Sxx=i=1∑nxl,i′xr,i′Sxy=i=1∑nxl,i′yr,i′......and so on(39)
接着可以得到:
N = [ ( S x x + S y y + S z z ) S y z − S z y S z x − S x z S x y − S y x S y z − S z y ( S x x − S y y − S z z ) S x y + S y x S z x + S x z S z x − S x z S x y + S y x ( − S x x + S y y − S z z ) S y z + S z y S x y − S y x S z x + S x z S y z + S z y ( − S x x − S y y + S z z ) ] . N=\left[\begin{array}{cccc} \left(S_{x x}+S_{y y}+S_{z z}\right) & S_{y z}-S_{z y} & S_{z x}-S_{x z} & S_{x y}-S_{y x} \\ S_{y z}-S_{z y} & \left(S_{x x}-S_{y y}-S_{z z}\right) & S_{x y}+S_{y x} & S_{z x}+S_{x z} \\ S_{z x}-S_{x z} & S_{x y}+S_{y x} & \left(-S_{x x}+S_{y y}-S_{z z}\right) & S_{y z}+S_{z y} \\ S_{x y}-S_{y x} & S_{z x}+S_{x z} & S_{y z}+S_{z y} & \left(-S_{x x}-S_{y y}+S_{z z}\right) \end{array}\right] . N=⎣⎢⎢⎡(Sxx+Syy+Szz)Syz−SzySzx−SxzSxy−SyxSyz−Szy(Sxx−Syy−Szz)Sxy+SyxSzx+SxzSzx−SxzSxy+Syx(−Sxx+Syy−Szz)Syz+SzySxy−SyxSzx+SxzSyz+Szy(−Sxx−Syy+Szz)⎦⎥⎥⎤.
使用SVD对 N N N进行分解,获取最小的特征值,它对应的特征向量就是待求四元数 q q q,将其转为旋转矩阵 R R R,即为使得前面的 D D D最大化的旋转矩阵。
至此,相似变换的 s , R , t s,R,t s,R,t都求出来了,在ORB-SLAM2中还需要通过RANSAC算法对其优化,并剔除外点。