四元数与3D旋转

四元数与3D旋转

摘要:介绍四元数的一些性质,及其推导过程。主要参考Krasjet的文档,写的非常详细,如果想看更加详细的过程,建议去看看文档。这里主要做了简洁浓缩,方便快速查看。

一、复数与2D旋转

在讲解四元数之前,先讲解下复数的性质。后续四元数有很多相似的地方。

1.1 复数的表示

任意一个复数 𝑧 ∈ C 都可以表示为 𝑧 = 𝑎 + 𝑏𝑖 的形式,其中 𝑎, 𝑏 ∈ R 而且 𝑖 2 = − 1 𝑖^{2} = −1 i2=1。我们将 𝑎 称之为这个复数的实部(Real Part),𝑏 称之为这个复数的虚部(Imaginary Part)。
在这里插入图片描述
𝑧 = 𝑎 + 𝑏𝑖 其实就是对于 {1, 𝑖} 这个基的线性组合,我们也可以用向量来表示一个复数:
z = [ a b ] z=\begin{bmatrix} a\\ b \end{bmatrix} z=[ab]

1.2 复数的乘法

如果有两个复数 𝑧 1 = 𝑎 + 𝑏 𝑖 , 𝑧 2 = 𝑐 + 𝑑 𝑖 𝑧_{1} = 𝑎 + 𝑏𝑖, 𝑧_{2} = 𝑐 + 𝑑𝑖 z1=a+bi,z2=c+di,我们可以使用分配律来计算它们的乘积:
𝑧 1 𝑧 2 = ( 𝑎 + 𝑏 𝑖 ) ( 𝑐 + 𝑑 𝑖 ) = 𝑎 𝑐 + 𝑎 𝑑 𝑖 + 𝑏 𝑐 𝑖 + 𝑏 𝑑 𝑖 2 𝑧_{1}𝑧_{2} = (𝑎 + 𝑏𝑖)(𝑐 + 𝑑𝑖) = 𝑎𝑐 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖 + 𝑏𝑑𝑖^{2} z1z2=(a+bi)(c+di)=ac+adi+bci+bdi2

其中 𝑖 2 = − 1 𝑖^{2} = -1 i2=1,进一步化简为:
𝑧 1 𝑧 2 = 𝑎 𝑐 − 𝑏 𝑑 + 𝑎 𝑑 𝑖 + 𝑏 𝑐 𝑖 = 𝑎 𝑐 − 𝑏 𝑑 + ( 𝑏 𝑐 + 𝑎 𝑑 ) 𝑖 𝑧_{1}𝑧_{2} = 𝑎𝑐 − 𝑏𝑑 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖= 𝑎𝑐 − 𝑏𝑑+(𝑏𝑐 + 𝑎𝑑)𝑖\\ z1z2=acbd+adi+bci=acbd+(bc+ad)i
写成矩阵的形式如下:
𝑧 1 𝑧 2 = [ a − b b a ] . [ c d ] 𝑧_{1}𝑧_{2}=\begin{bmatrix} a & -b\\ b & a \end{bmatrix}.\begin{bmatrix} c\\ d \end{bmatrix} z1z2=[abba].[cd]

右侧的 [ c d ] \begin{bmatrix} c\\ d \end{bmatrix} [cd]是用向量的形式来表示的 𝑧 2 𝑧_{2} z2,而左侧的 [ a − b b a ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} [abba]则是 z 1 z_{1} z1 的矩阵形式。我们可以发现,复数相乘这个运算,其实是与 [ a − b b a ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} [abba]这个矩阵所代表的变换是等价的。

1.3 复数的模长与共轭

如果 𝑧 = 𝑎 + 𝑏𝑖,那么它的模长为:
∣ ∣ z ∣ ∣ = a 2 + b 2 ||z|| = \sqrt{a^{2}+b^{2}} z=a2+b2
共轭为:
z ‾ = 𝑎 − 𝑏 𝑖 \overline{z}= 𝑎 − 𝑏𝑖 z=abi
复数的模长 ∣ ∣ z ∣ ∣ ||z|| z,可以通过与其共轭矩阵相乘得到:
𝑧 z ‾ = ( 𝑎 + 𝑏 𝑖 ) ( 𝑎 − 𝑏 𝑖 ) = 𝑎 2 − 𝑎 𝑏 𝑖 + 𝑎 𝑏 𝑖 + 𝑏 2 = 𝑎 2 + 𝑏 2 = ∥ 𝑧 ∥ 2 𝑧\overline{z} = (𝑎 + 𝑏𝑖)(𝑎 − 𝑏𝑖)= 𝑎 2 − 𝑎𝑏𝑖 + 𝑎𝑏𝑖 + 𝑏 2= 𝑎 2 + 𝑏 2 = ∥𝑧 ∥ 2 zz=(a+bi)(abi)=a2abi+abi+b2=a2+b2=z2

1.4 复数相乘与 2D 旋转

既然与复数的相乘代表着 [ a − b b a ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} [abba]矩阵所作出的变换,那这种变换代表着什么呢?
[ a − b b a ] = a 2 + b 2 . [ a a 2 + b 2 − b a 2 + b 2 b a 2 + b 2 a a 2 + b 2 ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} = \sqrt{a^{2}+b^{2}}.\begin{bmatrix} \frac{a}{\sqrt{a^{2}+b^{2}}} & \frac{-b}{\sqrt{a^{2}+b^{2}}}\\ \frac{b}{\sqrt{a^{2}+b^{2}}} & \frac{a}{\sqrt{a^{2}+b^{2}}} \end{bmatrix} [abba]=a2+b2 .[a2+b2 aa2+b2 ba2+b2 ba2+b2 a]
结合下面的图形,上面的矩阵可以变成下面的形式:
在这里插入图片描述
[ a − b b a ] = a 2 + b 2 . [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] = ∣ ∣ z ∣ ∣ . [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} = \sqrt{a^{2}+b^{2}}.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}= ||z||.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix} [abba]=a2+b2 .[cos(θ)sin(θ)sin(θ)cos(θ)]=z.[cos(θ)sin(θ)sin(θ)cos(θ)]
右边的 [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] \begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix} [cos(θ)sin(θ)sin(θ)cos(θ)]则是我们熟悉的 2D 旋转矩阵,左侧的模长 ∣ ∣ z ∣ ∣ ||z|| z则是缩放。

综上得到复数表示的2D旋转公式:

如果我们将向量 v = [ x y ] v=\begin{bmatrix} x\\ y \end{bmatrix} v=[xy]看作是一个复数 𝑣 = 𝑥 + 𝑦𝑖,其中实部为 𝑥,虚部为 𝑦。
那么,我们可以构造一个复数 𝑧 = cos( θ ) + 𝑖 sin( θ ),并将它与 𝑣 相乘来进行旋转。
旋转 θ 度之后的向量 𝑣 ′ 可以用等价的复数乘法来表示:
𝑣 ′ = 𝑧 𝑣 = ( c o s ( θ ) + 𝑖 s i n ( θ ) ) 𝑣 𝑣 ′ = 𝑧𝑣 = (cos( θ ) + 𝑖 sin( θ ))𝑣 v=zv=(cos(θ)+isin(θ))v

1.5 复数的极坐标形式

根据欧拉公式:
c o s ( θ ) + 𝑖 s i n ( θ ) = 𝑒 𝑖 θ cos( θ ) + 𝑖 sin( θ ) = 𝑒^{𝑖θ} cos(θ)+isin(θ)=eiθ
可以得到复数的指数形式:
z = ∣ ∣ z ∣ ∣ . [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] = ∣ ∣ z ∣ ∣ ( c o s ( θ ) + i s i n ( θ ) ) = ∣ ∣ z ∣ ∣ e i θ z=||z||.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}=||z||(cos(\theta) + isin(\theta))=||z||e^{i\theta} z=z.[cos(θ)sin(θ)sin(θ)cos(θ)]=z(cos(θ)+isin(θ))=zeiθ
如果我们定义 𝑟 = ∥ 𝑧 ∥ 𝑟 = ∥𝑧∥ r=z,我们就得到了复数的极坐标形式:
𝑧 = 𝑟 e i θ 𝑧 = 𝑟e^{i\theta} z=reiθ

二、四元数的定义与性质

2.1 四元数的定义

四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。
𝑞 = 𝑎 + 𝑏 𝑖 + 𝑐 𝑗 + 𝑑 𝑘 , ( 𝑎 , 𝑏 , 𝑐 , 𝑑 ∈ R ) 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘, (𝑎, 𝑏, 𝑐, 𝑑 ∈ R) q=a+bi+cj+dk,(a,b,c,dR)

其中:
𝑖 2 = 𝑗 2 = 𝑘 2 = 𝑖 𝑗 𝑘 = − 1 𝑖^{2} = 𝑗^{2} = 𝑘^{2} = 𝑖𝑗 𝑘 = −1 i2=j2=k2=ijk=1
与复数类似,因为四元数其实就是对于基 {1, 𝑖, 𝑗, 𝑘} 的线性组合,四元数也可以写成向量的形式:
q = [ a b c d ] q=\begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix} q=abcd
除此之外,我们经常将四元数的实部与虚部分开,并用一个三维的向量来表示虚部,将它表示为标量和向量的有序对形式:
𝑞 = [ 𝑠 , v ] . ( v = [ x y z ] , 𝑠 , 𝑥 , 𝑦 , 𝑧 ∈ R ) 𝑞 = [𝑠, v]. (v =\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} , 𝑠, 𝑥, 𝑦, 𝑧 ∈ R) q=[s,v].(v=xyz,s,x,y,zR)

2.2 四元数的性质

针对于四元数𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘,介绍它的一些性质

模长:

∣ ∣ q ∣ ∣ = a 2 + b 2 + c 2 + d 2 ∣ ∣ q ∣ ∣ = s 2 + ∣ ∣ v ∣ ∣ 2 = s 2 + v . v ||q||=\sqrt{a^{2}+b^{2}+c^{2}+d^{2}}\\ ||q||=\sqrt{s^{2}+||v||^{2}}=\sqrt{s^{2}+v.v} q=a2+b2+c2+d2 q=s2+v2 =s2+v.v

加减法

四元数的加法只需要将分量相加就可以了

乘法

除了交换律之外,我们经常使用的结合律和分配律在四元数内都是成立的。
如果有两个四元数 𝑞 1 = 𝑎 + 𝑏 𝑖 + 𝑐 𝑗 + 𝑑 𝑘 𝑞_{1} = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘 q1=a+bi+cj+dk 𝑞 2 = 𝑒 + 𝑓 𝑖 + 𝑔 𝑗 + h 𝑘 𝑞_{2} = 𝑒 + 𝑓 𝑖 + 𝑔 𝑗 + ℎ𝑘 q2=e+fi+gj+hk,那么他们的相乘为:
在这里插入图片描述

2.3 四元数的矩阵形式

从上述公式看出,四元数的相乘其实也是一个线性组合,我们同样可以将它写成矩阵的形式:
在这里插入图片描述
注意,这个矩阵所做出的变换等价于左乘 𝑞 1 𝑞_{1} q1
因为四元数不符合交换律,所以右乘 𝑞 1 𝑞_{1} q1 的变换是一个不同的矩阵。
在这里插入图片描述

2.4 Graßmann 积

对上述公式,寻找规律,可以得到另一种形式的表达,也就是Graßmann 积(想知道详细过程,建议看看源文档3.1.6)。
如果令 v = [ b c d ] v=\begin{bmatrix} b\\ c\\ d \end{bmatrix} v=bcd, u = [ f g h ] u=\begin{bmatrix} f\\ g\\ h \end{bmatrix} u=fgh那么:
𝑞 1 𝑞 2 = [ 𝑎 𝑒 − v ⋅ u , 𝑎 u + 𝑒 v + v × u ] 𝑞_{1}𝑞_{2} = [𝑎𝑒 − \textbf{v}· \textbf{u}, 𝑎\textbf{u} + 𝑒\textbf{v} + \textbf{v} × \textbf{u}] q1q2=[aevu,au+ev+v×u]

2.5 纯四元数

实部为0,仅有虚部的四元数,为纯四元数.因为纯四元数仅由虚部的 3D 向量决定,我们可以将任意的 3D 向量 v \textbf{v} v转换为纯四元数。
𝑣 = [ 0 , v ] 𝑣 = [0, \textbf{v}] v=[0,v]
如果有两个纯四元数 𝑣 = [ 0 , v ] , 𝑢 = [ 0 , u ] 𝑣 = [0, \textbf{v}], 𝑢 = [0, \textbf{u}] v=[0,v],u=[0,u],根据Graßmann 积可得:
𝑣 𝑢 = [ 0 − v ⋅ u , 0 + v × u ] = [ − v ⋅ u , v × u ] 𝑣𝑢 = [0 − \textbf{v} · \textbf{u}, 0 + \textbf{v} × \textbf{u}] = [−\textbf{v} · \textbf{u}, \textbf{v} × \textbf{u}] vu=[0vu,0+v×u]=[vu,v×u]

2.6 逆和共轭

因为四元数是不遵守交换律的,我们通常不会将两个四元数相除写为 p q \frac{p}{q} qp的形式,而是写成逆的形式。

  • 四元数的逆
    q − 1 q^{-1} q1 q q q的逆,规定:
    𝑞 𝑞 − 1 = 𝑞 − 1 𝑞 = 1 𝑞𝑞^{-1} = 𝑞^{-1} 𝑞 = 1 qq1=q1q=1
  • 共轭
    𝑞 = [ 𝑠 , v ] 𝑞 = [𝑠, \textbf{v}] q=[s,v] 的共轭为 𝑞 ∗ = [ 𝑠 , − v ] 𝑞 ∗ = [𝑠, −\textbf{v}] q=[s,v]
    共轭矩阵有如下性质:
    𝑞 𝑞 ∗ = [ 𝑠 , v ] ⋅ [ 𝑠 , − v ] = [ 𝑠 2 − v ⋅ ( − v ) , 𝑠 ( − v ) + 𝑠 v + v × ( − v ) ] = [ 𝑠 2 + v ⋅ v , 0 ] = ∥ 𝑞 ∥ 2 𝑞 ∗ 𝑞 = [ 𝑠 , − v ] ⋅ [ 𝑠 , v ] = [ 𝑠 2 − ( − v ) ⋅ v , 𝑠 v + 𝑠 ( − v ) + ( − v ) × v ] = [ 𝑠 2 + v ⋅ v , 0 ] = ∥ 𝑞 ∥ 2 𝑞𝑞^{*} = [𝑠, \textbf{v}] · [𝑠, −\textbf{v}] = [𝑠^{2} − \textbf{v} · (−\textbf{v}), 𝑠(−\textbf{v}) + 𝑠\textbf{v} + \textbf{v} × (−\textbf{v})] = [𝑠^{2} + \textbf{v} · \textbf{v}, 0]=∥𝑞∥^{2}\\ 𝑞^{*}𝑞 = [𝑠, -\textbf{v}] · [𝑠, \textbf{v}] = [𝑠^{2} − (-\textbf{v}) ·\textbf{v}, 𝑠\textbf{v} + 𝑠(−\textbf{v}) + (−\textbf{v})× \textbf{v}] = [𝑠^{2} + \textbf{v} · \textbf{v}, 0]=∥𝑞∥^{2} qq=[s,v][s,v]=[s2v(v),s(v)+sv+v×(v)]=[s2+vv,0]=q2qq=[s,v][s,v]=[s2(v)v,sv+s(v)+(v)×v]=[s2+vv,0]=q2
  • 根据共轭求逆
    根据逆的性质,可以得到小面的推导:
    𝑞 𝑞 − 1 = 1 𝑞 ∗ 𝑞 𝑞 − 1 = 𝑞 ∗ ( 𝑞 ∗ 𝑞 ) 𝑞 − 1 = 𝑞 ∗ ∣ ∣ q ∣ ∣ 𝑞 − 1 = 𝑞 ∗ 𝑞 − 1 = 𝑞 ∗ ∣ ∣ q ∣ ∣ 𝑞𝑞^{-1} = 1\\ 𝑞^{*}𝑞𝑞^{-1} = 𝑞^{*}\\ (𝑞^{*}𝑞)𝑞^{-1} = 𝑞^{*}\\ ||q||𝑞^{-1} = 𝑞^{*} \\ 𝑞^{-1} = \frac{𝑞^{*}}{||q||}\\ qq1=1qqq1=q(qq)q1=qqq1=qq1=qq
    如果 ∥ 𝑞 ∥ = 1 ∥𝑞 ∥ = 1 q=1
    𝑞 − 1 = 𝑞 ∗ 𝑞^{-1} =𝑞^{*} q1=q

三、四元数与3D旋转

如果我们需要将一个向量 v v v 沿着一个用单位向量所定义的旋转轴 u u u 旋转 θ θ θ度,那么我们可以将这个向量 v v v拆分为正交于旋转轴的 v ⊥ v⊥ v 以及平行于旋转轴的 v ∥ v∥ v
我们可以对这两个分向量分别进行旋转,获得 v ′ ⊥ v ′⊥ v v ′ ∥ v ′∥ v
将它们相加就是 v v v 旋转之后的结果 v ′ = v ′ ∥ + v ′ ⊥ v ′ = v ′∥ + v ′⊥ v=v+v
关于这块的详细推导可以参考上篇博客《罗德里格斯公式(Rodrigues Formula)》
我们可以将这些向量定义为纯四元数:

注意:加黑的为向量,不加黑的为纯四元数

在这里插入图片描述

3.1 垂直量 v ⊥ v_{⊥} v的旋转

我们首先讨论正交于旋转轴的 𝑣 ⊥ 𝑣_{⊥} v《罗德里格斯公式(Rodrigues Formula)》里推导过,如果一个向量 v ⊥ \textbf{v}_{⊥} v 正交于旋转轴 u \textbf{u} u,那么旋转 θ θ θ度之后,得到的向量 v ′ ⊥ \textbf{v} ′_{⊥} v为:
v ′ ⊥ = c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) \textbf{v} ′_{⊥}= cos( θ )\textbf{v}_{⊥} + sin( θ )(\textbf{u} ×\textbf{v}_{⊥} ) v=cos(θ)v+sin(θ)(u×v)
我们可以很容易地将前面的 v ′ ⊥ \textbf{v} ′_{⊥} v v ⊥ \textbf{v}_{⊥} v 替换为 𝑣 ⊥ 𝑣_{⊥} v 𝑣 ⊥ 𝑣_{⊥} v
但是我们仍遗留下来了一个 u × v ⊥ \textbf{u}× \textbf{v}_{⊥} u×v 。幸运的是,利用四元数的性质,我们可以将它写成四元数积的形式:
𝑢 𝑣 ⊥ = [ − u ⋅ v ⊥ , u × v ⊥ ] = [ 0 , u × v ⊥ ] = u × v ⊥ 𝑢𝑣 _{⊥} = [−\textbf{u} ·\textbf{v}_{⊥} , \textbf{u} × \textbf{v}_{⊥} ] = [0, \textbf{u} × \textbf{v}_{⊥}] = \textbf{u} × \textbf{v}_{⊥} uv=[uv,u×v]=[0,u×v]=u×v
𝑢 𝑣 ⊥ 𝑢𝑣 _{⊥} uv同样是一个纯虚四元数。最终我们得到:
v ′ ⊥ = c o s ( θ ) v ⊥ + s i n ( θ ) ( 𝑢 𝑣 ⊥ ) v ′_{⊥}= cos( θ )v_{⊥} + sin( θ )(𝑢𝑣 _{⊥}) v=cos(θ)v+sin(θ)(uv)
𝑣 ⊥ 𝑣 _{⊥} v提出来,将上面公式进一步变换:
v ′ ⊥ = ( c o s ( θ ) + s i n ( θ ) 𝑢 ) v ⊥ v ′_{⊥}= (cos( θ ) + sin( θ )𝑢)v_{⊥} v=(cos(θ)+sin(θ)u)v

如果我们将 c o s ( θ ) + s i n ( θ ) 𝑢 cos( θ ) + sin( θ )𝑢 cos(θ)+sin(θ)u 看做是一个四元数,我们就能将旋转写成四元数的乘积了:
v ′ ⊥ = q v ⊥ v ′_{⊥}= qv_{⊥} v=qv
如果对 q q q进一步变形:
𝑞 = c o s ( θ ) + s i n ( θ ) 𝑢 = [ c o s ( θ ) , 0 ] + [ 0 , s i n ( θ ) u ] = [ c o s ( θ ) , s i n ( θ ) u ] 𝑞 = cos( θ ) + sin( θ )𝑢 = [cos( θ ), \textbf{0}] + [0, sin( θ )\textbf{u}] = [cos( θ ), sin( θ )\textbf{u}] q=cos(θ)+sin(θ)u=[cos(θ),0]+[0,sin(θ)u]=[cos(θ),sin(θ)u]
如果旋转轴 u 的坐标为 [ u x u y u z ] \begin{bmatrix} u_{x}\\ u_{y}\\ u_{z} \end{bmatrix} uxuyuz,旋转角为 θ ,那么完成这一旋转所需要的四元数 𝑞 可以构造为:
𝑞 = c o s ( θ ) + s i n ( θ ) 𝑢 𝑥 i + s i n ( θ ) 𝑢 𝑦 j + s i n ( θ ) 𝑢 𝑧 k 𝑞 =cos( θ ) + sin( θ )𝑢_{𝑥}i + sin( θ )𝑢_{𝑦}j + sin( θ )𝑢_{𝑧}k q=cos(θ)+sin(θ)uxi+sin(θ)uyj+sin(θ)uzk

3.2 平行量 v ∥ v ∥ v 的旋转

平行量旋转之后,不做任何改变
𝑣 ′ ∥ = 𝑣 ∥ 𝑣 ′∥ = 𝑣 ∥ v=v

3.3 v v v 的旋转

对上面平行和垂直的旋转,进行合成,得到 𝑣 𝑣 v旋转之后的 𝑣 ′ 𝑣 ′ v
𝑣 ′ = 𝑣 ′ ∥ + 𝑣 ⊥ = 𝑣 ∥ + 𝑞 𝑣 ⊥ 𝑣 ′ = 𝑣 ′∥ + 𝑣 ⊥ = 𝑣 ∥ + 𝑞𝑣 ⊥ v=v+v=v+qv
在进一步变换之前,引入几个定理。

都可采用Graßmann 积证明

  • 定理1:如 果 𝑞 = [ c o s ( θ ) , s i n ( θ ) u ] 𝑞 = [cos( θ ), sin( θ )u] q=[cos(θ),sin(θ)u], 而 且 u u u 为 单 位 向 量, 那 么 𝑞 2 = 𝑞 𝑞 = [ c o s ( 2 θ ) , s i n ( 2 θ ) u ] 𝑞^{2} = 𝑞𝑞 =[cos(2θ ), sin(2θ)u] q2=qq=[cos(2θ),sin(2θ)u]
  • 定理2:假设 𝑣 ∥ = [ 0 , v ∥ ] 𝑣 ∥ = [0, v ∥ ] v=[0,v] 是一个纯四元数,而 𝑞 = [ α , β u ] 𝑞 =[\alpha , \beta u] q=[α,βu],其中 u u u 是一个单位向量, α , β ∈ R \alpha , \beta ∈ R α,βR
    如果 v ∥ v ∥ v 平行于 u u u,那么 𝑞 𝑣 ∥ = 𝑣 ∥ 𝑞 𝑞𝑣 ∥ = 𝑣 ∥ 𝑞 qv=vq.
  • 定理3:假设 𝑣 ⊥ = [ 0 , v ⊥ ] 𝑣_{⊥} = [0, v _{⊥} ] v=[0,v] 是一个纯四元数,而 𝑞 = [ α , β u ] 𝑞 = [\alpha , \beta u] q=[α,βu],其中 u u u 是一个单位向量, α , β ∈ R \alpha , \beta ∈ R α,βR
    如果 𝑣 ⊥ 𝑣_{⊥} v正交于 u u u,那么 𝑞 𝑣 ⊥ = 𝑣 ⊥ 𝑞 ∗ 𝑞𝑣_{⊥ }= 𝑣_{⊥} 𝑞^{*} qv=vq

现在进一步对 𝑣 ′ = 𝑣 ′ ∥ + 𝑣 ⊥ = 𝑣 ∥ + 𝑞 𝑣 ⊥ 𝑣 ′ = 𝑣 ′∥ + 𝑣 ⊥= 𝑣 ∥ + 𝑞𝑣 ⊥ v=v+v=v+qv进行变换:
在这里插入图片描述
𝑞 𝑞 q 一样, ∥ 𝑝 ∥ = 1 , 𝑝 ∥𝑝 ∥ = 1,𝑝 p=1p 也是一个单位四元数,也就是说:
𝑝 − 1 = 𝑝 ∗ 𝑝^{-1} = 𝑝^{*} p1=p
进一步对 𝑣 ′ 𝑣 ′ v进行变换:
𝑣 ′ = 𝑝 𝑝 − 1 𝑣 ∥ + 𝑝 𝑝 𝑣 ⊥ = 𝑝 𝑝 ∗ 𝑣 ∥ + 𝑝 𝑝 𝑣 ⊥ 𝑣 ′ = 𝑝𝑝^{-1}𝑣∥ + 𝑝𝑝𝑣_{⊥}=𝑝𝑝^{*}𝑣 ∥ + 𝑝𝑝𝑣_{⊥} v=pp1v+ppv=ppv+ppv
加入定理1、定理2,进一步变换:
𝑣 ′ = 𝑝 𝑝 ∗ 𝑣 ∥ + 𝑝 𝑝 𝑣 ⊥ = 𝑝 𝑣 ∥ 𝑝 ∗ + 𝑝 𝑣 ⊥ 𝑝 ∗ = p ( 𝑣 ∥ + 𝑣 ⊥ ) 𝑝 ∗ = p v 𝑝 ∗ 𝑣 ′ = 𝑝𝑝^{*}𝑣 ∥ + 𝑝𝑝𝑣_{⊥}=𝑝𝑣∥𝑝^{*} + 𝑝𝑣_{⊥}𝑝^{*}=p(𝑣∥+ 𝑣_{⊥})𝑝^{*}=pv𝑝^{*} v=ppv+ppv=pvp+pvp=p(v+v)p=pvp

3.4 四元数旋转

综上可以得到四元数表示的旋转。

任意向量 v v v 沿着以单位向量定义的旋转轴 u u u 旋转 θ θ θ 度之后的 v v v′ 可以使用四元数乘法来获得。
𝑣 = [ 0 , v ] , q = [ c o s ( 1 2 θ ) , s i n ( 1 2 θ ) u ] 𝑣 = [0, v],q=[cos(\frac{1}{2}\theta ),sin(\frac{1}{2}\theta)u] v=[0,v]q=[cos(21θ),sin(21θ)u],那么:
𝑣 ′ = q v q ∗ = q v q − 1 𝑣 ′ = qvq^{*}=qvq^{-1} v=qvq=qvq1

虽然这个公式非常简洁,但是它并不是那么直观。如果你想了解它真正的含义的话,还需要将它还原到变形之前的式子:
𝑣 ′ = 𝑞 𝑞 ∗ 𝑣 ∥ + 𝑞 𝑞 𝑣 ⊥ = 𝑣 ∥ + 𝑞 2 𝑣 ⊥ 𝑣 ′ = 𝑞𝑞^{*}𝑣 ∥ + 𝑞𝑞𝑣_{⊥} = 𝑣 ∥ + 𝑞^{2}𝑣_{⊥} v=qqv+qqv=v+q2v
因为所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位四元数 𝑞 = [ 𝑎 , b ] 𝑞 = [𝑎, \textbf{b}] q=[a,b]
可以得到旋转角度 θ θ θ
θ 2 = c o s − 1 ( a ) \frac{\theta }{2}=cos^{-1}(a) 2θ=cos1(a)
如果想要再获得旋转轴 u \textbf{u} u,那么只需要将 b \textbf{b} b的每一项都除以 s i n ( θ 2 ) sin(\frac{θ}{2}) sin(2θ)
u = b s i n ( θ 2 ) \textbf{u} = \frac{\textbf{b}}{sin(\frac{θ}{2})} u=sin(2θ)b

3.5 旋转的矩阵形式

之前讨论过,左乘一个四元数 𝑞 = 𝑎 + 𝑏 𝑖 + 𝑐 𝑗 + 𝑑 𝑘 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘 q=a+bi+cj+dk 等同于下面这个矩阵:
L ( q ) = [ a − b − c − d b a − d c c d a − b d c b a ] L(q)=\begin{bmatrix} a &-b & -c & -d\\ b & a & -d & c\\ c & d & a & -b\\ d & c & b & a \end{bmatrix} L(q)=abcdbadccdabdcba
右乘四元数 q q q,等同于下面这个矩阵:
L ( q ) = [ a − b − c − d b a d − c c − d a b d c − b a ] L(q)=\begin{bmatrix} a &-b & -c & -d\\ b & a & d & -c\\ c & -d & a & b\\ d & c & -b & a \end{bmatrix} L(q)=abcdbadccdabdcba
所以,我们可以利用这两个公式将 𝑣 ′ = 𝑞 𝑣 𝑞 ∗ 𝑣′ = 𝑞𝑣𝑞^{*} v=qvq 写成矩阵形式.假设 a = c o s ( θ 2 ) , b = s i n ( θ 2 ) u x , c = s i n ( θ 2 ) u y , d = s i n ( θ 2 ) u z , 𝑞 = 𝑎 + 𝑏 𝑖 + 𝑐 𝑗 + 𝑑 𝑘 a=cos(\frac{θ}{2}), b=sin(\frac{θ}{2})u_{x}, c=sin(\frac{θ}{2})u_{y}, d=sin(\frac{θ}{2})u_{z}, 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘 a=cos(2θ),b=sin(2θ)ux,c=sin(2θ)uy,d=sin(2θ)uz,q=a+bi+cj+dk,我们能得到:
𝑣 ′ = 𝑞 𝑣 𝑞 ∗ = 𝐿 ( 𝑞 ) 𝑅 ( 𝑞 ∗ ) 𝑣 = [ 1 0 0 0 0 1 − 2 c 2 − 2 d 2 2 b c − 2 a d 2 a c + 2 b d 0 2 b c + 2 a d 1 − 2 b 2 − 2 d 2 2 c d − 2 a b 0 2 b d − 2 a c 2 a b + 2 c d 1 − 2 b 2 − 2 c 2 ] v 𝑣 ′=𝑞𝑣𝑞^{*} = 𝐿(𝑞)𝑅(𝑞^{*})𝑣=\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1-2c^{2}-2d^{2} & 2bc -2ad & 2ac + 2bd\\ 0 & 2bc+2ad & 1-2b^{2}-2d^{2} & 2cd - 2ab\\ 0 & 2bd - 2ac & 2ab+2cd & 1-2b^{2}-2c^{2} \end{bmatrix}v v=qvq=L(q)R(q)v=1000012c22d22bc+2ad2bd2ac02bc2ad12b22d22ab+2cd02ac+2bd2cd2ab12b22c2v

这样我们就得到了 3D 旋转的矩阵形式。因为矩阵的最外圈不会对 𝑣 𝑣 v 进行任何变换,我们可以将它压缩成 3 × 3 矩阵(用作 3D 向量的变换)
v′ = [ 1 − 2 c 2 − 2 d 2 2 b c − 2 a d 2 a c + 2 b d 2 b c + 2 a d 1 − 2 b 2 − 2 d 2 2 c d − 2 a b 2 b d − 2 a c 2 a b + 2 c d 1 − 2 b 2 − 2 c 2 ] . v \textbf{v′}=\begin{bmatrix} 1-2c^{2}-2d^{2} & 2bc -2ad & 2ac + 2bd\\ 2bc+2ad & 1-2b^{2}-2d^{2} & 2cd - 2ab\\ 2bd - 2ac & 2ab+2cd & 1-2b^{2}-2c^{2} \end{bmatrix}.\textbf{v} v′=12c22d22bc+2ad2bd2ac2bc2ad12b22d22ab+2cd2ac+2bd2cd2ab12b22c2.v

四、双倍覆盖

四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示。
对任意的单位四元数 q = [ c o s ( θ 2 ) , s i n ( θ 2 ) u ] q = [cos(\frac{θ}{2}), sin(\frac{θ}{2})\textbf{u}] q=[cos(2θ),sin(2θ)u]
𝑞 𝑞 q − 𝑞 −𝑞 q代表的是同一个旋转。如果 𝑞 𝑞 q 表示的是沿着旋转轴 u u u 旋转 θ θ θ 度,那么 − 𝑞 −𝑞 q代表的是沿着相反的旋转轴 − u −u u 旋转 ( 2 π − θ ) (2π − θ ) (2πθ) 度。
− q = [ − c o s ( θ 2 ) , − s i n ( θ 2 ) u ] = [ c o s ( π − θ 2 ) , s i n ( π − θ 2 ) (-u) ] -q = [-cos(\frac{θ}{2}), -sin(\frac{θ}{2})\textbf{u}]= [cos(π -\frac{θ}{2}), sin(π-\frac{θ}{2})\textbf{(-u)}] q=[cos(2θ),sin(2θ)u]=[cos(π2θ),sin(π2θ)-u]
在这里插入图片描述有一点需要注意的是,虽然 𝑞 与 −𝑞 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的。旋转矩阵并不会出现双倍覆盖的问题。

五、四元数的指数形式

在讨论复数的时候,我们利用欧拉公式将 2D 的旋转写成了 𝑣 ′ = 𝑒 𝑖 θ 𝑣 𝑣 ′ = 𝑒^{𝑖 θ} 𝑣 v=eiθv 这样的指数形式.实际上,我们也可以利用四元数将 3D 旋转写成类似的形式。
如果 u \textbf{u} u 是一个单位向量,那么对于单位四元数 𝑢 = [ 0 , u ] 𝑢 = [0, \textbf{u}] u=[0,u],有:
𝑒 𝑢 θ = c o s ( θ ) + 𝑢 s i n ( θ ) = c o s ( θ ) + u s i n ( θ ) 𝑒^{𝑢θ} = cos( θ ) + 𝑢 sin( θ ) = cos( θ ) + \textbf{u}sin( θ ) euθ=cos(θ)+usin(θ)=cos(θ)+usin(θ)
这也就是说, 𝑞 = [ c o s ( θ ) , s i n ( θ ) u ] 𝑞 = [cos( θ ), sin( θ )\textbf{u}] q=[cos(θ),sin(θ)u] 可以使用指数表示为 𝑒 𝑢 θ 𝑒^{𝑢θ} euθ.

5.1 指数形式的旋转

任意向量 v v v 沿着以单位向量定义的旋转轴 u u u 旋转 θ θ θ 角度之后的 v ′ v ′ v 可以使用四元数的指数表示.令 𝑣 = [ 0 , v ] , 𝑢 = [ 0 , u ] 𝑣 = [0, \textbf{v}], 𝑢 = [0, \textbf{u}] v=[0,v],u=[0,u],那么:
v ′ = e u θ 2 v e − u θ 2 v ′=e^{u\frac{\theta }{2}}ve^{-u\frac{\theta }{2}} v=eu2θveu2θ

5.2 对数形式

对任意单位四元数 𝑞 = [ c o s ( θ ) , s i n ( θ ) u ] 𝑞 = [cos( θ ), sin( θ )\textbf{u}] q=[cos(θ),sin(θ)u]
l o g ( 𝑞 ) = l o g ( 𝑒 𝑢 θ ) = [ 0 , u θ ] log(𝑞) = log(𝑒^{𝑢θ} ) = [0, \textbf{u}θ ] log(q)=log(euθ)=[0,uθ]

5.3 幂运算

𝑞 t = ( 𝑒 𝑢 θ ) 𝑡 = 𝑒 𝑢 ( 𝑡 θ ) = [ c o s ( 𝑡 θ ) , s i n ( 𝑡 θ ) u ] 𝑞^{t} = (𝑒^{𝑢 θ}) 𝑡 = 𝑒^{𝑢(𝑡 θ )} = [cos(𝑡 θ ), sin(𝑡 θ )\textbf{u}] qt=(euθ)t=eu(tθ)=[cos(tθ),sin(tθ)u]
一个单位四元数的 𝑡 次幂等同于将它的旋转角度缩放至 𝑡 倍,并且不会改变它的旋转轴。

参考

四元数与三维旋转-Krasjet

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值