复数与二维旋转·

设复数 z1=a1+b1i, z2=a2+b2iz_1 = a_1+b_1i,\ z_2 = a_2+b_2i,则

z1z2=(a1a2b1b2)+(a1b2+a2b1)iz_1z_2 = (a_1a_2 - b_1b_2) + (a_1b_2 + a_2b_1)i

将这个结果写成矩阵相乘的形式,

z1z2=[a1b1b1a1][a2b2]z_1z_2 = \begin{bmatrix} a_1 & -b_1\\ b_1 & a_1\\ \end{bmatrix} \begin{bmatrix} a_2\\b_2\\ \end{bmatrix}

说明 矩阵 R1=[a1b1b1a1]R_1 = \begin{bmatrix}a_1 & -b_1\\ b_1 & a_1\\ \end{bmatrix} 表示的几何变换与是复数乘法运算等价的

一般地,向量 [ab]\begin{bmatrix}a\\b \end{bmatrix} 在二维平面中对应一个直角三角形,两个直角边长度为 aabb,斜边长为 a2+b2\sqrt{a^2+b^2},即向量的模长,矩阵 R=[abba]R = \begin{bmatrix}a & -b\\ b & a\\ \end{bmatrix} 的每个元素同时除以模长,得到

R=[aa2+b2ba2+b2ba2+b2aa2+b2]R = \begin{bmatrix} \dfrac{a}{\sqrt{a^2+b^2}} & -\dfrac{b}{\sqrt{a^2+b^2}} \\ \dfrac{b}{\sqrt{a^2+b^2}} & \dfrac{a}{\sqrt{a^2+b^2}} \\ \end{bmatrix}

设向量 [ab]\begin{bmatrix}a\\b \end{bmatrix}xx 轴夹角为 θ\theta,则 cosθ=aa2+b2, sinθ=ba2+b2\cos\theta = \dfrac{a}{\sqrt{a^2+b^2}},\ \sin\theta = \dfrac{b}{\sqrt{a^2+b^2}}.

