《视觉SLAM十四讲》第三章阅读笔记(一)
第三章主要描述三维空间的刚体运动,主要的描述的方式为旋转矩阵、四元数和欧拉角。本文中将介绍三种之间的转换方式以及Eigen库和ROS系统中的关于旋转矩阵、四元数和欧拉角的具体表达和之间转换。,且本文都是基于右手系进行推导。
1.旋转矩阵
定义一个三维旋转矩阵R,用来表示两个坐标之间的坐标变换关系,同时也是一个行列式为1的正交矩阵,因此可以定义三维空间的李群SO(3)。
S
O
(
3
)
=
{
R
∈
R
n
×
n
|
R
R
T
=
I
,
d
e
t
(
R
)
=
1
}
SO(3)=\{\bm{R}\in\mathbb{R^{n\times{n}}}|\bm{RR}^{T}=\bm{I},det(\bm{R})=1\}
SO(3)={R∈Rn×n|RRT=I,det(R)=1}
在SLAM系统里面,车体的旋转运动会体现到相机的旋转,当然前提是将车体和相机之间的连接看成刚性连接,意味着当相机测出旋转运动时,可以反推出车体的运动,从而求出车体的位姿。然而通常情况下,旋转矩阵不足以表达出车体的运动,在车辆行驶过程中,除了旋转还有平移运动,因此还需要引入平移向量t。则有:
T
=
[
R
t
0
T
1
]
\bm{T}=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix}
T=[R 0Tt1]
这里引入的是齐次坐标系,然而为何引入齐次坐标呢?首先需要解答的第一个问题是什么是齐次坐标,齐次坐标就是在原有坐标基础上再加一个维度,如:
(
x
,
y
)
→
(
x
,
y
,
1
)
(x,y)\rightarrow (x,y,1)
(x,y)→(x,y,1)
(
x
,
y
,
z
)
→
(
x
,
y
,
z
,
1
)
(x,y,z)\rightarrow(x,y,z,1)
(x,y,z)→(x,y,z,1)
如果直线l可以用直线方程ax+by+c=0来表示的话,该直线用向量表示的话,记做:
l
=
(
x
,
y
,
1
)
T
l=(x,y,1)^{T}
l=(x,y,1)T
则直线的坐标可以设置成
P
=
(
x
,
y
,
1
)
P=(x,y,1)
P=(x,y,1)直线方程则为两点之间的点乘也就是内积。
a
x
+
b
y
+
c
×
1
=
(
a
,
b
,
c
)
T
(
x
,
y
,
1
)
=
l
T
∗
P
′
=
0
ax+by+c\times1 =(a,b,c)^{T}(x,y,1)=l^{T}*P^{\prime}=0
ax+by+c×1=(a,b,c)T(x,y,1)=lT∗P′=0
同样地,在三维空间内假设平面方程A为
a
x
+
b
y
+
c
z
+
d
=
0
,
P
=
(
x
,
y
,
z
,
1
)
ax+by+cz+d=0,P=(x,y,z,1)
ax+by+cz+d=0,P=(x,y,z,1)
a
x
+
b
y
+
c
z
+
d
=
(
a
,
b
,
c
,
d
)
T
(
x
,
y
,
z
,
1
)
=
A
T
∗
P
′
=
0
ax+by+cz+d=(a,b,c,d)^{T}(x,y,z,1)=A^{T}*P^{\prime}=0
ax+by+cz+d=(a,b,c,d)T(x,y,z,1)=AT∗P′=0
从普通坐标转换成齐次坐标时
如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0)
从齐次坐标转换成普通坐标时
如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)
具体可见:齐次坐标的理解
使用齐次坐标可以将欧式变换中的加法转换为乘法,如二维平面点
x
=
[
u
,
v
]
x=[u,v]
x=[u,v],平移量为
t
=
[
t
u
,
t
v
]
t=[tu,tv]
t=[tu,tv],变换后的点应为:
x
′
→
[
u
′
v
′
]
=
[
u
+
t
u
v
+
t
v
]
=
x
+
t
x^{\prime}\rightarrow \begin{bmatrix} u ^{\prime}\\\ v^{\prime} \end{bmatrix}= \begin{bmatrix} u+t{u} \\\ v+t_{v} \end{bmatrix}=x+t
x′→[u′ v′]=[u+tu v+tv]=x+t
将齐次坐标作为替代,重写写为:
x
′
→
[
u
′
v
′
1
]
=
[
1
0
u
0
1
v
0
0
1
]
[
u
v
1
]
=
T
x
x^{\prime}\rightarrow \begin{bmatrix} u ^{\prime}\\\ v^{\prime}\\\ 1 \end{bmatrix}=\begin{bmatrix} 1 &0 &u\\\ 0 &1 &v\\\ 0&0 &1\end{bmatrix} \begin{bmatrix} u \\\ v\\\ 1 \end{bmatrix}=\bm{T}\bm{x}
x′→⎣⎡u′ v′ 1⎦⎤=⎣⎡1 0 0010uv1⎦⎤⎣⎡u v 1⎦⎤=Tx
在三维空间内,SLAM存在存在着旋转和平移,考虑世界坐标系中的向量a,经过一次旋转(用 R 描述)和一次平移 t 后,得到了 a′,那么把旋转和平移合到一起,有:
a
′
=
R
a
+
t
\bm{a}^{\prime}=\bm{R}\bm{a}+\bm{t}
a′=Ra+t
其中,t 称为平移向量。相比于旋转,平移部分只需把这个平移量加到旋转之后的坐标上,
显得非常简洁。通过上式,我们用一个旋转矩阵 R 和一个平移向量 t 完整地描述了一个欧氏空间的坐标变换关系。
引入齐次坐标和变换矩阵重写:
[
a
′
1
]
=
[
R
t
0
T
1
]
[
a
1
]
≜
T
[
a
1
]
\begin{bmatrix} \bm{a} ^{\prime}\\\ 1 \end{bmatrix}=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix}\begin{bmatrix} \bm{a} \\\ 1 \end{bmatrix}\triangleq \bm{T}\begin{bmatrix} \bm{a} \\\ 1 \end{bmatrix}
[a′ 1]=[R 0Tt1][a 1]≜T[a 1]
同样地,特殊欧氏群为:
S
E
(
3
)
=
{
T
=
[
R
t
0
T
1
]
∈
R
4
×
4
|
R
∈
S
O
(
3
)
,
t
∈
R
3
}
SE(3)=\{\bm{T=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix}}\in\mathbb{R^{4\times4}}|\bm{R}\in SO(3),t\in\mathbb{R}^{3}\}
SE(3)={T=[R 0Tt1]∈R4×4|R∈SO(3),t∈R3}
2.旋转向量
使用旋转矩阵来表示三维空间的变换存在以下缺点:
1.SO(3) 的旋转矩阵有九个量,但一次旋转只有三个自由度。因此这种表达方式是冗
余的。同理,变换矩阵用十六个量表达了六自由度的变换。
2.旋转矩阵自身带有约束:正交矩阵,且行列式为 1。变换矩阵也是如此。当
估计或优化一个旋转矩阵/变换矩阵时,这些约束会使得求解变得更困难。
引入一个新的概念:旋转向量,即用一个旋转轴和一个旋转角来刻画。关键关键问题在于旋转矩阵和旋转向量之间的转换。
接下来关于罗德里格斯公式(Rodrigues’s Formula)的推导。
首先给出推导的结果,即罗德里格斯公式(Rodrigues’s Formula )。
R
=
c
o
s
θ
I
+
(
1
−
c
o
s
θ
)
n
n
T
+
s
i
n
θ
n
∧
R=cos\theta\bm{I}+(1-cos\theta)\bm{nn^T}+sin\theta\bm{n^{\land}}
R=cosθI+(1−cosθ)nnT+sinθn∧
使用旋转矩阵表示的R为
R
=
[
r
x
x
r
x
y
r
x
z
r
y
x
r
y
y
r
y
z
r
z
x
r
z
y
r
z
z
]
R=\begin{bmatrix} r_{xx} &r_{xy} & r_{xz} \\\ r_{yx} & r_{yy} & r_{yz} \\\ r_{zx} & r_{zy} &r_{zz} \end{bmatrix}
R=⎣⎡rxx ryx rzxrxyryyrzyrxzryzrzz⎦⎤
上述已经描述过,旋转矩阵为标准的正交矩阵且矩阵的行列式为1,下式表达:
R
T
R
=
R
−
1
R
=
E
\bm{R}^{T}\bm{R}=\bm{R}^{-1}\bm{R}=\bm{E}
RTR=R−1R=E
∣
R
∣
=
1
|\bm{R}|=1
∣R∣=1
假设原坐标系基向量矩阵为 B,旋转后的坐标系基向量矩阵为 C。
B
=
[
b
x
,
b
y
,
b
z
]
=
[
1
0
0
0
1
0
0
0
1
]
\bm{B}=[b_{x},b_{y},b{z}]=\begin{bmatrix} 1 &0 & 0 \\\ 0& 1 & 0 \\\ 0 & 0 &1\end{bmatrix}
B=[bx,by,bz]=⎣⎡1 0 0010001⎦⎤
C
=
R
B
\bm{C}=\bm{R}\bm{B}
C=RB
即
C
=
[
r
x
x
r
x
y
r
x
z
r
y
x
r
y
y
r
y
z
r
z
x
r
z
y
r
z
z
]
[
b
x
,
b
y
,
b
z
]
\bm{C}=\begin{bmatrix} r_{xx} &r_{xy} & r_{xz} \\\ r_{yx} & r_{yy} & r_{yz} \\\ r_{zx} & r_{zy} &r_{zz} \end{bmatrix}[b_{x},b_{y},b{z}]
C=⎣⎡rxx ryx rzxrxyryyrzyrxzryzrzz⎦⎤[bx,by,bz]
假设一个单位向量
n
=
[
n
x
,
n
y
,
n
z
]
n=[n_{x},n_{y},n_{z}]
n=[nx,ny,nz]
考虑向量旋转,其中
v
v
v作为原向量,
v
r
o
t
v_{rot}
vrot为旋转后的向量。先通过点积得到
v
v
v在
n
n
n方向的平行分量
v
∣
∣
v_{||}
v∣∣:
v
∣
∣
=
(
v
⋅
n
)
n
v_{||}=(v\cdot n)n
v∣∣=(v⋅n)n
再通过叉乘得到与
k
k
k正交的两个向量
v
⊥
v_{\perp}
v⊥与
w
w
w。
v
⊥
=
v
−
v
∥
=
v
−
(
v
⋅
k
)
k
=
−
k
×
(
k
×
v
)
⋅
⋅
⋅
⋅
⋅
⋅
v_{\perp} = v - v_{\parallel } = v - (v \cdot k)k = -k \times (k \times v) \cdot \cdot \cdot \cdot \cdot \cdot
v⊥=v−v∥=v−(v⋅k)k=−k×(k×v)⋅⋅⋅⋅⋅⋅
w
=
k
×
v
w = k \times v
w=k×v
根据图中可以得出:
v
r
o
t
=
v
∥
+
c
o
s
(
θ
)
v
⊥
+
s
i
n
(
θ
)
w
v_{rot}=v_{\parallel}+cos(\theta)v_{\perp}+sin(\theta)w
vrot=v∥+cos(θ)v⊥+sin(θ)w
反对称矩阵可见反对成矩阵
则
n
n
n的反对称矩阵为:
n
∧
=
[
0
−
n
z
n
y
n
z
0
−
n
x
−
n
y
n
x
0
]
n^{\land}=\begin{bmatrix} 0&-n_z & n_{y} \\\ n_{z} & 0 & -n_{x} \\\ -n_{y} & n_{x} &0 \end{bmatrix}
n∧=⎣⎡0 nz −ny−nz0nxny−nx0⎦⎤其中
n
×
v
=
n
∧
v
n\times v=n^{\land}v
n×v=n∧v
因此,可以得到以下公式
v
∥
=
v
+
n
×
(
n
×
v
)
v_{\parallel}=v+n\times (n\times v)
v∥=v+n×(n×v)
所以可以得到
v
r
o
t
=
v
+
n
×
(
n
×
v
)
−
c
o
s
(
θ
)
k
×
(
k
×
v
)
+
s
i
n
(
θ
)
k
×
v
v_{rot}=v+n\times (n\times v)-cos(\theta)k\times (k\times v)+sin(\theta)k\times v
vrot=v+n×(n×v)−cos(θ)k×(k×v)+sin(θ)k×v
根据叉积矩阵性质:
v
r
o
t
=
v
+
(
1
−
c
o
s
(
θ
)
(
n
∧
)
2
v
+
s
i
n
(
θ
)
(
n
∧
)
2
v
v_{rot}=v+(1-cos(\theta)(n^{\land})^2v+sin(\theta)(n^{\land})^2v
vrot=v+(1−cos(θ)(n∧)2v+sin(θ)(n∧)2v
v
r
o
t
=
(
I
+
(
1
−
c
o
s
(
θ
)
)
(
n
∧
)
2
v
+
s
i
n
(
θ
)
(
n
∧
)
2
v
v_{rot}=(I+(1-cos(\theta))(n^{\land})^2v+sin(\theta)(n^{\land})^2v
vrot=(I+(1−cos(θ))(n∧)2v+sin(θ)(n∧)2v
将
B
B
B,
C
C
C代入可知:
B
=
(
I
+
(
1
−
c
o
s
(
θ
)
)
(
n
∧
)
2
+
s
i
n
(
θ
)
n
∧
)
C
⇔
R
=
I
+
(
1
−
c
o
s
(
θ
)
)
(
n
∧
)
2
+
s
i
n
(
θ
)
n
∧
B=(I+(1-cos(\theta))(n^{\land})^2+sin(\theta)n^{\land})C \Leftrightarrow \bm{R}=I+(1-cos(\theta))(n^{\land})^2+sin(\theta)n^{\land}
B=(I+(1−cos(θ))(n∧)2+sin(θ)n∧)C⇔R=I+(1−cos(θ))(n∧)2+sin(θ)n∧
同时,反过来计算,从旋转矩阵到旋转向量的转换。对于转角
θ
\theta
θ,对每一项取迹有
t
r
(
R
)
=
c
o
s
θ
t
r
(
I
)
+
(
1
−
c
o
s
θ
)
t
r
(
n
n
T
)
+
s
i
n
θ
t
r
(
n
∧
)
=
3
c
o
s
θ
+
(
1
−
c
o
s
θ
)
=
1
+
2
c
o
s
θ
tr(\bm{R})=cos\theta tr(\bm{I})+(1-cos\theta )tr (\bm{nn}^{T})+sin\theta tr(\bm{n}^{\land})=3cos\theta +(1-cos\theta)=1+2cos\theta
tr(R)=cosθtr(I)+(1−cosθ)tr(nnT)+sinθtr(n∧)=3cosθ+(1−cosθ)=1+2cosθ
符号
∧
^\land
∧为反对称矩阵转换符。
因此:
θ
=
a
r
c
o
s
(
t
r
(
R
)
−
1
2
)
\theta=arcos(\frac{tr(\bm{R})-1}{2})
θ=arcos(2tr(R)−1)
关于转轴
n
n
n,由于旋转轴上的向量在旋转后不发生改变,说明:
R
n
=
n
\bm{Rn}=\bm{n}
Rn=n
参考:
罗德里格斯公式 理解、推导