先记住一句话

Axis-angle $(\mathbf u,\theta)$ 先变成 $q=[\cos(\theta/2),\mathbf u\sin(\theta/2)]$,再用纯四元数 $[0,\mathbf v]$ 做 $q[0,\mathbf v]q^{-1}$;乘法顺序不能交换。

复数的 2D 旋转Hamilton basisscalar-vector product单位四元数sandwich rotationcomposition / SLERP
Axis-angleu, θ
half angle
Unit quaternionq=[w,x,y,z]
left × right
Pure vectorq[0,v]q*
Rotated[0,v′]
Unit quaternion 的 inverse 等于 conjugate;只有按 q·v·q* 的顺序才对应这里采用的 active rotation convention。

1. 复数先告诉我们什么

单位复数 $z=\cos\theta+i\sin\theta$ 乘二维点,会把它绕原点旋转 $\theta$。模长相乘、角度相加,所以复数同时编码 scale 与 2D rotation。四元数把 basis 扩展为 $1,i,j,k$,但 multiplication 不再交换:

$$i^2=j^2=k^2=ijk=-1,\qquad ij=k,\;ji=-k.$$

非交换性正好容纳 3D rotation composition 的次序依赖:先绕 x 再绕 y,通常不同于先绕 y 再绕 x。

2. Scalar-vector 形式最适合手算

写 $q=[s,\mathbf v]$。两个四元数的 Hamilton product 是:

$$[s,\mathbf v]\,[t,\mathbf u]=[st-\mathbf v\cdot\mathbf u,\;s\mathbf u+t\mathbf v+\mathbf v\times\mathbf u].$$

Conjugate 为 $q^*=[s,-\mathbf v]$,norm 为 $\|q\|=\sqrt{s^2+\mathbf v\cdot\mathbf v}$,inverse 为 $q^{-1}=q^*/\|q\|^2$。只有 unit quaternion 才能直接写 $q^{-1}=q^*$。

3. Axis-angle 为什么出现半角

绕单位轴 $\mathbf u$ 旋转物理角度 $\theta$ 的单位 quaternion:

$$q=\left[\cos\frac\theta2,\;\mathbf u\sin\frac\theta2\right].$$

半角来自 sandwich product 左右各乘一次。恢复时应使用 $\theta=2\operatorname{atan2}(\|\mathbf q_v\|,w)$;当 $\sin(\theta/2)$ 不接近零时,axis 为 $\mathbf u=\mathbf q_v/\sin(\theta/2)$。注意分母是半角的 sine,不是 $\sin\theta$。

4. 向量怎样真正被旋转

把 $\mathbf v$ 嵌入纯四元数 $p=[0,\mathbf v]$,active rotation 定义为:

$$p'=q\,p\,q^{-1}.$$

结果 scalar part 为 0,vector part 等价于 Rodrigues formula。若 library 使用 passive frame rotation、row vectors 或不同 quaternion component order,公式外观可能相反;必须先写清 convention。

5. 六个逐步数字例子

例 1:Hamilton basis 不交换

$i=[0,(1,0,0)]$、$j=[0,(0,1,0)]$。Scalar part 都是 0;$i\times j=k$,所以 $ij=k$。反过来 $j\times i=-k$,因此 $ji=-k$。

例 2:conjugate 与 inverse

$q=[1,(2,0,0)]$,$\|q\|^2=1^2+2^2=5$,所以 $q^{-1}=[1,(-2,0,0)]/5=[0.2,(-0.4,0,0)]$。它不是 unit quaternion,不能只取 conjugate。

例 3:90° 绕 z 的 quaternion

$\mathbf u=(0,0,1)$、$\theta=90°$,半角 45°:$q=[\cos45°,0,0,\sin45°]\approx[0.7071,0,0,0.7071]$。

例 4:sandwich product 旋转 x 轴

用上例 q 和 $p=[0,1,0,0]$:先得 $qp=[0,0.7071,0.7071,0]$,再乘 $q^*=[0.7071,0,0,-0.7071]$,得 $p'=[0,0,1,0]$,即 $(1,0,0)\to(0,1,0)$。

例 5:double cover

$q=[0.7071,0,0,0.7071]$ 与 $-q=[-0.7071,0,0,-0.7071]$ 在 $q p q^{-1}$ 中负号出现两次并抵消,所以表示同一旋转。插值前若 dot(q₀,q₁)<0,通常先翻转一个符号走短弧。

例 6:composition 的顺序

若 $q_x$ 先作用、$q_z$ 后作用,则 combined active rotation 是 $q=q_zq_x$,因为 $q_z(q_x p q_x^{-1})q_z^{-1}=(q_zq_x)p(q_zq_x)^{-1}$。写成 $q_xq_z$ 会反转动作顺序。

6. 拖动角度,看 quaternion 与向量一起变化

q = [0.7071, 0, 0, 0.7071]

+x+yv′=(0.00, 1.00)
$q=[\cos(\theta/2),0,0,\sin(\theta/2)]$ 把初始向量 $(1,0,0)$ 变成 $(\cos\theta,\sin\theta,0)$。

7. Interpolation 与数值边界

  • Normalize:积分 angular velocity 或网络回归后,重新归一化以留在 unit 3-sphere;
  • SLERP:沿 4D unit sphere 的 great circle 以恒定角速度插值;先处理 double-cover sign;
  • Small angle:$\sin(\theta/2)$ 很小时 axis 不稳定,但 rotation 本身接近 identity,可用 rotation vector/series;
  • Component order:有的 API 用 [w,x,y,z],有的用 [x,y,z,w];永远在边界显式转换;
  • Normalize 不修复 convention:乘法顺序、active/passive 或 frame 写错,unit norm 仍会产生错误方向。
常见误解:

Quaternion 有四个数不代表 rotation 有四个自由度。Unit-norm constraint 去掉一个自由度,而 $q\sim-q$ 是离散 double cover;最终仍是 3-DOF rotation。它避免 Euler parameterization 的 gimbal lock,不代表所有数值表示都不会接近奇异边界。

自测

1. 为什么 axis-angle 转 quaternion 用 θ/2?

向量通过左右 sandwich multiplication 各作用一次,最终物理 rotation angle 是 quaternion 参数角的两倍。

2. q 和 −q 为什么表示同一旋转?

在 q p q⁻¹ 中两个负号相消;它们是 unit 3-sphere 上映射到同一个 SO(3) rotation 的对跖点。

3. 两个 rotation composition 为什么不能交换?

Hamilton product 含 vector cross product,交换次序会翻转 cross term;3D sequential rotations 本身也通常不交换。

4. 插值前为什么检查 quaternion dot product?

若 dot<0,两个表示位于 4D sphere 的相反半球;翻转一个 quaternion 不改物理姿态,却让 SLERP 选择较短路径。

一手与官方资料

Shoemake, Animating Rotation with Quaternion Curves提出计算机图形中的 quaternion interpolation;SciPy Rotation 官方文档明确 component representation、composition 与 conversion;ROS 2 tf2 Quaternion Fundamentals说明 normalize、inverse、relative rotation 与 RPY conversion。