Published on

三维空间中的旋转

Authors
  • Name

这篇文章总结了用旋转矩阵 / 旋转向量 / 欧拉角 / 四元数对三维点进行旋转的方式以及他们之间的转换关系。


旋转矩阵

定义

旋转矩阵 RR 是一个行列式为 11 的正交矩阵(反过来说,行列式为 11 的正交矩阵是一个旋转矩阵也成立)。旋转矩阵的集合可以定义为

SO(n)={RRn×nRRT=I,det(R)=1}.\text{SO}(n) = \{\textbf{R} \in \mathbb{R}^{n \times n} | \textbf{RR}^T = \textbf{I}, \text{det}(\textbf{R}) = 1\}.

SO\text{SO} 为特殊正交群(Special Orthogonal Group),SO(3)\text{SO}(3) 中的元素就描述了三维空间内的旋转。

转换为旋转向量

根据罗德里格斯公式 [1]

tr(R)=1+2cosθ.\text{tr}(\textbf{R}) = 1 + 2\cos{\theta}.

故旋转角为

θ=arccos(tr(R)12).\theta = \arccos(\frac{\text{tr}(\textbf{R}) - 1}{2}).

由于旋转轴经过旋转矩阵 R\textbf{R} 旋转后不变,故有

Rn=n.\textbf{Rn} = \textbf{n}.

即转轴 n\textbf{n} 为矩阵 R\textbf{R} 特征值 11 对应的特征向量。求解方程后归一化即得到旋转轴 n\textbf{n}

转换为四元数

求出对应的旋转角 θ\theta 和旋转向量 n\textbf{n} 后,使用旋转向量 \rightarrow 四元数进行转换。

旋转向量

定义

在三维中,旋转矩阵用 9 个量描述一个三自由度的旋转,这种表达方式是冗余的,且旋转矩阵要求正交且行列式为 11,这些约束会使矩阵的估计和优化变得困难。旋转向量使用 3 个量描述一个三维空间中的旋转,其形式为 θn\theta \textbf{n},其中 θ\theta 为旋转的角度,n\textbf{n} 为旋转轴的方向。

转换为旋转矩阵

使用罗德里格斯公式 [1:1]

R=cosθI+(1cosθ)nnT+sinθn.\textbf{R} = \cos{\theta}\textbf{I} + (1 - \cos{\theta})\textbf{nn}^T + \sin{\theta}n^{\wedge}.

其中 \wedge 为向量到反对称矩阵的转换符:

n=[0n3n2n30n1n2n10].\textbf{n}^{\wedge} = \left [ \begin{array}{ccc} 0 & -n_3 & n_2 \\ n_3 & 0 & -n_1 \\ -n_2 & n_1 & 0 \end{array} \right ].

转换为四元数

记旋转轴方向为 n\textbf{n},旋转角度为 θ\theta,对应的四元数 q\textbf{q}

q=[cosθ2,n1sinθ2,n2sinθ2,n3sinθ2].\textbf{q} = [ \cos{\frac{\theta}{2}}, n_1\sin{\frac{\theta}{2}}, n_2\sin{\frac{\theta}{2}}, n_3\sin{\frac{\theta}{2}} ].

欧拉角

定义

欧拉角用直观的方式描述旋转。它使用三个角度 yaw pitch roll 来描述旋转,三个角度分别对应于刚体的 zz 轴,yy 轴和 xx 轴。对于 ZYXZYX 转角,旋转顺序可以描述为

  1. zz 轴旋转角度 yaw (偏航角)
  2. 旋转后的 yy 轴旋转角度 pitch (俯仰角)
  3. 旋转后的 xx 轴旋转 roll (滚转角)

此时可以使用一个向量 [r,p,y]T[r, p, y]^T 来描述任意旋转。

存在的问题是具有奇异性 [2] (俯仰角为 π2\frac{\pi}{2} 时,第一次旋转和第三次旋转的旋转轴是同一个轴,从而丢失了一个自由度)。

四元数

定义

旋转矩阵用 9 个量描述一个三自由度的旋转,这种表达方式是冗余的;旋转向量和欧拉角是紧凑的,但是具有奇异性(找不到不带奇异性的用三维向量描述三维旋转的方式[3])。回忆复数集 C\mathbb{C} 中的元素曾被用于表示复平面上的向量,复数的乘法则可以表示复平面上的旋转。三维空间中的旋转有一种类似的表示方式:四元数。四元数的运算此处暂时不详细列举。

一个虚四元数 p=[0,v0]\textbf{p} = [0, \textbf{v}_0] 可以表示一个三维空间中的点,其虚部 v0\textbf{v}_0 即为点的三维坐标。

一个单位四元数 q=[s,v]\textbf{q} = [s, \textbf{v}] 可以表示三维空间中的旋转,计算过程为

p=qpq1.\textbf{p}' = \textbf{qpq}^{-1}.

此处使用四元数的乘法(而不是四元数的数乘或点乘)。四元数的乘法具有如下形式

qaqb=[sasb+vavb,savb+sbva+va×vb].\textbf{q}_a\textbf{q}_b = [ s_as_b + \textbf{v}_a\cdot\textbf{v}_b, s_a\textbf{v}_b + s_b\textbf{v}_a + \textbf{v}_a \times \textbf{v}_b ].

可以验证 p\textbf{p}' 的实部为 00,是三维空间中的一个点。

注意四元数 q\textbf{q}q-\textbf{q} 表示的是同一个旋转。q\textbf{q} 表示的旋转操作的逆操作用 q1\textbf{q}^{-1} 表示,其中

q1=qq=q.\textbf{q}^{-1} = \frac{\textbf{q}^*}{||\textbf{q}||} = \textbf{q}^*.

由于表示旋转操作的四元数是一个单位四元数(q=1||\textbf{q}||=1),故其逆等于共轭,即其对应的逆操作也可以用它的共轭 q\textbf{q}^* 来表示。

转换为旋转矩阵

转换为旋转向量,然后 [从旋转向量转换到旋转矩阵](#转换为旋转矩阵)。

转换为旋转向量

参考旋转向量转四元数的操作,记旋转轴方向为 n\textbf{n},旋转 角度为 θ\theta,单位四元数 q=[s,v]\textbf{q} = [s, \textbf{v}] 对应的 n\textbf{n}θ\theta

θ=2arccoss,n=1sinθ2v.\theta = 2\arccos{s}, \\ \textbf{n} = \frac{1}{\sin{\frac{\theta}{2}}}\textbf{v}.


  1. Wikipedia - Rodrigues' Rotation Fomula ↩︎ ↩︎

  2. Wikipedia - Gimbal Lock ↩︎

  3. On the Parametrization of the Three-Dimensional Rotation Group ↩︎