R=[cosθsinθsinθcosθ]R = \begin{bmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta\\ \end{bmatrix}

与该矩阵相乘在二维平面上实现的效果是 被乘的向量绕原点逆时针旋转 θ\theta.

由此可以发现,复数能够表示二维平面上的旋转,假设旋转角度为 θ\theta,定义单位复数旋转因子为

q=cosθ+isinθq = \cos\theta + i\sin\theta

被旋转的向量 z=a+ibz = a + ib,相乘得到被旋转 θ\theta 后的复数为

z=qz=(cosθ+isinθ)(a+ib)=(acosθbsinθ)+i(asinθ+bcosθ)\begin{aligned} z' = qz &= (\cos\theta + i\sin\theta)(a + ib)\\ &= (a\cos\theta - b\sin\theta) + i(a\sin\theta + b\cos\theta)\\ \end{aligned}

对应向量 [a,b][a,b] 在二维平面 x0yx0y 中绕原点逆时针旋转了 θ\theta.

四元数与三维旋转·

本文仅使用右手坐标系。

在三维空间中,向量 v\mathbf{v} 绕某个旋转轴 u, u2=1\mathbf{u},\ |\mathbf{u}|^2=1 旋转,可以将向量 v\mathbf{v} 分解为平行于 u\mathbf{u} 的分量 v\mathbf{v}_{\parallel} 和垂直于 u\mathbf{u} 的分量 v\mathbf{v}_\perp,然后分别旋转这两个向量,再合并得到最后结果。

其中

v=uvu2u=(uv)uv=vv=v(uv)u\begin{aligned} \mathbf{v}_{\parallel} &= \dfrac{\mathbf{u}\cdot \mathbf{v}}{|\mathbf{u}|^2} \mathbf{u} = (\mathbf{u}\cdot \mathbf{v}) \mathbf{u}\\ \mathbf{v}_{\perp} &= \mathbf{v} - \mathbf{v}_{\parallel} = \mathbf{v} - (\mathbf{u}\cdot \mathbf{v}) \mathbf{u}\\ \end{aligned}

v\mathbf{v}_{\parallel} 始终与 u\mathbf{u} 重合,旋转 θ\theta 后的 v=v=(uv)u\mathbf{v}_{\parallel}' = \mathbf{v}_{\parallel} = (\mathbf{u}\cdot \mathbf{v}) \mathbf{u}

v\mathbf{v}_{\perp} 始终与 u\mathbf{u} 垂直,它的旋转可以看作二维平面内的旋转,如下图所示,

{w=u×vv=vv+vw=vcosθ+wsinθ=vcosθ+(u×v)sinθ=vcosθ+(u×(vv))sinθ=vcosθ+(u×v)sinθ\left\{ \begin{aligned} \mathbf{w} &= \mathbf{u}\times \mathbf{v}_{\perp}\\ \mathbf{v}_{\perp}' &= \mathbf{v}_{v}' + \mathbf{v}_{w}'\\ &= \mathbf{v}_{\perp}\cos\theta + \mathbf{w}\sin\theta\\ &= \mathbf{v}_{\perp}\cos\theta + (\mathbf{u}\times \mathbf{v}_{\perp})\sin\theta\\ &= \mathbf{v}_{\perp}\cos\theta + (\mathbf{u}\times (\mathbf{v} - \mathbf{v}_{\parallel}))\sin\theta\\ &= \mathbf{v}_{\perp}\cos\theta + (\mathbf{u}\times \mathbf{v})\sin\theta\\ \end{aligned} \right.

向量 v\mathbf{v} 绕旋转轴 u\mathbf{u}, 旋转的结果

v=v+v=vcosθ+(u×v)sinθ+(uv)u=vcosθ+(1cosθ)(uv)u+(u×v)sinθ\begin{aligned} \mathbf{v}' &= \mathbf{v}_{\perp}' + \mathbf{v}_{\parallel}'\\ &= \mathbf{v}_{\perp}\cos\theta + (\mathbf{u}\times \mathbf{v})\sin\theta + (\mathbf{u}\cdot \mathbf{v}) \mathbf{u}\\ &= \mathbf{v}\cos\theta + (1-\cos\theta)(\mathbf{u}\cdot\mathbf{v})\mathbf{u} + (\mathbf{u}\times \mathbf{v})\sin\theta\\ \end{aligned}


为了用“复数”形式表示类似的旋转,最简单的想法是在复数域再加一个维度,即在复数的基础上增加一个虚数 jj,假设三维空间中的“复数”为

q1=a1+b1i+c1jq2=a2+b2i+c2j\begin{aligned} q_1 &= a_1 + b_1i + c_1j\\ q_2 &= a_2 + b_2i + c_2j\\ \end{aligned}

显然,q1q_1q2q_2 相乘得到的结果中包含 ij,jiij,ji 这些交叉乘积项,并没有已知定义(与 q1,q2q_1, q_2 不在同一个向量空间中),因此不能表示三维空间中旋转的结果。

在二维平面中,向量可以在 x0yx0y 平面旋转,只需要一个虚数,而在三维空间中,向量旋转等效于在 x0y,x0z,y0zx0y,x0z,y0z 三个平面旋转,或许需要三个虚数表示才可以。

于是定义四元数,表示为 q=[s,v], sR,vR3q=[s,\mathbf{v}],\ s\in R, \mathbf{v}\in \mathbb{R}^3

q=s+xi+yj+zkq = s + xi + yj + zk

其中 i,j,ki,j,k 表示三个维度,并且根据笛卡尔坐标系下的外积运算法则,定义

ij=k,jk=i,ki=jji=k,kj=i,ik=ji2=j2=k2=ijk=1\begin{aligned} &ij = k, jk = i, ki = j\\ &ji =-k, kj =-i, ik =-j\\ &i^2 = j^2 = k^2 = ijk =-1\\ \end{aligned}

金雀花桥上的纪念石刻(图片来源于网络)

定义两个四元数

q1=s1+x1i+y1j+z1kq2=s2+x2i+y2j+z2k\begin{aligned} q_1 &= s_1 + x_1i + y_1j + z_1k\\ q_2 &= s_2 + x_2i + y_2j + z_2k\\ \end{aligned}

a=x1i+y1j+z1k, b=x2i+y2j+z2ka = x_1i+y_1j+z_1k,\ b = x_2i+y_2j+z_2k,相乘并化简得到

q1q2=(s1+x1i+y1j+z1k)(s2+x2i+y2j+z2k)=(s1s2x1x2y1y2z1z2)+(s1x2+s2x1+y1z2y2z1)i+(s1y2+s2y1x1z2+x2z1)j+(s1z2+s2z1+x1y2x2y1)k\begin{aligned} q_1q_2 &= (s_1 + x_1i + y_1j + z_1k)(s_2 + x_2i + y_2j + z_2k)\\ &= (s_1s_2 - x_1x_2 - y_1y_2 - z_1z_2) \\ &+ (s_1x_2 + s_2x_1 + y_1z_2 - y_2z_1)i \\ &+ (s_1y_2 + s_2y_1 - x_1z_2 + x_2z_1)j \\ &+ (s_1z_2 + s_2z_1 + x_1y_2 - x_2y_1)k\\ \end{aligned}

其中

s1s2x1x2y1y2z1z2=s1s2abs_1s_2 - x_1x_2 - y_1y_2 - z_1z_2 = s_1s_2 - a\cdot b

其余部分将 s1,s2s_1,s_2 提出,得到

=s1(x2i+y2j+z2k)+s2(x1i+y1j+z1k)+(y1z2y2z1)i+(z1x2z2x1)j+(x1y2x2y1)k=s1b+s2a+a×b\begin{aligned} \cdots &= s_1(x_2i+y_2j+z_2k) + s_2(x_1i+y_1j+z_1k)\\ &+(y_1z_2 - y_2z_1)i + (z_1x_2-z_2x_1)j + (x_1y_2 -x_2y_1)k\\ &= s_1b+s_2a + a\times b\\ \end{aligned}

最后得到两个四元数相乘的结果为

q1q2=[s1s2ab,s1b+s2a+a×b]q_1q_2 = [s_1s_2 - a\cdot b, s_1b+s_2a+a\times b]

也可以将相乘结果写成

q1q2=(s1+x1i+y1j+z1k)(s2+x2i+y2j+z2k)=(s1s2x1x2y1y2z1z2)+(x1s2+s1x2z1y2+y1z2)i+(y1s2+z1x2+s1y2x1z2)j+(z1s2y1x2+x1y2+s1z2)k\begin{aligned} q_1q_2 &= (s_1 + x_1i + y_1j + z_1k)(s_2 + x_2i + y_2j + z_2k)\\ &= (s_1s_2 - x_1x_2 - y_1y_2 - z_1z_2) \\ &+ ( x_1s_2 + s_1x_2 - z_1y_2 + y_1z_2)i \\ &+ (y_1s_2 + z_1x_2 + s_1y_2 - x_1z_2 )j \\ &+ (z_1s_2 - y_1x_2 + x_1y_2 + s_1z_2)k \\ \end{aligned}

该乘法结果可以表示成矩阵形式

[s1x1y1z1x1s1z1y1y1z1s1x1z1y1x1s1][s2x2y2z2]\begin{bmatrix} s_1 & -x_1 & -y_1 & -z_1\\ x_1 & s_1 & -z_1 & y_1\\ y_1 & z_1 & s_1 & -x_1\\ z_1 & -y_1 & x_1 & s_1\\ \end{bmatrix} \begin{bmatrix} s_2\\x_2\\y_2\\z_2\\ \end{bmatrix}

与矩阵类似,四元数的乘法并不遵循交换律。类比矩阵的逆的定义,定义四元数乘法的逆运算为 q1q^{-1},满足

qq1=q1q=1, q0qq^{-1} = q^{-1}q = 1,\ q\not = 0

与复数的共轭类似,定义四元数 q=s+xi+yj+zkq=s+xi+yj+zk 的共轭为

q=sxiyjzkq^* = s-xi-yj-zk

满足

qq=s2+vv=s2+x2+y2+z2=q2\begin{aligned} qq^* &= s^2 + \mathbf{v}\cdot \mathbf{v}\\ &= s^2 + x^2 + y^2 + z^2\\ &= ||q||^2\\ \end{aligned}

则有

qq1=1qqq1=qq2q1=qq1=qq2\begin{aligned} qq^{-1} &= 1\\ q^*qq^{-1} &= q^*\\ ||q||^2q^{-1} &= q^*\\ q^{-1} &= \dfrac{q^*}{||q||^2}\\ \end{aligned}

并且对于单位四元数来说,q1=qq^{-1}=q^*.


回到最初讨论的三维空间中的旋转问题,令 s1=0,q1=x1i+y1j+z1ks_1=0, q_1=x_1i+y_1j+z_1kq1q_1 表示三维空间的向量,相乘结果为

q1q2=[ab,s2a+a×b]q_1q_2 = [- a\cdot b, s_2a + a\times b]

为了使得旋转后的结果仍为三维向量,需要满足 ab=0-a\cdot b=0,即 aba\perp b.


只有虚部的四元数称为纯四元数,表示为 [0,v][0, \mathbf{v}],两个纯四元数的乘积为

v1v2=[0v1v2,0+v1×v2]=[v1v2,v1×v2]v_1v_2 = [0 - \mathbf{v}_1\cdot \mathbf{v}_2, 0 + v_1\times v_2] = [-\mathbf{v}_1\cdot \mathbf{v}_2, v_1\times v_2]

基于前文向量 v\mathbf{v} 绕旋转轴 u\mathbf{u} 的讨论,将向量均用纯四元数表示

v=[0,v], v=[0,v]v=[0,v], v=[0,v]v=[0,v], v=[0,v]u=[0,u]\begin{aligned} &v = [0, \mathbf{v}],\ v' = [0, \mathbf{v}']\\ &v_{\perp} = [0, \mathbf{v}_{\perp}],\ v_{\perp}' = [0, \mathbf{v}_{\perp}']\\ &v_{\parallel} = [0, \mathbf{v}_{\parallel}],\ v_{\parallel}' = [0, \mathbf{v}_{\parallel}']\\ &u = [0, \mathbf{u}]\\ \end{aligned}

