视觉SLAM十四讲笔记-3-02
文章目录
参考链接: link,
高翔,张涛,等. 视觉 SLAM 十四讲:从理论到实践[M]. 电子工业出版社, 2019.
3.3 旋转向量和欧拉角
3.3.1 旋转向量
前面 3.1 节、 3.2 节已经介绍了 旋转矩阵、变换矩阵。那描述一个6自由度的三维刚体运动是不是已经足够了尼?
矩阵表示至少存在以下两个缺点:
1.SO(3) 的旋转矩阵有 9 个量,但一次旋转只有 3 个自由度,因此这种表达方式是冗余的。同理,变换矩阵用 16 个量表示 6 自由度的变换, 存在冗余。
2.旋转矩阵自身带有约束,必须是一个正交矩阵,且行列式为1。变换矩阵也是如此。当想估计或者优化一个旋转矩阵或者变换矩阵时,这些约束会使得求解变得很困难。
因此,希望有一种方式能够紧凑地描述旋转和平移。例如,用一个三维向量表达旋转,用一个六维向量表达变换,可行吗?事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。
于是,可以使用一个向量,方向与旋转轴一致,长度等于旋转角。这种向量称为旋转向量。同样,对于变换矩阵,可以使用一个旋转向量和一个平移向量即可表达一次变换。这样的变量维数正好是六维。
考虑某个用 R 表示的旋转。如果用旋转向量来表示,假设旋转轴为一个单位长度的向量n,角度为
θ
\theta
θ,那么向量
θ
n
\theta n
θn 也可以描述这个旋转。那么 R 和
θ
n
\theta n
θn 之间有什么关系吗?
从旋转向量到旋转矩阵的转换过程用罗德里格斯公式表明。
R
=
cos
θ
I
+
(
1
−
cos
θ
)
n
n
T
+
sin
θ
n
∧
R = \cos \theta I + (1-\cos \theta )nn^T + \sin \theta n^\wedge
R=cosθI+(1−cosθ)nnT+sinθn∧
^为上一节中介绍的反对称符号。
对式子两边取迹,得:
tr
(
R
)
=
cos
θ
tr
(
I
)
+
(
1
−
cos
θ
)
tr
(
n
n
T
)
+
sin
θ
tr
(
n
∧
)
=
3
cos
θ
+
(
1
−
cos
θ
)
=
1
+
2
cos
θ
\begin{aligned} \operatorname{tr}(R) &=\cos \theta \operatorname{tr}(I)+(1-\cos \theta) \operatorname{tr}\left(n n^{T}\right)+\sin \theta \operatorname{tr}\left(n^{\wedge }\right) \\ &=3 \cos \theta+(1-\cos \theta) \\ &=1+2 \cos \theta \end{aligned}
tr(R)=cosθtr(I)+(1−cosθ)tr(nnT)+sinθtr(n∧)=3cosθ+(1−cosθ)=1+2cosθ
因此有:
θ
=
arccos
tr
(
R
)
−
1
2
\theta=\arccos \frac{\operatorname{tr}(R)-1}{2}
θ=arccos2tr(R)−1
关于转轴 n,旋转轴上的向量在旋转后不发生改变,说明:
R
n
=
n
Rn = n
Rn=n
因此,转轴 n 是矩阵 R 特征值 1 对应到特征向量。求解此方程,再归一化,就得到了转轴。
这里的两个方程在后续仍将出现,会发现这正是 SO(3)上李群和李代数的对应关系。
3.3.2 欧拉角
无论是旋转矩阵还是旋转向量,它们虽然能描述旋转,但是对于人类来说是非常不直观的。当人们看到一个旋转矩阵或者旋转向量时,很难想象出来这个旋转究竟是什么样的。当它们变换时,也不知道物体时在哪个方向上转动,而欧拉角提供了一种非常直观的方式来描述旋转,使用了3个分离的转角,把每次的旋转分解为3次绕不同轴的旋转。人们很容易理解绕单个轴的旋转过程。
但是,分解的方式有很多种。但是在特定领域内,欧拉角通常有统一的定义方式。欧拉角当中比较常用的一种是使用 “偏航-俯仰-滚转(yaw-pitch-roll)” 3 个角度来描述一个旋转。它等价于ZYX方向的旋转。如下图所示,假设一个刚体的前方(朝向我们的方向为 X 轴,右侧为 Y轴, 上方为 Z 轴)。那么, ZYX转角相当于把任意旋转分解为以下3个轴上的转角:
1.绕物体的 Z 轴旋转,得到偏航角 yaw;
2.绕旋转之后的 Y 轴旋转,得到俯仰角 pitch;
3.绕旋转之后的 X 轴旋转,得到滚转角 roll
下图参考链接: link
此时,可以使用
[
r
,
p
,
y
]
T
[r, p, y]^T
[r,p,y]T 这样一个三维的向量描述任意旋转。这个向量十分直观,可以从这个向量中想象出旋转的过程。其他的欧拉角也是通过这种方式,把旋转分解到3个轴上,得到一个三维的向量,只不过选用的轴及顺序不一样。
缺点:万向锁问题:在俯仰角为
±
90
\pm 90
±90 时 (即第二次旋转时),第一次旋转和第三次旋转将使用同一个轴,使得系统丢失了一个自由度。(由三次旋转变为两次旋转)。这种称为奇异性问题。在其他形式的欧拉角中也同样存在。
理论上可以证明,只要想用三个实数来表达三维旋转,都会不可避免的碰到奇异值问题。由于这种原理,欧拉角不适用于插值和迭代,往往只用于人机交互中。通常也很少在 SLAM 中直接使用欧拉角表示姿态,同样不会在滤波或者优化中使用欧拉角表达旋转(因为有奇异性)。不过,若想验证自己的算法是否有错,转换成欧拉角能够帮你快速分辨结果是否正确。
3.4 四元数
3.4.1 四元数的定义
旋转矩阵用 9 个量描述 3 自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但具有奇异性。事实上,我们找不到不带奇异性的三维向量描述方式。
回忆以前学习过的复数。用复数集 C 表示复平面上的向量,而复数的乘法则表示复平面上的旋转。例如,乘上复数 i 相当于逆时针把一个复向量旋转
9
0
∘
90^{\circ}
90∘。类似地,在表达三维空间旋转时,也有一种类似于复数的代数:四元数。四元数既是紧凑的,也没有奇异性。但是四元数不够直观,且运算稍微复杂一些。
欧拉公式:
e
i
θ
=
cos
θ
+
i
sin
θ
e^{i\theta} = \cos \theta + i \sin \theta
eiθ=cosθ+isinθ
四元数的形式:一个四元数 q 拥有一个实部和三个虚部。如:
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q = q_{0} + q_{1}i + q_{2}j+q_{3}k
q=q0+q1i+q2j+q3k
其中, i, j, k, 为四元数的三个虚部。这三个虚部满足以下关系式:
{
i
2
=
j
2
=
k
2
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\left\{\begin{array}{l} i^{2}=j^{2}=k^{2}=-1 \\ i j=k, j i=-k \\ j k=i, k j=-i \\ k i=j, i k=-j \end{array}\right.
⎩⎪⎪⎨⎪⎪⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
如果把 i, j, k 看成三个坐标轴,则它们与自己的乘法和复数是一样的,相互之间的乘法和外积是一样的。也可以用一个标量和一个向量来表达四元数:
q
=
[
s
,
v
]
T
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
q = [s, v]^T, s = q_{0}\in R,v = [q_{1}, q_{2}, q_{3}]^T
q=[s,v]T,s=q0∈R,v=[q1,q2,q3]T
s 称为四元数的实部,v称为四元数的虚部。如果一个四元数的虚部为0,则称为实四元数;若实部为0称为虚四元数。
讲了四元数,但是如何用四元数表示三维空间中任意一个旋转。
3.4.2 四元数的运算
四元数和通常的复数一样,可以进行一些列的运算。常见的有四则运算、共轭、求逆、数乘等。
现有两个四元数
q
0
q_{0}
q0 和
q
1
q_{1}
q1, 它们的向量表示为
[
s
a
,
v
a
]
[s_{a}, v_{a}]
[sa,va],
[
s
b
,
v
b
]
[s_{b}, v_{b}]
[sb,vb],或者原始四元数表示为:
q
a
=
s
a
+
x
a
i
+
y
a
j
+
z
a
k
q
b
=
s
b
+
x
b
i
+
y
b
j
+
z
b
k
q_{a} = s_{a} + x_{a}i + y_{a}j + z_{a}k \\ q_{b} = s_{b} + x_{b}i + y_{b}j + z_{b}k
qa=sa+xai+yaj+zakqb=sb+xbi+ybj+zbk
那么,其运算可以表示如下:
1.加减法:
q
a
±
q
b
=
[
s
a
±
s
b
,
v
a
±
v
b
]
\boldsymbol{q}_{a} \pm \boldsymbol{q}_{b}=\left[s_{a} \pm s_{b}, \boldsymbol{v}_{a} \pm \boldsymbol{v}_{b}\right]
qa±qb=[sa±sb,va±vb]
2.乘法
乘法是把
q
a
q_{a}
qa 的每一项与
q
b
q_{b}
qb 的每一项相乘,最后相加。
q
a
q
b
=
s
a
s
b
−
x
a
x
b
−
y
a
y
b
−
z
a
z
b
+
(
s
a
x
b
+
x
a
s
b
+
y
a
z
b
−
z
a
y
b
)
i
+
(
s
a
y
b
−
x
a
z
b
+
y
a
s
b
+
z
a
x
b
)
j
+
(
s
a
z
b
+
x
a
y
b
−
y
a
x
b
+
z
a
s
b
)
k
\begin{aligned} q_{a} q_{b}=& s_{a} s_{b}-x_{a} x_{b}-y_{a} y_{b}-z_{a} z_{b} \\ &+\left(s_{a} x_{b}+x_{a} s_{b}+y_{a} z_{b}-z_{a} y_{b}\right) i \\ &+\left(s_{a} y_{b}-x_{a} z_{b}+y_{a} s_{b}+z_{a} x_{b}\right) j \\ &+\left(s_{a} z_{b}+x_{a} y_{b}-y_{a} x_{b}+z_{a} s_{b}\right) k \end{aligned}
qaqb=sasb−xaxb−yayb−zazb+(saxb+xasb+yazb−zayb)i+(sayb−xazb+yasb+zaxb)j+(sazb+xayb−yaxb+zasb)k
写成向量的形式,用内外积表示:
q
a
q
b
=
[
s
a
s
b
−
v
a
T
v
b
,
s
a
v
b
+
s
b
v
a
+
v
a
×
v
b
]
T
q_{a} q_{b}=\left[s_{a} s_{b}-v_{a}^{T} v_{b}, s_{a} v_{b}+s_{b} v_{a}+v_{a} \times v_{b}\right]^{T}
qaqb=[sasb−vaTvb,savb+sbva+va×vb]T
由于最后一项外积的存在,通常四元数乘法是不可以交换的。
3.模长
∥
q
a
∥
=
s
a
2
+
x
a
2
+
y
a
2
+
z
a
2
\left\|q_{a}\right\|=\sqrt{s_{a}^{2}+x_{a}^{2}+y_{a}^{2}+z_{a}^{2}}
∥qa∥=sa2+xa2+ya2+za2
两个四元数乘积的模即模的乘积。
∥
q
a
q
b
∥
=
∥
q
a
∥
∥
q
b
∥
\left \| q_{a}q_{b} \right \| = \left \| q_{a}\right \| \left \| q_{b}\right \|
∥qaqb∥=∥qa∥∥qb∥
4.共轭
q
a
∗
=
s
a
−
x
a
i
−
y
a
j
−
z
a
k
=
[
s
a
,
−
v
a
]
\boldsymbol{q}_{a}^{*}=s_{a}-x_{a} i-y_{a} j-z_{a} k=\left[s_{a},-\boldsymbol{v}_{a}\right]
qa∗=sa−xai−yaj−zak=[sa,−va]
四元数共轭和其本身相乘,会得到一个实四元数,其模等于模长的平方
q
∗
q
=
q
q
∗
=
[
s
a
2
+
v
T
v
,
0
]
T
q^{*} q=q q^{*}=\left[s_{a}^{2}+v^{T} v, 0\right]^{T}
q∗q=qq∗=[sa2+vTv,0]T
5.逆
q
−
1
=
q
∗
/
∥
q
a
∥
2
q^{-1}=q^{*} /\left\|q_{a}\right\|^{2}
q−1=q∗/∥qa∥2
q
q
−
1
=
q
−
1
q
=
1
q q^{-1}=q^{-1} q=1
qq−1=q−1q=1
若 q 为单位四元数,则有
q
−
1
=
q
∗
q^{-1} = q ^{*}
q−1=q∗。
乘积的逆具有和矩阵的逆相似的性质:
(
q
a
q
b
)
−
1
=
q
b
−
1
q
a
−
1
\left(q_{a} q_{b}\right)^{-1}=q_{b}^{-1} q_{a}^{-1}
(qaqb)−1=qb−1qa−1
6.数乘
k
q
=
[
k
s
,
k
v
]
k \boldsymbol{q}=[k s, k \boldsymbol{v}]
kq=[ks,kv]
3.4.3 用四元数表示旋转
假设有一个空间三维点
p
=
[
x
,
y
,
z
]
∈
R
3
p = [x,y,z] \in R^3
p=[x,y,z]∈R3,以及一个由单位四元数 q 指定的旋转。三维点 p 经过旋转之后变为
p
′
p'
p′。如果使用矩阵描述,那么有
p
′
=
R
p
p' = Rp
p′=Rp。而如果使用四元数描述旋转,它们的关系该如何表达尼?
首先,把三维空间点用一个虚四元数来描述:
p
=
[
0
,
x
,
y
,
z
]
T
=
[
0
,
v
]
T
p = [0,x,y,z]^T = [0, v]^T
p=[0,x,y,z]T=[0,v]T
相当于把四元数的3个虚部与空间中的3个轴相对应。那么,旋转后的点
p
′
p'
p′ 可以表示为这样的乘积:
p
′
=
q
p
q
−
1
p'= qpq^{-1}
p′=qpq−1
这里的乘法均为四元数乘法,结果也是四元数。最后把
p
′
p'
p′ 的虚部取出,即得旋转之后点的坐标,并且可以验证,计算结果的实部为0,故为纯虚四元数。
3.4.4 四元数到其他旋转表示的转换
任意单位四元数描述了一个旋转,该旋转也可用旋转矩阵或者旋转向量来描述。现在考察四元数与旋转向量、旋转矩阵之间的转换关系。
四元数乘法可以写成一种矩阵的乘法。设
q
=
[
s
,
v
]
T
q = [s, v]^T
q=[s,v]T,那么,定义如下的符号 + 和
⊕
\oplus
⊕ 为:
q
+
=
[
s
−
v
T
v
s
I
+
v
∧
]
q^{+}=\left[\begin{array}{cc} s & -v^{T} \\ v & s I+v^{\wedge } \end{array}\right]
q+=[sv−vTsI+v∧]
q
⊕
=
[
s
−
v
T
v
s
I
−
v
⊕
]
q^{\oplus}=\left[\begin{array}{cc} s & -v^{T} \\ v & s I-v^{\oplus} \end{array}\right]
q⊕=[sv−vTsI−v⊕]
这两个符号将四元数映射成为了一个 4*4 的矩阵。于是,四元数乘法可以写成矩阵的形式:
q
1
+
q
2
=
[
s
1
−
v
1
T
v
1
s
1
I
+
v
1
∧
]
[
s
2
v
2
]
=
[
−
v
1
T
v
2
+
s
1
s
2
s
1
v
2
+
s
2
v
1
+
v
1
∧
v
2
]
=
q
1
q
2
q_{1}^{+}q_{2}=\left[\begin{array}{cc} s_{1} & -v_{1}^{T} \\ v_{1} & s_{1} I+v_{1}^{\wedge } \end{array}\right]\begin{bmatrix} s_{2}\\ v_{2} \end{bmatrix} = \begin{bmatrix} -v_{1}^Tv_{2} + s_{1}s_{2}\\ s_{1}v_{2} + s_{2}v_{1} + v_{1}\wedge v_{2} \end{bmatrix} = q_{1}q_{2}
q1+q2=[s1v1−v1Ts1I+v1∧][s2v2]=[−v1Tv2+s1s2s1v2+s2v1+v1∧v2]=q1q2
同理可证:
q
1
q
2
=
q
1
+
q
2
=
q
2
⊕
q
1
q_{1}q_{2} = q_{1}^{+}q_{2} = q_{2}^{\oplus}q_{1}
q1q2=q1+q2=q2⊕q1
然后,考虑使用四元数对空间点进行旋转的问题。根据前面得到的关系,可以得:
p
′
=
q
p
q
−
1
=
q
+
p
q
−
1
=
q
+
p
+
q
−
1
=
q
+
q
−
1
⊕
p
p'= qpq^{-1} = q^{+}pq^{-1} = q^{+}p^{+}q^{-1} = q^{+}{q^{-1}}^{\oplus}p
p′=qpq−1=q+pq−1=q+p+q−1=q+q−1⊕p
带入两个符号对应的矩阵:
q
+
q
−
1
⊕
=
[
1
0
0
T
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
]
q^{+} q^{-1^{\oplus}}=\left[\begin{array}{cc} 1 & 0 \\ 0^{T} & v v^{T}+s^{2} I+2 s v^{\wedge}+\left(v^{\wedge}\right)^{2} \end{array}\right]
q+q−1⊕=[10T0vvT+s2I+2sv∧+(v∧)2]
这个式子的右下角给出了从四元数到旋转矩阵的变换关系:
R
=
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
R=v v^{T}+s^{2} I+2 s v^{\wedge}+\left(v^{\wedge}\right)^{2}
R=vvT+s2I+2sv∧+(v∧)2
为了得到四元数到旋转向量的转换公式,对上述两侧求迹,得:
t
r
(
R
)
=
t
r
(
v
v
T
+
3
s
2
+
2
s
.
0
+
t
r
(
v
∧
)
2
)
=
v
1
2
+
v
2
2
+
v
3
2
+
3
s
2
−
2
(
v
1
2
+
v
2
2
+
v
3
2
)
=
(
1
−
s
2
)
+
3
s
2
−
2
(
1
−
s
2
)
=
4
s
2
−
1
tr(R) = tr(vv^T + 3s^2 + 2s.0 + tr(v\wedge)^2) \\ =v_1^2+v_2^2+v_3^2+3s^2 -2(v_1^2+v_2^2+v_3^2) \\ = (1-s^2) + 3s^2 - 2(1-s^2) \\ = 4s^2 - 1
tr(R)=tr(vvT+3s2+2s.0+tr(v∧)2)=v12+v22+v32+3s2−2(v12+v22+v32)=(1−s2)+3s2−2(1−s2)=4s2−1
上一节中推导出旋转向量和旋转矩阵的转换关系:
t
r
(
R
)
=
1
+
2
c
o
s
θ
tr(R) = 1 + 2 cos \theta
tr(R)=1+2cosθ
则:
θ
=
arccos
(
2
s
2
−
1
)
\theta=\arccos \left(2 s^{2}-1\right)
θ=arccos(2s2−1)
即:
θ
=
2
arccos
s
\theta=2 \arccos s
θ=2arccoss
四元数到旋转向量的转换关系:
{
θ
=
2
arccos
q
0
[
n
x
,
n
y
,
n
z
]
T
=
[
q
1
,
q
2
,
q
3
]
/
sin
(
θ
2
)
\left\{\begin{array}{l} \theta=2 \arccos q_{0} \\ {\left[n_{x}, n_{y}, n_{z}\right]^{T}=\left[q_{1}, q_{2}, q_{3}\right] / \sin \left(\frac{\theta}{2}\right)} \end{array}\right.
{θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]/sin(2θ)
3.5 相似、仿射、射影变换
除了欧氏变换,3D 空间还存在其他几种变换方式,只不过欧氏变换是最简单的。欧氏变换保持了向量的长度和夹角,相当于把一个刚体原封不动地进行了移动或者旋转,不改变自身的样子。其他的几种变换则会改变它的外形。
1.相似变换
相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,矩阵表示为:
T
S
=
[
s
R
t
0
T
1
]
T_{S}=\left[\begin{array}{ll} s R & t \\ 0^{T} & 1 \end{array}\right]
TS=[sR0Tt1]
缩放因子允许对向量旋转之后,可以在 x,y,z 三个坐标上进行均匀缩放。三维相似变换的集合也叫做相似变换群,记做
S
i
m
(
3
)
Sim(3)
Sim(3)。
2.仿射变换
T
S
=
[
A
t
0
T
1
]
T_{S}=\left[\begin{array}{cc} A & t \\ 0^{T} & 1 \end{array}\right]
TS=[A0Tt1]
只要求 A 是一个可逆矩阵,而不要求是正交矩阵。
3.射影变换
T
S
=
[
A
t
a
T
v
]
T_{S}=\left[\begin{array}{cc} A & t \\ a^{T} & v \end{array}\right]
TS=[AaTtv]
摄影变换形式最为一般。
下表参考: link