旋转在三维空间中的表示方式有很多种,以下是几种常见的旋转量表达方式:
-
欧拉角:
欧拉角是一种基于一系列顺序的绕不同坐标轴的旋转来表示三维旋转的方式,常用于可视化。通常包括yaw(偏航角)、pitch(俯仰角)和roll(翻滚角)。通过三个独立的角度,可以完全描述三维空间中任何一种旋转状态。然而,欧拉角存在“万向节锁”(gimbal lock)的问题,在某些特定角度组合下会丢失一个自由度。 -
旋转矩阵:
旋转矩阵是一个3x3的正交矩阵,其行列式为1,能够将一个向量从一个坐标系旋转到另一个坐标系。每一列代表原坐标系下的基向量在旋转后新坐标系下的表示。旋转矩阵具有9个元素,但因为正交性约束,实际上只有3个独立的自由度。 -
旋转向量(Axis-Angle):
旋转向量是一个三维向量,其中向量的方向代表旋转轴,向量的长度(模)代表绕此轴的旋转角度。例如,如果v = (x, y, z)
是一个单位向量,那么旋转角度α可以通过||v||
给出,这样旋转向量就可以用四元组(x, y, z, α)
或归一化后的(x, y, z)
加上单独的一个角度值来完整表示。这种方法直观且具有连续性,没有万向节锁问题。 -
四元数:
四元数由一个实部和一个三元虚部组成,即q = w + xi + yj + zk
,其中w是实部,i、j、k是满足特殊乘法规则的虚部单位。四元数提供了一种非常有效的表示旋转的方法,特别是对于实时图形处理和物理模拟等需要频繁进行旋转操作的场景。四元数也有四个分量,但同样,由于单位四元数的约束(实部和虚部的平方和为1),它也只包含三个自由度,并且避免了万向节锁问题。 -
李群李代数:
正交李群就是旋转矩阵,对应李代数就是旋转向量:旋转角度α*单位向量旋转轴 u。
每种表示方法都有各自的优点和适用场合,选择哪种方式取决于应用场景对精度、计算效率以及避免万向节锁等因素的需求。
转换公式:
不同旋转表示方式之间的转换公式相当丰富,下面列出一些主要的转换公式:
1. 欧拉角到旋转矩阵 R(φ, θ, ψ)
假设 φ、θ、ψ 分别是绕 Z、Y、X 轴的欧拉角,旋转顺序通常记作 ZYZ 或 XYZ,相应的旋转矩阵分别为 Rz(φ), Ry(θ), Rx(ψ),最终的旋转矩阵 R 是它们的复合,以下以ZYX顺序为例:
R ( ϕ , θ , ψ ) = R z ( ϕ ) R y ( θ ) R x ( ψ ) R(\phi, \theta, \psi) = R_z(\phi)R_y(\theta)R_x(\psi) R(ϕ,θ,ψ)=Rz(ϕ)Ry(θ)Rx(ψ)
其中单个轴的旋转矩阵为:
- 绕Z轴旋转: R z ( ϕ ) = [ cos ϕ − sin ϕ 0 sin ϕ cos ϕ 0 0 0 1 ] R_z(\phi) = \begin{bmatrix} \cos\phi & -\sin\phi & 0 \\ \sin\phi & \cos\phi & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(ϕ)= cosϕsinϕ0−sinϕcosϕ0001
- 绕Y轴旋转: R y ( θ ) = [ cos θ 0 sin θ 0 1 0 − sin θ 0 cos θ ] R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} Ry(θ)= cosθ0−sinθ010sinθ0cosθ
- 绕X轴旋转: R x ( ψ ) = [ 1 0 0 0 cos ψ − sin ψ 0 sin ψ cos ψ ] R_x(\psi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\psi & -\sin\psi \\ 0 & \sin\psi & \cos\psi \end{bmatrix} Rx(ψ)= 1000cosψsinψ0−sinψcosψ
2. 旋转向量 (axis-angle) 到旋转矩阵 R(u, θ)
设旋转轴由单位向量 ( u = ( u x , u y , u z ) ) (u = (u_x, u_y, u_z) ) (u=(ux,uy,uz))表示,旋转角度为 θ,应用罗德里格斯公式可以得到旋转矩阵:
R ( u , θ ) = I + s i n θ K ( u ) + ( 1 − c o s θ ) K ( u ) 2 R(u, \theta) = I + sin\theta K(u) + (1-cos\theta)K(u)^2 R(u,θ)=I+sinθK(u)+(1−cosθ)K(u)2
其中 I 是单位矩阵,K(u) 是关于 u 的反对称矩阵:
K ( u ) = [ 0 − u z u y u z 0 − u x − u y u x 0 ] K(u) = \begin{bmatrix} 0 & -u_z & u_y \\ u_z & 0 & -u_x \\ -u_y & u_x & 0 \end{bmatrix} K(u)= 0uz−uy−uz0uxuy−ux0
3. 旋转矩阵到旋转向量
给定旋转矩阵 R,可以将其转换为旋转向量 (u, θ):
并且通过下式计算旋转角度 θ和单位向量 u:
θ
=
arccos
(
t
r
a
c
e
(
R
)
−
1
2
)
\theta = \arccos\left(\frac{trace(R) - 1}{2}\right)
θ=arccos(2trace(R)−1)
u
=
1
2
sin
θ
[
R
32
−
R
23
R
13
−
R
31
R
21
−
R
12
]
u = \frac{1}{2\sin\theta} \begin{bmatrix} R_{32} - R_{23} \\ R_{13} - R_{31} \\ R_{21} - R_{12} \end{bmatrix}
u=2sinθ1
R32−R23R13−R31R21−R12
t
r
a
c
e
(
R
)
trace(R)
trace(R)为迹。
4. 旋转向量到四元数 q
对于给定的欧拉角,构造四元数 q = [w, v],其中 w 是实部,v 是虚部向量:
q = cos ( θ 2 ) + sin ( θ 2 ) ( v x i + v y j + v z k ) q = \cos\left(\frac{\theta}{2}\right) + \sin\left(\frac{\theta}{2}\right)(v_xi + v_yj + v_zk) q=cos(2θ)+sin(2θ)(vxi+vyj+vzk)
这里的 θ 是旋转总角度,向量 v 是旋转轴的方向,并且需归一化。
5. 旋转矩阵到四元数 q
给定旋转矩阵 R,可以转化为四元数 q:
q = [ w v x v y v z ] = [ 1 2 1 + tr ( R ) 1 2 w [ ( R 32 − R 23 ) , ( R 13 − R 31 ) , ( R 21 − R 12 ) ] ] q = \begin{bmatrix} w \\ v_x \\ v_y \\ v_z \end{bmatrix} = \begin{bmatrix} \frac{1}{2}\sqrt{1+\text{tr}(R)} \\ \frac{1}{2w}[(R_{32}-R_{23}), (R_{13}-R_{31}), (R_{21}-R_{12})] \end{bmatrix} q= wvxvyvz =[211+tr(R)2w1[(R32−R23),(R13−R31),(R21−R12)]]
确保四元数的实部 w 正确反映旋转角度,其余部分构成旋转轴向量。
6. 四元数到旋转矩阵 R
给定四元数 q = [w, v],可以计算旋转矩阵 R:
R = [ 1 − 2 ( v y 2 + v z 2 ) 2 ( v x v y − w v z ) 2 ( v x v z + w v y ) 2 ( v x v y + w v z ) 1 − 2 ( v x 2 + v z 2 ) 2 ( v y v z − w v x ) 2 ( v x v z − w v y ) 2 ( v y v z + w v x ) 1 − 2 ( v x 2 + v y 2 ) ] R = \begin{bmatrix} 1 - 2(v_y^2 + v_z^2) & 2(v_xv_y - wv_z) & 2(v_xv_z + wv_y) \\ 2(v_xv_y + wv_z) & 1 - 2(v_x^2 + v_z^2) & 2(v_yv_z - wv_x) \\ 2(v_xv_z - wv_y) & 2(v_yv_z + wv_x) & 1 - 2(v_x^2 + v_y^2) \end{bmatrix} R= 1−2(vy2+vz2)2(vxvy+wvz)2(vxvz−wvy)2(vxvy−wvz)1−2(vx2+vz2)2(vyvz+wvx)2(vxvz+wvy)2(vyvz−wvx)1−2(vx2+vy2)
7. 四元数到旋转向量
从四元数 q 可以先转成旋转矩阵 R,然后再通过上述旋转矩阵到旋转向量的转换步骤得出旋转向量。
8. 李代数到李群
指数映射的具体形式依赖于所讨论的李代数及其对应的李群。然而,在许多常见的情况下,指数映射可以通过幂级数展开来定义。对于一个李代数元素 (X),其指数映射通常写作:
exp ( X ) = e X = I + X + 1 2 ! X 2 + 1 3 ! X 3 + ⋯ \exp(X) = e^X = I + X + \frac{1}{2!}X^2 + \frac{1}{3!}X^3 + \cdots exp(X)=eX=I+X+2!1X2+3!1X3+⋯
这里的 I I I 表示单位元(对于矩阵李代数就是单位矩阵), X 2 X^2 X2是 X X X与自身两次乘积,以此类推。这个级数对于可对角化或者属于特定类型的李代数元素(如正交群 (O(n)) 或特殊正交群 (SO(n)) 的李代数)会收敛,并给出李群中的一个元素。
例如,在 S O ( 3 ) SO(3) SO(3)李群中,其李代数 s o ( 3 ) so(3) so(3) 可以用3维向量(旋转向量)表示,指数映射对应于旋转矩阵:
exp ( θ ω ^ ) = I + sin θ ⋅ ω ^ + ( 1 − cos θ ) ⋅ ω ^ 2 \exp(\theta \hat{\boldsymbol{\omega}}) = I + \sin\theta \cdot \hat{\boldsymbol{\omega}} + (1 - \cos\theta) \cdot \hat{\boldsymbol{\omega}}^2 exp(θω^)=I+sinθ⋅ω^+(1−cosθ)⋅ω^2
其中 ω ^ \hat{\boldsymbol{\omega}} ω^ 是单位旋转向量, θ \theta θ是旋转的角度, ω ^ 2 \hat{\boldsymbol{\omega}}^2 ω^2是反对称矩阵形式的旋转向量与其自身的外积。
需要注意的是,上述 S O ( 3 ) SO(3) SO(3)的指数映射形式经过了简化处理,实际应用时通常采用罗德里格斯公式进行计算。对于其他李群及其李代数,指数映射的形式可能会有所不同。
以上是一些基本的转换关系,实际应用中要注意旋转顺序和正负号的影响,尤其是在欧拉角的转换过程中。