先记住一句话
Axis-angle $(\mathbf u,\theta)$ 先变成 $q=[\cos(\theta/2),\mathbf u\sin(\theta/2)]$,再用纯四元数 $[0,\mathbf v]$ 做 $q[0,\mathbf v]q^{-1}$;乘法顺序不能交换。
1. 复数先告诉我们什么
单位复数 $z=\cos\theta+i\sin\theta$ 乘二维点,会把它绕原点旋转 $\theta$。模长相乘、角度相加,所以复数同时编码 scale 与 2D rotation。四元数把 basis 扩展为 $1,i,j,k$,但 multiplication 不再交换:
非交换性正好容纳 3D rotation composition 的次序依赖:先绕 x 再绕 y,通常不同于先绕 y 再绕 x。
2. Scalar-vector 形式最适合手算
写 $q=[s,\mathbf v]$。两个四元数的 Hamilton product 是:
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:
半角来自 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 定义为:
结果 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]
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。