向量 v\mathbf{v}_{\parallel} 旋转后的结果

v=v\mathbf{v}_{\parallel}' = \mathbf{v}_{\parallel}

向量 v\mathbf{v}_{\perp} 旋转后的结果

v=vcosθ+(u×v)sinθ\mathbf{v}_{\perp}' = \mathbf{v}_{\perp}\cos\theta + (\mathbf{u}\times \mathbf{v}_{\perp})\sin\theta

已知 uv=[uv,u×v]=[0,u×v]uv_{\perp} = [-\mathbf{u}\cdot \mathbf{v}_{\perp}, \mathbf{u}\times \mathbf{v}_{\perp}] = [0, \mathbf{u}\times \mathbf{v}_{\perp}],则

v=vcosθ+(uv)sinθ=(cosθ+sinθu)v\begin{aligned} \mathbf{v}_{\perp}' &= v_{\perp}\cos\theta + (uv_{\perp})\sin\theta\\ &= (\cos\theta + \sin\theta u)v_{\perp}\\ \end{aligned}

由此可以得出,完成旋转 θ\theta 这一变换的单位四元数可以构造为

q=cosθ+sinθu=[cosθ,sinθuxi+sinθuyj+sinθuzk], q=1q = \cos\theta + \sin\theta u = [\cos\theta, \sin\theta u_x i + \sin\theta u_y j + \sin\theta u_z k], \ |q| = 1

