本节的部分内容在机器人学导论课程中都有讲述,相关的知识点在上学期的课后整理过,放在这里,机器人学的数理基础知识,本文将在此基础上做些补充。
一、旋转矩阵
点和向量,坐标系
坐标系间的欧式变换
二、旋转向量和欧拉角
旋转向量
旋转矩阵是一个行列式为1的正交矩阵,反之,行列式为1的正交矩阵也是一个旋转矩阵,所以可以把旋转矩阵的集合定义为如下:
S
O
(
n
)
=
{
R
∈
R
n
×
n
∣
R
R
T
=
I
,
d
e
t
(
R
)
=
1
}
SO(n) = \{ R \in \mathbb{R}^{n\times n}|RR^T = I,det(R) = 1\}
SO(n)={R∈Rn×n∣RRT=I,det(R)=1}
S
O
(
n
)
SO(n)
SO(n)是特殊正交群(Special Orthogonal Group)的意思。
同时,对于齐次变换矩阵,左上角为旋转矩阵,右侧为平移分量,左下角为0,右下角为1,这种矩阵成为特殊欧式群(Special Euclidean Group)。
S
E
(
3
)
=
{
T
=
[
R
t
0
T
1
]
∈
R
4
×
4
∣
R
∈
S
O
(
3
)
,
t
∈
R
3
}
SE(3) = \{T = \begin{bmatrix} R & t\\ 0^T & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4}|R \in SO(3), t \in \mathbb{R}^3 \}
SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),t∈R3}
三维刚体运动有6个自由度,而SO(3)旋转矩阵有9个量,有些冗余,同时旋转矩阵自身还有约束。
于是有了一种更加紧凑的旋转表示方法,利用一个旋转轴和一个旋转角来表示任意的旋转。构造一种向量,使得其方向与旋转轴方向一致,而长度等于旋转角,这种向量称为旋转向量(轴角,Axis-Angle)。
则绕旋转轴n旋转角度 θ \theta θ对应的旋转向量为 θ \theta θn,显然这里的n应该为单位向量。
旋转向量到旋转矩阵的变换过程由罗德里格斯公式给出:
R
=
c
o
s
θ
I
+
(
1
−
c
o
s
θ
)
n
n
T
+
s
i
n
θ
n
∧
R = cos\theta \mathbf{I} + (1-cos\theta) \mathbf{n} \mathbf{n}^T + sin\theta \mathbf{n} ^{\wedge}
R=cosθI+(1−cosθ)nnT+sinθn∧
欧拉角
欧拉角用三个分离的转角来描述旋转,最常用的描述方法是“偏航-俯仰-滚转”(yaw-pitch-roll)。但是其存在万向锁的问题,很少在SLAM中直接用来描述姿态。
三、四元数
四元数的定义
四元数是紧凑的,没有奇异性的,可以用来表述三维空间旋转。
一个四元数q拥有一个实部和三个虚部:
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
\mathbf{q} = q_0 +q_1i + q_2j + q_3k
q=q0+q1i+q2j+q3k
其中
i
,
j
,
k
i,j,k
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{aligned} i^2=j^2=k^2=-1 \\ ij=k,ji=-k\\ jk=i,kj=-i\\ ki=j,ik=-j \end{aligned} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
四元数也可以表示为:
q
=
[
s
,
v
]
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
∈
R
\mathbf{q} = [s, \mathbf{v}], s=q_0 \in \mathbb{R}, \mathbf{v}=[q_1, q_2,q_3]^T \in \mathbb{R}
q=[s,v],s=q0∈R,v=[q1,q2,q3]T∈R
四元数的运算
对于两个四元数 q a = [ s a , v a ] = s a + x a i + y a j + z a k , q b = [ s b , v b ] = s b + x b i + y b j + z b k \mathbf{q}_a=[s_a,\mathbf{v}_a]=s_a+x_ai+y_aj+z_ak, \mathbf{q}_b=[s_b,\mathbf{v}_b]=s_b+x_bi+y_bj+z_bk qa=[sa,va]=sa+xai+yaj+zak,qb=[sb,vb]=sb+xbi+ybj+zbk
- 加法和减法
q a ± q b = [ s a ± s b , v a ± v b ] \mathbf{q}_a \pm\mathbf{q}_b = [s_a \pm s_b, \mathbf{v}_a \pm \mathbf{v}_b] qa±qb=[sa±sb,va±vb] - 乘法
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 ] \mathbf{q}_a\mathbf{q}_b=[s_as_b-\mathbf{v}_a^T\mathbf{v}_b,s_a\mathbf{v}_b+s_b\mathbf{v}_a+\mathbf{v}_a \times \mathbf{v}_b] qaqb=[sasb−vaTvb,savb+sbva+va×vb] - 共轭
q a ∗ = [ s a , − v a ] \mathbf{q}_a^*=[s_a, -\mathbf{v}_a] qa∗=[sa,−va] - 模长
∣ ∣ q a ∣ ∣ = s a 2 + x a 2 + y a 2 + z a 2 ||\mathbf{q}_a|| = \sqrt{s_a^2+x_a^2+y_a^2+z_a^2} ∣∣qa∣∣=sa2+xa2+ya2+za2 - 逆
q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 \mathbf{q}^{-1} = \mathbf{q}^*/||\mathbf{q}||^2 q−1=q∗/∣∣q∣∣2 - 数乘与点乘
k q = [ k s , k v ] k\mathbf{q}=[ks,k\mathbf{v}] kq=[ks,kv]
q a q b = s a s b + x a x b + y a y b + z a z b \mathbf{q}_a\mathbf{q}_b=s_as_b+x_ax_b+y_ay_b+z_az_b qaqb=sasb+xaxb+yayb+zazb
用四元数表示旋转
我们用虚四元数来表示三维空间中的一个点:
p
=
[
0
,
x
,
y
,
z
]
=
[
0
,
v
]
\mathbf{p} = [0, x, y, z]=[0, \mathbf{v}]
p=[0,x,y,z]=[0,v]
而对于一个由轴角
n
\mathbf{n}
n,
θ
\theta
θ指定的旋转,可以用四元数来表示为:
q
=
[
c
o
s
θ
2
,
n
s
i
n
θ
2
]
\mathbf{q} = [cos\frac{\theta}{2},\mathbf{n}sin\frac{\theta}{2}]
q=[cos2θ,nsin2θ]
旋转后的点
p
′
\mathbf{p}\prime
p′可以表示为:
p
′
=
q
p
q
−
1
\mathbf{p}\prime = \mathbf{q}\mathbf{p}\mathbf{q}^{-1}
p′=qpq−1
四元数到旋转矩阵的转换
同理可以推得四元数
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
\mathbf{q} = q_0 +q_1i+q_2j+q_3k
q=q0+q1i+q2j+q3k对应的旋转矩阵
R
\mathbf{R}
R为:
R
=
[
1
−
2
q
2
2
−
2
q
3
2
2
q
1
q
2
−
2
q
0
q
3
2
q
1
q
3
+
2
q
0
q
2
2
q
1
q
2
+
2
q
0
q
3
1
−
2
q
1
2
−
2
q
3
2
2
q
2
q
3
−
2
q
0
q
1
2
q
1
q
3
−
2
q
0
q
2
2
q
2
q
3
+
2
q
0
q
1
1
−
2
q
1
2
−
2
q
2
2
]
\mathbf{R} = \begin{bmatrix} 1-2q_2^2-2q_3^2 & 2q_1q_2-2q_0q_3 & 2q_1q_3+2q_0q_2\\ 2q_1q_2+2q_0q_3 & 1-2q_1^2-2q_3^2 & 2q_2q_3-2q_0q_1\\ 2q_1q_3-2q_0q_2 & 2q_2q_3+2q_0q_1 & 1-2q_1^2-2q_2^2 \end{bmatrix}
R=⎣⎡1−2q22−2q322q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q12−2q322q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q12−2q22⎦⎤
同样的由旋转矩阵
R
=
{
m
i
j
}
,
i
,
j
∈
[
1
,
2
,
3
]
\mathbf{R}=\{m_{ij}\},i,j \in[1, 2,3]
R={mij},i,j∈[1,2,3]也可以得到四元数:
q
0
=
t
r
(
R
)
+
1
2
,
q
1
=
m
23
−
m
32
4
q
0
,
q
2
=
m
31
−
m
13
4
q
0
,
q
3
=
m
12
−
m
21
4
q
0
q_0 = \frac{\sqrt{tr(\mathbf{R})+1}}{2}, q_1=\frac{m_{23}-m_{32}}{4q_0},q_2=\frac{m_{31}-m_{13}}{4q_0}, q_3=\frac{m_{12}-m_{21}}{4q_0}
q0=2tr(R)+1,q1=4q0m23−m32,q2=4q0m31−m13,q3=4q0m12−m21
往期链接
视觉SLAM十四讲 第2讲 初识slam