视觉SLAM十四讲2nd—学习笔记(一)
3.1旋转矩阵
点、向量、坐标系
向量
a
a
a:
a
=
e
a
e
=
Σ
1
3
a
i
e
i
a=e a_e = \Sigma_1^3 a_i e_i
a=eae=Σ13aiei,
e
=
[
e
1
,
e
2
,
e
3
]
e=[e_1, e_2, e_3]
e=[e1,e2,e3]为三维空间的一组基(是一个矩阵,每个元素
e
i
e_i
ei是一个列向量),
a
e
a_e
ae为
a
a
a在这组基下的坐标(是一个列向量)。
内积:
a
⋅
b
=
a
e
T
b
e
=
Σ
a
i
b
i
=
∣
a
∣
∣
b
∣
c
o
s
<
a
,
b
>
a\cdot b = a_e^T b_e = \Sigma a_i b_i = |a| |b| cos<a,b>
a⋅b=aeTbe=Σaibi=∣a∣∣b∣cos<a,b>,向量的坐标与基有关,所以右小角有一个
⋅
e
\cdot_e
⋅e,但向量的长度、夹角都与基无关,所以不加
⋅
e
\cdot_e
⋅e,
a
i
,
b
i
a_i,b_i
ai,bi分别是
a
e
,
b
e
a_e,b_e
ae,be的元素。
外积:
a
×
b
=
d
e
t
(
[
e
a
e
T
b
e
T
]
)
=
[
a
2
b
3
−
a
3
b
2
a
3
b
1
−
a
1
b
3
a
1
b
2
−
a
2
b
1
]
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
b
e
a\times b = det(\begin{bmatrix} e \\ a_e^T \\ b_e^T \end{bmatrix}) = \begin{bmatrix} a_2b_3 - a_3b_2 \\ a_3b_1 - a_1b_3 \\ a_1b_2 - a_2b_1 \end{bmatrix} = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} b_e
a×b=det(
eaeTbeT
)=
a2b3−a3b2a3b1−a1b3a1b2−a2b1
=
0a3−a2−a30a1a2−a10
be,
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
\begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix}
0a3−a2−a30a1a2−a10
是一个由
a
e
a_e
ae改写成的反对称矩阵。
注:这么写有点麻烦,后面无特殊说明,
a
,
b
a,b
a,b就指用同一组基表示的向量。
注:反对称矩阵满足
A
T
=
−
A
A^T = -A
AT=−A
坐标系间的欧式变换
世界坐标系或惯性坐标系是一个静坐标系,相机坐标系是一个动坐标系。
刚体运动:如果相机运动是一个刚体运动,则两个坐标系间的运动由一个旋转加一个平移组成。或者说两个坐标系间相差一个欧式变换(Euclidean Transform)。
向量
a
a
a在两个坐标系下的坐标为
a
e
,
a
e
′
a_e, a_{e'}
ae,ae′,两个坐标系是经过一次旋转的关系,则有:
a
e
=
R
a
e
′
a_e = R a_{e'}
ae=Rae′,其中
R
=
e
T
e
′
R= e^T e'
R=eTe′称为旋转矩阵或方向余弦矩阵(direction cosine)。
旋转矩阵是行列式为1的正交矩阵;行列式为1的正交矩阵是旋转矩阵。
注:正交矩阵满足
A
T
=
A
−
1
A^T=A^{-1}
AT=A−1,则有
a
e
′
=
R
−
1
a
e
a_{e'} = R^{-1} a_e
ae′=R−1ae,矩阵求逆描述了反向旋转
注:行列式为-1的正交矩阵是瑕旋转矩阵(一次旋转加一次反射)。
n n n维旋转矩阵的集合: S O ( n ) = { R ∈ R n × n ∣ R R T = I , d e t ( R ) = I } SO(n) = \{R \in \mathbb R^{n\times n} | RR^T = I, det(R)=I \} SO(n)={R∈Rn×n∣RRT=I,det(R)=I}, S O ( n ) SO(n) SO(n)是特殊正交群的意思。
欧式变换:两个坐标系是一次旋转加一次平移的关系,
a
e
′
=
R
a
e
+
t
a_{e'} = R a_e + t
ae′=Rae+t,
t
t
t为平移向量
注:将
a
e
′
=
R
a
e
+
t
a_{e'} = R a_e + t
ae′=Rae+t简写为
a
′
=
R
a
+
t
a' = R a + t
a′=Ra+t
变换矩阵与齐次坐标
如果向量
a
a
a至
c
c
c经过两次欧式变换,则有:
c
=
R
2
(
R
1
a
+
t
1
)
+
t
2
c = R_2(R_1 a + t_1) + t_2
c=R2(R1a+t1)+t2
为了简便表示,引入齐次坐标,将
a
′
=
R
a
+
t
a' = R a + t
a′=Ra+t表示为:
[
a
′
1
]
=
[
R
t
0
1
]
[
a
1
]
=
T
[
a
1
]
\begin{bmatrix} a' \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} a \\1 \end{bmatrix} = T \begin{bmatrix} a \\1 \end{bmatrix}
[a′1]=[R0t1][a1]=T[a1]
用变换矩阵
T
T
T表示欧式变换,
a
a
a用齐次坐标
[
a
1
]
\begin{bmatrix} a \\1 \end{bmatrix}
[a1]代替(为简便表示,
a
a
a就是齐次坐标),则两次欧式变换可写作:
c
=
T
2
T
1
a
c = T_2T_1 a
c=T2T1a。
特殊欧式群:
S
E
(
3
)
=
{
T
=
[
R
t
0
1
]
∈
R
4
×
4
∣
R
∈
S
O
(
3
)
,
t
∈
R
3
}
SE(3) = \{T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4} | R \in SO(3), t\in \mathbb{R}^3 \}
SE(3)={T=[R0t1]∈R4×4∣R∈SO(3),t∈R3}。
欧式变换的逆:
T
−
1
=
[
R
T
−
R
T
t
0
1
]
T^{-1} = \begin{bmatrix} R^T & -R^Tt \\ 0 & 1 \end{bmatrix}
T−1=[RT0−RTt1]
3.3 旋转向量与欧拉角
旋转向量
旋转矩阵有9个分量,但一次旋转只有3个自由度,是否有更紧凑的表达?
答:罗德里格斯公式(Rodrigues),用一个向量
n
n
n和一个标量
θ
\theta
θ表示
任意旋转都可以用一个旋转轴和一个旋转角表示,转轴是单位向量
n
n
n,转角为
θ
\theta
θ,则有:
R
=
c
o
s
θ
I
+
(
1
−
c
o
s
θ
)
n
n
T
+
s
i
n
θ
n
s
s
m
R = cos\theta I + (1-cos \theta) n n^T + sin \theta n^{ssm}
R=cosθI+(1−cosθ)nnT+sinθnssm
其中,
⋅
s
s
m
\cdot^{ssm}
⋅ssm表示向量的反对称矩阵
缺点:具有奇异性,
θ
=
0
\theta=0
θ=0时,
R
=
I
R=I
R=I,
n
n
n可以是任意向量,即转轴不唯一。
由
R
R
R计算
n
,
θ
n,\theta
n,θ:
θ
=
a
r
c
c
o
s
(
t
r
(
R
)
−
1
2
)
\theta = arccos(\frac{tr(R) - 1}{2})
θ=arccos(2tr(R)−1)
因为
R
n
=
n
Rn=n
Rn=n,所以
n
n
n是
R
R
R的特征值为1对应的特征向量。
欧拉角
欧拉角:将一个旋转分解为三次绕不同轴的旋转,最常见的是采用偏航-俯仰-滚转描述旋转。
偏航-俯仰-滚转:绕Z轴旋转
α
\alpha
α,绕旋转后的Y轴旋转
β
\beta
β,绕旋转后的X轴旋转
γ
\gamma
γ。
缺点:用三个标量表示旋转会出现奇异性问题(万向锁问题)。
万向锁:如果绕Y轴旋转90度,那么系统丢失一个自由度(绕X轴的旋转)。绕Z轴旋转
α
\alpha
α再绕旋转后的Y轴旋转
90
90
90再绕旋转后的X轴旋转
β
\beta
β 等于 绕Z轴旋转
α
±
β
\alpha \pm \beta
α±β再绕旋转后的Y轴旋转
90
90
90。
欧拉角演示网站 https://danceswithcode.net/engineeringnotes/rotations_in_3d/demo3D/rotations_in_3d_tool.html
3.4 四元数
四元数即紧凑也没有奇异性
平面旋转可由单位复数描述
e
i
θ
=
c
o
s
θ
+
i
s
i
n
θ
e^{i \theta} = cos\theta + i sin\theta
eiθ=cosθ+isinθ,三维旋转可由单位四元数描述。
四元数
q
=
[
s
,
v
]
T
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
∈
R
3
q=[s,v]^T, s=q_0 \in \mathbb{R}, v=[q_1,q_2,q_3]^T \in \mathbb{R}^3
q=[s,v]T,s=q0∈R,v=[q1,q2,q3]T∈R3,四元数有三个虚部一个实部。
四元数的加减、乘、逆、数乘和复数类似。
用四元数描述旋转:
p
′
=
q
p
q
−
1
p'=qpq^{-1}
p′=qpq−1,等效为
p
′
=
R
p
p'=Rp
p′=Rp
其中,三维空间点
p
=
[
0
,
x
,
y
,
z
]
T
p=[0,x,y,z]^T
p=[0,x,y,z]T(用虚四元数表示),单位四元数
q
q
q。
注:用四元数表示旋转,则
p
p
p为虚四元数;用旋转矩阵表示旋转,则
p
p
p为三维向量。需要读者带入当前语境中自行理解。
旋转即可用单位四元数
q
=
[
s
,
v
]
T
q=[s,v]^T
q=[s,v]T表示,也可用旋转矩阵表示,则前者转换为后者的公式为:
R
=
v
v
T
+
s
2
I
+
2
s
v
s
s
m
+
(
v
s
s
m
)
2
R=vv^T + s^2 I + 2s v^{ssm} + (v^{ssm})^2
R=vvT+s2I+2svssm+(vssm)2
反过来的转换公式:
θ
=
2
a
r
c
c
o
s
(
s
)
,
n
=
[
q
1
,
q
2
,
q
3
]
/
s
i
n
(
θ
/
2
)
\theta = 2arccos(s), n=[q_1,q_2,q_3]/sin(\theta/2)
θ=2arccos(s),n=[q1,q2,q3]/sin(θ/2)
3.5 相似、仿射、射影变换
相似变换比欧式变换多了一个自由度:缩放,变换矩阵为:
T
S
=
[
s
R
t
0
1
]
T_S = \begin{bmatrix} sR & t \\ 0 & 1 \end{bmatrix}
TS=[sR0t1]
用
S
i
m
(
3
)
Sim(3)
Sim(3)表示三维相似变换的集合(相似变换群)
仿射变换(正交投影)仅要求
A
A
A是一个可逆矩阵,不是必须为一个可逆矩阵,变换矩阵为:
T
A
=
[
A
t
0
1
]
T_A = \begin{bmatrix} A & t \\ 0 & 1 \end{bmatrix}
TA=[A0t1]
射影变换是最一般的变换,变换矩阵为:
T
A
=
[
A
t
a
T
v
]
T_A = \begin{bmatrix} A & t \\ a^T & v \end{bmatrix}
TA=[AaTtv]
其中,
A
A
A是一个可逆矩阵,左下角为缩放,右上角为平移
真实世界到相机照片的变换,如果焦距有限是射影变换,焦距无限是仿射变换。
欧式变换:保持长度、夹角、体积,6自由度;
相似变换:保持体积比,7自由度;
仿射变换:保持平行性、体积比,12自由度;
射影变换:保持接触平面的相交和相切,15自由度。
注:欧式变换的旋转矩阵有正交性,将其自由度缩减为3,再加上平移向量,共6个自由度。
注:射影变换右下角的
v
=
0
v=0
v=0或
1
1
1,共15个自由度
有空继续补充一下,编程及其运行结果。