单位向量 u\mathbf{u} 指向转轴方向,待转向量 v\mathbf{v}_{\perp} 正交于 u\mathbf{u} 时,将旋转变换用四元数形式改写为

v=qvv_{\perp}' = qv_{\perp}


一般地,

v=v+v=v+qvv' = \mathbf{v}_{\parallel}' + \mathbf{v}_{\perp}' = \mathbf{v}_{\parallel} + q\mathbf{v}_{\perp}

p=[cos12θ,sin12θu], p=1p = [\cos\dfrac{1}{2}\theta, \sin\dfrac{1}{2}\theta u], \ |p|=1,则

v=pp1v+ppv=ppv+ppv=pvp+pvp=pvp\begin{aligned} v' &= pp^{-1}\mathbf{v}_{\parallel} + pp\mathbf{v}_{\perp}\\ &= pp^{*}\mathbf{v}_{\parallel} + pp\mathbf{v}_{\perp}\\ &= p\mathbf{v}_{\parallel}p^{*} + p\mathbf{v}_{\perp}p*\\ &= pvp*\\ \end{aligned}

最终得出结论,任意向量 v\mathbf{v} 绕指向转轴方向的单位向量 u\mathbf{u} 旋转 θ\theta,旋转后的 vv' 可以用下面运算得到

