實用四元數

四元數(Quaternion)相關的介紹材料非常多,這裏針對其中幾個實用問題進行闡述。

四元數初步

相關介紹可參考此文此文(英文)

相對於複數的二維空間表示,四元數可理解爲一種四維空間表示。四元數是由一個實數和三個元素i,j,ki,j,k組成:q=w+ai+bj+ckq = w + ai + bj + ck 三個元素之間有如下關係: i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1

四元數還可以定義爲:q=w+uq = w + \vec u

四元數運算

四元數虛部的乘法不具有交換律,例如: ij=k,ji=k;jk=i,kj=i;ki=j,ik=jij = k, ji = -k;\quad jk = i, kj = -i;\quad ki = j, ik = -j 四元數的共軛定義爲: q=waibjckq^{*}=w-ai-bj-ck 四元數的定義爲: q=qq=w2+a2+b2+c2|q| = \sqrt{q\cdot q^{*}} = \sqrt{w^2+a^2+b^2+c^2} 注意 (qp)=pq(qp)^{*} = p^{*}q^{*},四元數的乘逆爲: q1=qq2q^{-1}=\frac{q^{*}}{|q|^{2}}

與複數一樣,四元數求和將不同元素加起來即可,滿足交換律和結合律。

令:q=w+u,p=t+vq = w+\vec u,\quad p = t + \vec v兩個四元數之間的非可交換乘積通常被稱爲格拉斯曼積,其完整形式爲:pq=wtvu+wv+tu+v×upq = wt-\vec v\cdot\vec u + w\vec v + t\vec u + \vec v \times \vec u pq=(wtaxbycz)+(at+wx+bzcy)i+(bt+wy+cxaz)j+(ct+zw+ayxb)k\begin{aligned}pq = (wt-ax-by-cz) \\ +(at+wx+bz-cy)i \\ +(bt+wy+cx-az)j \\ +(ct+zw+ay-xb)k\end{aligned} 由於四元數乘法的不可交換性,pqpq並不等於qpqpqp=wtuv+wv+tuv×uqp = wt-\vec u\cdot \vec v+w\vec v + t\vec u-\vec v\times \vec u

四元數點積pqp\cdot q
點積也叫歐幾里得內積,四元數點積等同於一個四維向量的點積。點積是可交換積,返回一個標量:pq=wt+uv=wt+ax+by+czp\cdot q = wt + \vec u \cdot \vec v = wt+ax+by+cz

四元數叉積p×qp\times q
四元數叉積和向量叉積等價,返回一個向量:p×q=pqqp2=u×v=(bzcy)i+(cxaz)j+(ayxb)k\begin{aligned}p\times q &= \frac{pq-qp}{2} \\ &= \vec u \times \vec v \\ &= (bz-cy)i+(cx-az)j+(ay-xb)k \end{aligned} 四元數叉積滿足結合律、不滿足交換律。叉積的模等於模的乘積,這樣保證了單位四元數的叉積依然是單位四元數。

四元數p1p^{-1}
四元數的轉置通過 p1p=1p^{-1}p = 1 被定義。其構建方式與復倒數相同:p1=pppp^{-1} = \frac{p^{*}}{p\cdot p} 一個四元數與自身的點積是一個標量。單位四元數的轉置於共軛相同

四元數的符號sgn(p)\mathrm{sgn}(p)
複數的符號定義爲單位圓上一個方向與原複數相同的複數。四元數的符號產生於單位四元數:sgn(p)=pp\mathrm{sgn}(p) = \frac{p}{|p|}

四元數的輻角arg(p)\arg(p)
輻角函數可找出一個四元數偏離單位標量的角度。此函數輸出一個標量角度:arg(p)=arccos(wp)\arg(p) = \arccos\left( \frac{w}{|p|} \right)

四元數的冪與對數
自然冪:exp(p)=exp(w)(cos(u)+sgn(u)sin(u))\exp(p) = \exp(w)(\cos(|\vec u|)+\mathrm{sgn}(\vec u)\sin(|\vec u|))
自然對數:ln(p)=ln(p)+sgn(u)arg(p)\ln(p) = \ln(|p|)+\mathrm{sgn}(\vec u)\arg(p)
冪:pq=exp(qlnp)p^{q} = \exp(q\ln p)

四元數與剛體旋轉

單位四元數,即絕對值爲1的四元數,若實部爲 cos(θ)\cos(\theta),它的共軛作用是一個角度爲 2θ2\theta 的轉動,旋轉軸爲虛部的方向。相比於歐拉角,四元數表達式無奇點;相比於SO3矩陣,四元數也更爲簡潔。所有四元數的集合組成一個三維球 S3S3 和在乘法下的一個羣(李羣)。

四元數與軸角對

繞旋轉軸 nn 旋轉 θ\theta 角(右手法則),表示爲四元數:
q=cos(θ2)+sin(θ2)(nxi+nyj+nzk)q = \cos\left(\frac{\theta}{2}\right) + \sin\left(\frac{\theta}{2}\right)\left( n_{x}i+n_{y}j+n_{z}k \right)
這個網站可以很直觀的展示四元數軸角對。注意,qqq-q 代表的是相同的旋轉(Quaternions have a double cover of the rotation manifold)。

四元數旋轉

