四元數(Quaternion)相關的介紹材料非常多,這裏針對其中幾個實用問題進行闡述。
四元數初步
相關介紹可參考此文 或此文(英文) 。
相對於複數的二維空間表示,四元數可理解爲一種四維空間表示。四元數是由一個實數和三個元素i , j , k i,j,k i , j , k 組成:q = w + a i + b j + c k q = w + ai + bj + ck q = w + a i + b j + c k 三個元素之間有如下關係: i 2 = j 2 = k 2 = i j k = − 1 i^2 = j^2 = k^2 = ijk = -1 i 2 = j 2 = k 2 = i j k = − 1
四元數還可以定義爲:q = w + u ⃗ q = w + \vec u q = w + u
四元數運算
四元數虛部的乘法不具有交換律,例如: i j = k , j i = − k ; j k = i , k j = − i ; k i = j , i k = − j ij = k, ji = -k;\quad jk = i, kj = -i;\quad ki = j, ik = -j i j = k , j i = − k ; j k = i , k j = − i ; k i = j , i k = − j 四元數的共軛 定義爲: q ∗ = w − a i − b j − c k q^{*}=w-ai-bj-ck q ∗ = w − a i − b j − c k 四元數的模 定義爲: ∣ q ∣ = q ⋅ q ∗ = w 2 + a 2 + b 2 + c 2 |q| = \sqrt{q\cdot q^{*}} = \sqrt{w^2+a^2+b^2+c^2} ∣ q ∣ = q ⋅ q ∗ = w 2 + a 2 + b 2 + c 2 注意 ( q p ) ∗ = p ∗ q ∗ (qp)^{*} = p^{*}q^{*} ( q p ) ∗ = p ∗ q ∗ ,四元數的乘逆爲: q − 1 = q ∗ ∣ q ∣ 2 q^{-1}=\frac{q^{*}}{|q|^{2}} q − 1 = ∣ q ∣ 2 q ∗
與複數一樣,四元數求和 將不同元素加起來即可,滿足交換律和結合律。
令:q = w + u ⃗ , p = t + v ⃗ q = w+\vec u,\quad p = t + \vec v q = w + u , p = t + v 兩個四元數之間的非可交換乘積 通常被稱爲格拉斯曼積 ,其完整形式爲:p q = w t − v ⃗ ⋅ u ⃗ + w v ⃗ + t u ⃗ + v ⃗ × u ⃗ pq = wt-\vec v\cdot\vec u + w\vec v + t\vec u + \vec v \times \vec u p q = w t − v ⋅ u + w v + t u + v × u 或 p q = ( w t − a x − b y − c z ) + ( a t + w x + b z − c y ) i + ( b t + w y + c x − a z ) j + ( c t + z w + a y − x b ) 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} p q = ( w t − a x − b y − c z ) + ( a t + w x + b z − c y ) i + ( b t + w y + c x − a z ) j + ( c t + z w + a y − x b ) k 由於四元數乘法的不可交換性,p q pq p q 並不等於q p qp q p :q p = w t − u ⃗ ⋅ v ⃗ + w v ⃗ + t u ⃗ − v ⃗ × u ⃗ qp = wt-\vec u\cdot \vec v+w\vec v + t\vec u-\vec v\times \vec u q p = w t − u ⋅ v + w v + t u − v × u
四元數點積 :p ⋅ q p\cdot q p ⋅ q
點積也叫歐幾里得內積,四元數點積等同於一個四維向量的點積。點積是可交換積,返回一個標量:p ⋅ q = w t + u ⃗ ⋅ v ⃗ = w t + a x + b y + c z p\cdot q = wt + \vec u \cdot \vec v = wt+ax+by+cz p ⋅ q = w t + u ⋅ v = w t + a x + b y + c z
四元數叉積 :p × q p\times q p × q
四元數叉積和向量叉積等價,返回一個向量:p × q = p q − q p 2 = u ⃗ × v ⃗ = ( b z − c y ) i + ( c x − a z ) j + ( a y − x b ) 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} p × q = 2 p q − q p = u × v = ( b z − c y ) i + ( c x − a z ) j + ( a y − x b ) k 四元數叉積滿足結合律、不滿足交換律。叉積的模等於模的乘積,這樣保證了單位四元數的叉積依然是單位四元數。
四元數逆 :p − 1 p^{-1} p − 1
四元數的轉置通過 p − 1 p = 1 p^{-1}p = 1 p − 1 p = 1 被定義。其構建方式與復倒數相同:p − 1 = p ∗ p ⋅ p p^{-1} = \frac{p^{*}}{p\cdot p} p − 1 = p ⋅ p p ∗ 一個四元數與自身的點積是一個標量。單位四元數的轉置於共軛相同 。
四元數的符號 :s g n ( p ) \mathrm{sgn}(p) s g n ( p )
複數的符號定義爲單位圓上一個方向與原複數相同的複數。四元數的符號產生於單位四元數:s g n ( p ) = p ∣ p ∣ \mathrm{sgn}(p) = \frac{p}{|p|} s g n ( p ) = ∣ p ∣ p
四元數的輻角 :arg ( p ) \arg(p) arg ( p )
輻角函數可找出一個四元數偏離單位標量的角度。此函數輸出一個標量角度:arg ( p ) = arccos ( w ∣ p ∣ ) \arg(p) = \arccos\left( \frac{w}{|p|} \right) arg ( p ) = arccos ( ∣ p ∣ w )
四元數的冪與對數 :
自然冪:exp ( p ) = exp ( w ) ( cos ( ∣ u ⃗ ∣ ) + s g n ( u ⃗ ) sin ( ∣ u ⃗ ∣ ) ) \exp(p) = \exp(w)(\cos(|\vec u|)+\mathrm{sgn}(\vec u)\sin(|\vec u|)) exp ( p ) = exp ( w ) ( cos ( ∣ u ∣ ) + s g n ( u ) sin ( ∣ u ∣ ) )
自然對數:ln ( p ) = ln ( ∣ p ∣ ) + s g n ( u ⃗ ) arg ( p ) \ln(p) = \ln(|p|)+\mathrm{sgn}(\vec u)\arg(p) ln ( p ) = ln ( ∣ p ∣ ) + s g n ( u ) arg ( p )
冪:p q = exp ( q ln p ) p^{q} = \exp(q\ln p) p q = exp ( q ln p )
四元數與剛體旋轉
單位四元數,即絕對值爲1的四元數,若實部爲 cos ( θ ) \cos(\theta) cos ( θ ) ,它的共軛作用是一個角度爲 2 θ 2\theta 2 θ 的轉動,旋轉軸爲虛部的方向。相比於歐拉角,四元數表達式無奇點;相比於SO3矩陣,四元數也更爲簡潔。所有四元數的集合組成一個三維球 S 3 S3 S 3 和在乘法 下的一個羣(李羣)。
四元數與軸角對
繞旋轉軸 n n n 旋轉 θ \theta θ 角(右手法則),表示爲四元數:
q = cos ( θ 2 ) + sin ( θ 2 ) ( n x i + n y j + n z k ) q = \cos\left(\frac{\theta}{2}\right) + \sin\left(\frac{\theta}{2}\right)\left( n_{x}i+n_{y}j+n_{z}k \right) q = cos ( 2 θ ) + sin ( 2 θ ) ( n x i + n y j + n z k )
這個網站可以很直觀的展示四元數軸角對 。注意,q q q 與 − q -q − q 代表的是相同的旋轉(Quaternions have a double cover of the rotation manifold)。
四元數旋轉
擴展一個歐氏空間中的點到四元數空間,只需要將其定義爲 p = ( 0 , x , y , z ) p=(0,x,y,z) p = ( 0 , x , y , z ) 即可。執行下述乘法可以使點 p p p 繞 n n n 旋轉:p ′ = q p q − 1 p' = qpq^{-1} p ′ = q p q − 1 這個運算被稱爲哈密爾頓積 (Hamilton product)。注意這和使用複數進行2D旋轉是不同的。
多次旋轉的情況: p ′ = q 2 ( q 1 p q 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 p' = 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} p ′ = q 2 ( q 1 p q 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)運算非常有用,因爲它可以實現兩個四元數間的平滑插值,避免歐拉角插值的角度限制問題、萬向鎖問題(導致抖動、路徑錯誤,根本問題是插值過程中角速度不恆定)。
理論上,計算四元數插值的步驟如下:
計算兩個四元數的差,利用逆矩陣推導。
計算差的一部分,即四元數求冪。
在起始的值上加上差的一部分,使用四元數乘法來組合角位移。
其主要思想是施密特正交。然而實踐中,有一種更有效的方法。所有單位四元數都存在於一個4D球面上,結果如下:(假設旋轉的角度是ϕ \phi ϕ )
S L E R P ( q 0 , q 1 , t ) = sin ( ( 1 − t ) ϕ 2 ) sin ϕ 2 q 0 + sin ( t ϕ 2 ) sin ϕ 2 q 1 \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} S L E R P ( q 0 , q 1 , t ) = sin 2 ϕ sin ( ( 1 − t ) 2 ϕ ) q 0 + sin 2 ϕ sin ( t 2 ϕ ) q 1
兩個四元數之間的角度通過內積計算:ϕ = 2 arccos ( n 1 ⋅ n 2 ) \phi = 2\arccos(n_{1}\cdot n_{2}) ϕ = 2 arccos ( n 1 ⋅ n 2 )
SLERP的推導過程如下圖所示:
有幾點需要注意:
四元數 q q q 和 − q -q − q 代表的是相同的方向,但是插值時可能導致不同的結果。解決方法是選擇兩個數的符號使得它們內積結果非負。
如果兩個四元數非常接近,那麼正弦值非常小,這時除法計算可能會出現問題,解決方法是當正弦非常小時使用線性插值。
由於四元數旋轉是乘法形式,上述公式亦可寫成:q ( t ) = q 0 ( q 0 − 1 q 1 ) t q(t) = q_{0}(q_{0}^{-1}q_{1})^{t} q ( t ) = q 0 ( q 0 − 1 q 1 ) t
這個表達式可以看作是從起始點逐步”加“與終點的差值的 t t t 倍,0 < t < 1 0<t<1 0 < t < 1 。四元數的差 與矩陣類似,可以理解爲選旋轉A − 1 A^{-1} A − 1 再旋轉B B B 便得到A A A 和B B B 的差值。四元數的差表示爲 q 0 − 1 q 1 q_{0}^{-1}q_{1} q 0 − 1 q 1 。根據上一節的公式:
q 1 = exp ( ln q ) = q q 0 = exp ( 0 ln q ) = exp ( 0 ⋅ n ~ ) = [ 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} q 1 q 0 = exp ( ln q ) = q = exp ( 0 ln q ) = exp ( 0 ⋅ n ~ ) = [ cos ( 0 ) , sin ( 0 ) ⋅ n ^ ] = [ 1 , 0 ] 最後我們令:q 0 = [ 1 , 0 , 0 , 0 ] q_{0} = [1,0,0,0] q 0 = [ 1 , 0 , 0 , 0 ] 以及 q 1 = [ cos θ , sin θ ⋅ n ] q_{1} = [\cos\theta,\sin\theta\cdot n] q 1 = [ cos θ , sin θ ⋅ n ] ,重新代入SLERP插值公式:
可見兩種表現形式可以相互轉化。
四元數與黎曼流形
旋轉距離
通過距離度量:d ( q 1 , q 2 ) = ∣ q 1 − q 2 ∣ d(q_{1},q_{2}) = |q_{1}-q_{2}| d ( q 1 , q 2 ) = ∣ q 1 − q 2 ∣ 四元數可同胚於 R 4 \mathbb{R}^{4} R 4 的度量空間。衡量兩個單位四元數的距離有其它方式,如上一節在探討SLERP時的視角。
此文 中使用內積定義兩個四元數的夾角作爲距離:θ = arccos ( 2 ( q 1 ⋅ q 2 ) 2 − 1 ) d ( q 1 , q 2 ) = 1 − ( q 1 ⋅ q 2 ) 2 = 1 − cos θ 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} θ d ( q 1 , q 2 ) = arccos ( 2 ( q 1 ⋅ q 2 ) 2 − 1 ) = 1 − ( q 1 ⋅ q 2 ) 2 = 2 1 − cos θ 該度量對於相同方向始終輸出 0 0 0 ,對於相差 π \pi π 輸出 1 1 1 。該定義也被稱爲測地線 (geodesic)距離。注意,這個角度 θ \theta θ 衡量的是這兩個四元數 q 1 q_{1} q 1 、q 2 q_{2} q 2 差別有多大,並非這兩個旋轉的角度差。
此文 中也提到一種類似方法:令 r = q 1 − 1 q 2 r=q_{1}^{-1}q_{2} r = q 1 − 1 q 2 ,此時 q 1 q_{1} q 1 與 q 2 q_{2} q 2 的距離等同於 r r r 與 [ 1 , 0 , 0 , 0 ] [1,0,0,0] [ 1 , 0 , 0 , 0 ] 的距離,如果 r r r 實部 r w r_{w} r w 小於零,那麼取 r = − r r=-r r = − r 。那麼對於單位四元數,此時 d ( q 1 , q 2 ) = ϕ = 2 arccos ( r w ) d(q_{1},q_{2})=\phi = 2\arccos(r_{w}) d ( q 1 , q 2 ) = ϕ = 2 arccos ( r w ) 。
李羣與黎曼流形
其它參考
探討四元數變換與距離的相關帖子: