四元数与旋转变换

Posted Terrell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四元数与旋转变换相关的知识,希望对你有一定的参考价值。

1、四元素的概念

1.1、复数

复数的提出将实数系直接扩大了一个维度,实数成了复数的一个特例。令\(\textbf{i}\)为虚数单位,即\(\textbf{i}^2\)=-1;欧拉公式
\[ e^{i\theta}=cos\theta + i\; sin \theta \]
把一个复数\(c=a+bi\)的极坐标写为
\[ c=re^{i\theta} \]
其中,\(r=\sqrt{a^2+b^2},\theta=arctan(b/a)\).

单位复数的乘法可以达到一个二维旋转的效果。设\(c\)绕原点旋转\(\phi\)角度后变为\(c‘\),利用复数表示为
\[ c‘=re^{i(\theta+\phi)}=re^{i\theta}e^{i\phi} \]
于是\(e^{i\phi}\)是复数平面上的一个旋转算子。这为二维平面的旋转提供来了一个简洁的方法。相应的,在三维空间中,我们可以使用四元数来对对象进行旋转。

2.1 、四元数的定义

四元数可以认为是复数的推广,1843年哈密顿(Hamilton)发明了四元数,这种数的形式为
\[ Q=q_0+q_1i+q_2j+q_3k \]
其中,\(i^2=j^2=k^2=-1,ij=-ji=k,jk=-kj=i,ki=-ik=j\),这新包含的4个量并不满足乘法交换律,\(i,j,k\)为三个正交的单位,四元数可有三种等价的表示方法,分别为
\[ Q=q_0+q_1i+q_2j+q_3k \Q=(q_0,\textbf{q})\quad \quad \quad \quad \quad \quad \Q = (q_0,q_1,q_2,q_3) \quad \quad \quad \\]
上面的\(\textbf{q}=(q_1,q_2,q_3)\)是三维空间的向量。下面解释下几个与四元数相关的概念

  • 四元数的模 ?

? 定义\(|Q|=\sqrt{q_0^2+q_1^2+q_2^2+q_3^2}\)为四元数的模。

  • 共轭四元数

? 定义\(Q\)的共轭四元数为\(Q^*=q_0-q_1i-q_2j-q_3k=(q_0,-\textbf{q})\).

  • 加法运算

? 设四元数\(a=(q_0,\textbf{q}),b=(p_0,\textbf{p})\),定义四元数的加法为
\[ a+b=(q_0+p_0,\textbf{q}+\textbf{p}) \]

  • 乘法运算

? 设四元数\(a=(q_0,\textbf{q}),b=(p_0,\textbf{p})\),定义四元数的乘法按照多项式乘法进行,即为直乘,用\(\circ\)表示四元数乘法,这里直接化简了
\[ a\circ b=p_0q_0-\textbf{q}\cdot\textbf{p}+p_0\textbf{q}+q_0\textbf{p}+\textbf{q}\times\textbf{p} \ =(p_0q_0-\textbf{q}\cdot\textbf{p},p_0\textbf{q}+q_0\textbf{p}+\textbf{q}\times\textbf{p}) \]

  • 四元数的单位元\(1\),也可以表示为\((1,0)\),容易得到
    \[ Q^{*}\circ Q=-(-Q)\circ Q=Q\circ Q=|Q|^2 \]

  • 四元数的逆定义为\(Q \circ Q^{-1}=1\),容易得到
    \[ Q^{-1}=\frac{1}{|Q|^2}Q^*=\frac{1}{|Q|^2}(q_0,-\textbf{q}) \]

  • 纯虚四元数

? 复数中有纯虚数,四元数中同样有纯虚四元数,纯虚四元数的实部为0,形式为\((0,\textbf{q})\).四元数是一个四维空间,纯虚四位数是一个四维数空间的一个三维子空间,就相当于四维空间在某一个方向对三维超平面的一个投影。这就好比在三维坐标系中,令\(z=0\)则得到一个平面,这个平面就是三维空间的一个二维子空间。

现在我们应该知道,四元数其实是复数扩充的结果,复数的虚部只有一个,而四元数的虚部有三个,且两两相互正交。四元数失去了复数运算交换律的特性参考博士论文,保留了复数绝大部份代数特性。为了表示方便,下面将四元数的乘法符号\(\circ\)省写。

1.2、四元数的指数表示

对四元数\(Q=q_0+q_1i+q_2j+q_3k\)做以下变形,记\(\textbf{q}=(q_1,q_2,q_3)\),\(\rho = |\textbf{q}|,\textbf{q}=\rho \textbf{e}_n\),其中\(\textbf{e}_n\)\(\textbf{q}\)的单位方向向量。也即为
\[ r=|Q|=\sqrt{q_0^2+\rho^2} \cos \theta = \frac{q_0}{r} \quad sin \theta = \frac{\rho}{r} \\]
于是可得到
\[ Q=r(cos \theta +\textbf{e}_nsin\theta)=re^{\textbf{e}_n\theta} \]
\(\textbf{e}_n\)类似于复数中的\(i\),上面表达式表明了四元数的几何意义,任意一个四元数代表一个旋转,它还使得向量模伸长为原来的\(r\)倍。所以在下面讨论四元数旋转时,均默认为单位四元数。