擴展一個歐氏空間中的點到四元數空間,只需要將其定義爲 p=(0,x,y,z)p=(0,x,y,z) 即可。執行下述乘法可以使點 ppnn 旋轉:p=qpq1p' = qpq^{-1} 這個運算被稱爲哈密爾頓積(Hamilton product)。注意這和使用複數進行2D旋轉是不同的。
多次旋轉的情況: p=q2(q1pq11)q21=(q2q1)p(q11q21)=(q2q1)p(q2q1)1p' = q_{2}(q_{1}pq_{1}^{-1})q_{2}^{-1} = (q_{2}q_{1})p(q_{1}^{-1}q_{2}^{-1}) = (q_{2}q_{1})p(q_{2}q_{1})^{-1} 注意旋轉是從右向左發生的。

四元數插值

SLERP

球面線性插值(Spherical Linear Interpolation)運算非常有用,因爲它可以實現兩個四元數間的平滑插值,避免歐拉角插值的角度限制問題、萬向鎖問題(導致抖動、路徑錯誤,根本問題是插值過程中角速度不恆定)。

理論上,計算四元數插值的步驟如下:

  1. 計算兩個四元數的差,利用逆矩陣推導。
  2. 計算差的一部分,即四元數求冪。
  3. 在起始的值上加上差的一部分,使用四元數乘法來組合角位移。

其主要思想是施密特正交。然而實踐中,有一種更有效的方法。所有單位四元數都存在於一個4D球面上,結果如下:(假設旋轉的角度是ϕ\phi)
SLERP(q0,q1,t)=sin((1t)ϕ2)sinϕ2q0+sin(tϕ2)sinϕ2q1\mathrm{SLERP}(q_{0},q_{1},t) = \frac{\sin( (1-t)\frac{\phi}{2})}{\sin \frac{\phi}{2}}q_{0} + \frac{\sin( t\frac{\phi}{2})}{\sin \frac{\phi}{2}}q_{1}
兩個四元數之間的角度通過內積計算:ϕ=2arccos(n1n2)\phi = 2\arccos(n_{1}\cdot n_{2})
SLERP的推導過程如下圖所示:
slerp
有幾點需要注意:

  • 四元數 qqq-q 代表的是相同的方向,但是插值時可能導致不同的結果。解決方法是選擇兩個數的符號使得它們內積結果非負。
  • 如果兩個四元數非常接近,那麼正弦值非常小,這時除法計算可能會出現問題,解決方法是當正弦非常小時使用線性插值。

由於四元數旋轉是乘法形式,上述公式亦可寫成:q(t)=q0(q01q1)tq(t) = q_{0}(q_{0}^{-1}q_{1})^{t}
這個表達式可以看作是從起始點逐步”加“與終點的差值的 tt 倍,0<t<10<t<1四元數的差與矩陣類似,可以理解爲選旋轉A1A^{-1}再旋轉BB便得到AABB的差值。四元數的差表示爲 q01q1q_{0}^{-1}q_{1}。根據上一節的公式:
q1=exp(lnq)=qq0=exp(0lnq)=exp(0n~)=[cos(0),sin(0)n^]=[1,0]\begin{aligned} q^{1} &= \exp(\ln q) = q \\ q^{0} &= \exp(0\ln q) = \exp(0\cdot \tilde{n}) = [\cos(0),\sin(0)\cdot\hat{n}] = [1,0] \end{aligned} 最後我們令:q0=[1,0,0,0]q_{0} = [1,0,0,0] 以及 q1=[cosθ,sinθn]q_{1} = [\cos\theta,\sin\theta\cdot n],重新代入SLERP插值公式:
qt
可見兩種表現形式可以相互轉化。

四元數與黎曼流形

旋轉距離

通過距離度量:d(q1,q2)=q1q2d(q_{1},q_{2}) = |q_{1}-q_{2}| 四元數可同胚於 R4\mathbb{R}^{4}的度量空間。衡量兩個單位四元數的距離有其它方式,如上一節在探討SLERP時的視角。

此文中使用內積定義兩個四元數的夾角作爲距離:θ=arccos(2(q1q2)21)d(q1,q2)=1(q1q2)2=1cosθ2\begin{aligned} \theta &= \arccos\left( 2(q_{1}\cdot q_{2})^{2}-1 \right) \\ d(q_{1},q_{2}) &= 1-(q_{1}\cdot q_{2})^{2} = \frac{1-\cos\theta}{2} \end{aligned} 該度量對於相同方向始終輸出 00 ,對於相差 π\pi 輸出 11。該定義也被稱爲測地線(geodesic)距離。注意,這個角度 θ\theta 衡量的是這兩個四元數 q1q_{1}q2q_{2} 差別有多大,並非這兩個旋轉的角度差。

此文中也提到一種類似方法:令 r=q11q2r=q_{1}^{-1}q_{2} ,此時 q1q_{1}q2q_{2} 的距離等同於 rr[1,0,0,0][1,0,0,0] 的距離,如果 rr 實部 rwr_{w} 小於零,那麼取 r=rr=-r。那麼對於單位四元數,此時 d(q1,q2)=ϕ=2arccos(rw)d(q_{1},q_{2})=\phi = 2\arccos(r_{w})

李羣與黎曼流形

其它參考

探討四元數變換與距離的相關帖子:

發佈了64 篇原創文章 · 獲贊 83 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章