由于旋转矩阵/变换矩阵存在冗余,我们希望以更紧凑的方式表达;又由于其自身又带有约束(必须正交,行列式为1),使得优化和表达变得困难。所以引入以下几种方式:
旋转向量
- 任意旋转都可以通过旋转轴和一个旋转角来刻画;于是我们使用一个向量,方向与旋转轴一致,长度等于旋转角。这种向量成为旋转向量或轴角(Axis-Angle)。只需3维就可以表达旋转,6维即可表达变换。事实上,旋转向量就是李代数?
- 可根据罗德里格斯公式对旋转矩阵和旋转向量进行转换。
欧拉角
- 欧拉角相比于旋转矩阵和旋转向量更直观,但会遇到万向锁问题(奇异性),所以不适合迭代和插值,往往用于人机交互中。
四元数性质
- 由于三个量表达三维空间不免带有奇异性,旋转向量和欧拉角都带有奇异性,所以想要无奇异表达三个量是不足够的,引入四元数,其性质类似于复数。由一个实部和三个虚部组成,形式如
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
\bf 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 l = − j \begin{cases} i^2 = j^2 = k^2 = -1, \\ ij = k, ji = -k \\jk =i, kj = -i \\ki = j, il = -j \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧i2=j2=k2=−1,ij=k,ji=−kjk=i,kj=−iki=j,il=−j
也有另一种表达方式用一个向量和一个标量的i形式 q = [ s , v ] q = [s, v] q=[s,v], 这里s是四元数的实部,v是四元数的虚部,若s为0 称为虚四元数。考虑到三维空间需要三个轴,四元数也有三个虚部。我们能用单位四元数表达三维空间中任意一个旋转。但不像复数乘以 i i i 意味旋转90 ,四元数乘以 i i i 意味旋转180,这样才能保证 i j = k ij = k ij=k 的性质,而 i 2 = − 1 i^2 = -1 i2=−1 意味绕 i i i 轴旋转360得到一个完全相反的东西,720才回到原来状态。 - 假设某个旋转是绕单位向量
n
=
[
n
x
,
n
y
,
n
z
]
T
n = [n_x, n_y, n_z]^T
n=[nx,ny,nz]T 进行了角度
θ
\theta
θ 的旋转,那么这个旋转的四元数形式是
q = [ c o s θ 2 , n x s i n θ 2 , n y s i n θ 2 , n z s i n θ 2 ] T q= [cos \frac{\theta}{2}, n_xsin\frac{\theta}{2}, n_ysin\frac{\theta}{2},n_zsin\frac{\theta}{2}]^T q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]T
我推测这;里之所以取 θ 2 \frac {\theta}{2} 2θ ,是因为要满足加 2 π 2\pi 2π 的时候实现反转, 4 π 4\pi 4π 的时候返回原来位置。而大家同时除以2并没有什么影响。如果理解的不对,请指正哈! - 四元数中任意旋转都可以由两个互为相反数的四元数表示。当 θ \theta θ 为0时,则得到一个没有任何旋转的实四元数 [ ± 1 , 0 , 0 , 0 ] T [\pm 1,0, 0, 0]^T [±1,0,0,0]T
四元数运算
- 加减法:就按对应项相加就好;
- 乘法:则主要是内外积运算,然而由于涉及到外积,所以四元数乘法不可交换,除非共线,此时外积项为0;
- 共轭:则是虚部取成相反数,实部不变,共轭与本身想乘会得到一个实四元数,即模长的平方;
- 模长:各项平方和的平方根
- 逆: 四元数逆为
q
−
1
=
q
∗
/
∣
∣
q
∣
∣
2
q^{-1} = q^{*}/||q||^2
q−1=q∗/∣∣q∣∣2 所以四元数和自己逆的乘积为实四元数1,如果
q
q
q 为单位四元数,其逆和共轭就是同一个量,乘积的逆有和矩阵相似的性质:
( q a q b ) − 1 = q b − 1 q a − 1 (q_aq_b)^{-1} = q_b^{-1}q_a^{-1} (qaqb)−1=qb−1qa−1 - 数乘和点乘:数乘和向量相似,点乘对应位置相乘。
四元数表示旋转
- 设空间三维点
p
=
[
x
,
y
,
z
]
p = [x, y, z]
p=[x,y,z] , 以及由轴角
n
,
θ
n, \theta
n,θ 指定的旋转,三维点
p
p
p 经过旋转之后变为
p
′
p^{'}
p′, 则三维空间点用四元数描述为:
p = [ 0 , x , y , z ] = [ 0 , v ] p = [0, x, y, z] = [0, v] p=[0,x,y,z]=[0,v]
这相当于三个虚部与空间中三个轴相对应,则旋转用四元数表示:
q = [ c o s θ 2 , n s i n θ 2 ] q = [cos\frac{\theta}{2}, nsin\frac{\theta}{2}] q=[cos2θ,nsin2θ]
则旋转后的点可以表示为:
p ′ = q p q ′ p^{'} = qpq^{'} p′=qpq′
四元数到旋转矩阵转换
- 四元数转换为旋转矩阵的较直观方法:把四元数 q q q 转换为轴角 n n n 和 θ \theta θ ,然后根据罗德里格斯公式转换为矩阵。
- 事实上 R R R 对应的四元数表示并不唯一,例如 q q q 和 − q -q −q 表示同一个旋转。
相似、仿射、射影变换
- 相似变换:通过加上尺度因子 s s s 允许物体进行均匀缩放;
- 仿射变换:要求原来的旋转矩阵 R R R 是一个可逆矩阵就好,而不必正交,所以经过变换后只能保证平行四边形;
- 射影变换:左上角可逆矩阵 A A A,,右上角平移 t t t, 左下角为缩放 a T a^T aT。