v=qvq=qvq1v' = qvq^* = qvq^{-1}

其中 v=[0,v],q=[cos12θ,sin12θu], q=1v = [0, \mathbf{v}], q = [\cos\dfrac{1}{2}\theta, \sin\dfrac{1}{2}\theta \mathbf{u}], \ |q|=1.


在表示二维平面中的旋转时,利用欧拉公式可以将旋转表示为指数形式 z=eiθzz'=e^{i\theta}z,类似地,对于单位四元数 u=[0,u]u=[0, \mathbf{u}],有

euθ=cosθ+usinθe^{u\theta} = \cos\theta + u\sin\theta

于是前面四元数的旋转表达式可以写成

v=qvq=qvq1=euθ2veuθ2v' = qvq^* = qvq^{-1} = e^{u\frac{\theta}{2}} v e^{-u\frac{\theta}{2}}

考察四元数 q-q 的变换,

q=[cos12θ,sin12θu]=[cos(π12θ),sin(π12θ)(u)]v=(q)v(q)=(1)2qvq=qvq\begin{aligned} -q &= [-\cos\dfrac{1}{2}\theta, -\sin\dfrac{1}{2}\theta\mathbf{u}]\\ &= [\cos(\pi - \dfrac{1}{2}\theta), \sin(\pi - \dfrac{1}{2}\theta) (-\mathbf{u})]\\ v' &= (-q)v(-q)^* = (-1)^2qvq^* = qvq^*\\ \end{aligned}

qq 的变换相同。从几何角度考虑,qq 表示绕转轴旋转 θ\theta,而 q-q 表示绕相反的转轴旋转 2πθ2\pi-\theta,所以说 单位四元数与三维旋转是一个二对一的满射同态关系

四元数插值与三维旋转·

前置知识:线性插值

已知函数 f(x)f(x) 在两点的值,要获得其它点数值,

f(x)=f(x0)+f(x1)f(x0)x1x0(xx0)f(x) = f(x_0) + \dfrac{f(x_1)-f(x_0)}{x_1-x_0}(x-x_0)

与函数的线性插值类似,下面讨论四元数的插值,用单位四元数 q1q_1 表示第一个方向,q2q_2 表示第二个方向,qq 表示最终的方向。

与线性插值类似,当插值参数 t=0t=0 时,插值的效果是将 qq 旋转到 q1q_1,当 t=1t=1 时,插值的效果是将 qq 旋转到 q2q_2

旋转的对象是角度,从指数形式 euθe^{u\theta} 考虑,“线性插值”的对象是四元数的指数,类比写出四元数插值的形式

q=q1(Δq)tq = q_1(\Delta q)^t

其中 q1q_1q2q_2 的角度差 Δq=q11q2\Delta q = q_1^{-1}q_2,即

q=q1(q11q2)tq = q_1(q_1^{-1}q_2)^t

当插值系数 t=0t=0 时,q=q1q=q_1,当 t=1t=1 时,q=q2q=q_2

注:四元数不止有一种定义形式,本文仅涉及 Hamilton 形式。

参考资料·

张小飞, 李建峰, 徐大专, 等.阵列信号处理及 MATLAB 实现[M].电子工业出版社,2020.(2.3 四元数理论)

Krasjet/quaternion

从复数乘法到旋转矩阵 - YourMath