2、四元数与旋转

在这里都默认原点为不动点。我们需要用单位四元数对三维向量进行旋转,根据对应关系,将三维向量表示为纯虚四元数\((0,\textbf{p})\),注意纯虚四元数和单位四元数不是一个东西。设三维向量对应的四元数为\(p=(0,\textbf{p})\),单位四元数为\(q=(cos\theta,sin\theta\;\textbf{e}_n)\),旋转过程为
\[ p‘=qp=(cos \theta ,sin\theta \;\textbf{e}_n)(0,\textbf{p})=(-sin \theta \;\textbf{e}_n \cdot \textbf{p},cos \theta \;\textbf{p}+sin\theta \; \textbf{e}_n \times p) \]
算到这里,似乎和我们希望得到的结果不同,因为第一项\(-sin \theta \;\textbf{e}_n \cdot \textbf{p} \not = 0\),而我们希望旋转的结果还是在三维子空间中。仅当特殊情况满足\(\textbf{e}_n \cdot p=0\)时,也即旋转轴和旋转向量垂直的情况下,这时候我们得到的旋转结果在三维子空间中,这里先把这个问题放下,后面再讨论。对于单位四元数\(q\)而言,\(q^{-1}=q^{*}\),请看下面两种变换
\[ qp=(cos \theta,sin \theta \; \textbf{e}_n)(0,\textbf{p}) =(-sin \theta \;\textbf{e}_n \cdot \textbf{p},cos \theta \;\textbf{p}+sin\theta \; \textbf{e}_n \times p) \quad \quad\pq^{-1}=(0,\textbf{p})(cos \theta,-sin \theta \; \textbf{e}_n)=(-sin \theta \;\textbf{e}_n \cdot \textbf{p},cos \theta \;\textbf{p}+sin\theta \; \textbf{e}_n \times p) \]
可以看到,上面两个乘法得到的四元数虚部相同,但是得到的都不是纯虚四元数。但是可以知道,左乘一个单位四元数和右乘该单位四元数的逆得到的效果是相同的。考虑
\[ qpq^{-1}=(cos \theta,sin \theta \; \textbf{e}_n)(0,\textbf{p}) (cos \theta , -sin \theta \; \textbf{e}_n)\=(-sin \theta \;\textbf{e}_n \cdot \textbf{p},cos \theta \;\textbf{p}+sin\theta \; \textbf{e}_n \times p) (cos \theta , -sin \theta \; \textbf{e}_n) \=(0,\frac{(1-cos 2\theta)}{2}(\textbf{e}_n\cdot \textbf{p})\cdot\textbf{e}_n+\frac{(1+cos2\theta)}{2}\;\textbf{p}+sin2\theta\;\textbf{e}_n \times \textbf{p}) \]
结果得到了我们所要的虚四元数,但是角度都变为2倍了,这就相当于将原三维向量旋转了\(2\theta\)角度。所以在使用\(qpq^{-1}\)进行旋转时,需要将角度改为\(\theta/2\),复数之所以旋转一次\(\theta\)角度就可以是因为复数旋转本身是一种特殊情况,它的旋转向量与旋转轴垂直(可以假想为\(z\)轴)。

下面来总结下利用四元数进行旋转的步骤。假设需要旋转的三维空间的点为\(\textbf{p}\),写成四元数的形式
\[ p=(0,\textbf{p}) \]
接下来要将该点绕轴\(\textbf{v}\)(单位向量)旋转\(\theta\)度。考虑四元数
\[ q=(cos(\theta/2),sin(\theta/2)\textbf{v}) \quad \quad \q^{-1}=(cos(\theta/2),-sin(\theta/2)\textbf{v}) \\]
利用四元数旋转得到一个纯虚四元数
\[ p‘=qpq^{-1}=(cos^2\frac{\theta}{2}\;\textbf{p}+sin^2\frac{\theta}{2}(\textbf{p}\cdot \textbf{v})\cdot \textbf{v}+sin\theta \;\textbf{v}\times \textbf{p} \]
\(p‘\)即是变换后的点。整个过程可以理解为,先左乘\(q\)\(\theta/2\)角度旋转,再右乘\(q^{-1}\)也作\(\theta/2\)旋转。总的而言,使用四元数进行旋转仅需存储4个浮点数,相比矩阵更加轻量,四元数无论是求逆、串联等操作,相比矩阵更加高效。

参考博客

参考论文

参考PPT

以上是关于四元数与旋转变换的主要内容,如果未能解决你的问题,请参考以下文章

四元数与轴+角度

unity-----------------------四元数与欧拉旋转方法

3D数学基础:四元数与欧拉角之间的转换

四元数(Quaternion)和旋转

Unity四元数和旋转

四元数旋转