四元數與旋轉變換

2022-08-20 08:45:11 字數 3406 閱讀 9097

複數的提出將實數系直接擴大了乙個維度,實數成了複數的乙個特例。令\(\textbf\)為虛數單位,即\(\textbf^2\)=-1;尤拉公式

\[e^=cos\theta + i\; sin \theta

\]把乙個複數\(c=a+bi\)的極座標寫為

\[c=re^

\]其中,\(r=\sqrt,\theta=arctan(b/a)\).

單位複數的乘法可以達到乙個二維旋轉的效果。設\(c\)繞原點旋轉\(\phi\)角度後變為\(c'\),利用複數表示為

\[c'=re^=re^e^

\]於是\(e^\)是複數平面上的乙個旋轉運算元。這為二維平面的旋轉提供來了乙個簡潔的方法。相應的,在三維空間中,我們可以使用四元數來對物件進行旋轉。

四元數可以認為是複數的推廣,2023年哈密頓(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)\quad \quad \quad \quad \quad \quad \\

q = (q_0,q_1,q_2,q_3) \quad \quad \quad \\

\]上面的\(\textbf=(q_1,q_2,q_3)\)是三維空間的向量。下面解釋下幾個與四元數相關的概念

現在我們應該知道,四元數其實是複數擴充的結果,複數的虛部只有乙個,而四元數的虛部有三個,且兩兩相互正交。四元數失去了複數運算交換律的特性參考博士**,保留了複數絕大部份代數特性。為了表示方便,下面將四元數的乘法符號\(\circ\)省寫。

對四元數\(q=q_0+q_1i+q_2j+q_3k\)做以下變形,記\(\textbf=(q_1,q_2,q_3)\),\(\rho = |\textbf|,\textbf=\rho \textbf_n\),其中\(\textbf_n\)是\(\textbf\)的單位方向向量。也即為

\[r=|q|=\sqrt \\

cos \theta = \frac \quad sin \theta = \frac \\

\]於是可得到

\[q=r(cos \theta +\textbf_nsin\theta)=re^_n\theta}

\]\(\textbf_n\)類似於複數中的\(i\),上面表示式表明了四元數的幾何意義,任意乙個四元數代表乙個旋轉,它還使得向量模伸長為原來的\(r\)倍。所以在下面討論四元數旋轉時,均預設為單位四元數。

在這裡都預設原點為不動點。我們需要用單位四元數對三維向量進行旋轉,根據對應關係,將三維向量表示為純虛四元數\((0,\textbf)\),注意純虛四元數和單位四元數不是乙個東西。設三維向量對應的四元數為\(p=(0,\textbf)\),單位四元數為\(q=(cos\theta,sin\theta\;\textbf_n)\),旋轉過程為

\[p'=qp=(cos \theta ,sin\theta \;\textbf_n)(0,\textbf)=(-sin \theta \;\textbf_n \cdot \textbf,cos \theta \;\textbf+sin\theta \; \textbf_n \times p)

\]算到這裡,似乎和我們希望得到的結果不同,因為第一項\(-sin \theta \;\textbf_n \cdot \textbf \not = 0\),而我們希望旋轉的結果還是在三維子空間中。僅當特殊情況滿足\(\textbf_n \cdot p=0\)時,也即旋轉軸和旋轉向量垂直的情況下,這時候我們得到的旋轉結果在三維子空間中,這裡先把這個問題放下,後面再討論。對於單位四元數\(q\)而言,\(q^=q^\),請看下面兩種變換

\[qp=(cos \theta,sin \theta \; \textbf_n)(0,\textbf) =(-sin \theta \;\textbf_n \cdot \textbf,cos \theta \;\textbf+sin\theta \; \textbf_n \times p) \quad \quad\\

pq^=(0,\textbf)(cos \theta,-sin \theta \; \textbf_n)=(-sin \theta \;\textbf_n \cdot \textbf,cos \theta \;\textbf+sin\theta \; \textbf_n \times p)

\]可以看到,上面兩個乘法得到的四元數虛部相同,但是得到的都不是純虛四元數。但是可以知道,左乘乙個單位四元數和右乘該單位四元數的逆得到的效果是相同的。考慮

\[qpq^=(cos \theta,sin \theta \; \textbf_n)(0,\textbf) (cos \theta , -sin \theta \; \textbf_n)\\

=(-sin \theta \;\textbf_n \cdot \textbf,cos \theta \;\textbf+sin\theta \; \textbf_n \times p) (cos \theta , -sin \theta \; \textbf_n) \\

=(0,\frac(\textbf_n\cdot \textbf)\cdot\textbf_n+\frac\;\textbf+sin2\theta\;\textbf_n \times \textbf)

\]結果得到了我們所要的虛四元數,但是角度都變為2倍了,這就相當於將原三維向量旋轉了\(2\theta\)角度。所以在使用\(qpq^\)進行旋轉時,需要將角度改為\(\theta/2\),複數之所以旋轉一次\(\theta\)角度就可以是因為複數旋轉本身是一種特殊情況,它的旋轉向量與旋轉軸垂直(可以假想為\(z\)軸)。

下面來總結下利用四元數進行旋轉的步驟。假設需要旋轉的三維空間的點為\(\textbf\),寫成四元數的形式

\[p=(0,\textbf)

\]接下來要將該點繞軸\(\textbf\)(單位向量)旋轉\(\theta\)度。考慮四元數

\[q=(cos(\theta/2),sin(\theta/2)\textbf) \quad \quad \\

q^=(cos(\theta/2),-sin(\theta/2)\textbf) \\

\]利用四元數旋轉得到乙個純虛四元數

\[p'=qpq^=(cos^2\frac\;\textbf+sin^2\frac(\textbf\cdot \textbf)\cdot \textbf+sin\theta \;\textbf\times \textbf

\]\(p'\)即是變換後的點。整個過程可以理解為,先左乘\(q\)作\(\theta/2\)角度旋轉,再右乘\(q^\)也作\(\theta/2\)旋轉。總的而言,使用四元數進行旋轉僅需儲存4個浮點數,相比矩陣更加輕量,四元數無論是求逆、串聯等操作,相比矩陣更加高效。

參考部落格

參考**

參考ppt

四元數 Quaternions 與旋轉總結

2 四元數的乘法 3 單位四元數 4 共軛四元數 5 四元數的逆 6 四元數與空間旋轉 7 總結 8 旋轉矩陣,尤拉角,四元數比較 9 參考博文 除了特別難理解之外,相比矩陣或尤拉角,四元數在表示旋轉這個事情上,擁有一些明顯的優點。儘管使用四元數有這麼多優點,還是有缺點存在的。不同的方位表示方法適用...

座標系旋轉變換函式

因工作需要,有時要把直角座標系繞原點旋轉。假如旋轉之前座標系某點座標是 x,y 旋轉之後座標是 x1,y1 兩者如何轉換呢?本文介紹乙個函式 vrotationtransform 能夠在兩者間轉換。函式的輸入變數是dx,dy,是旋轉之前的座標 旋轉角度是dangle。旋轉後的座標inewx,inew...

四元數與旋轉關係

1 圍繞乙個軸旋轉的quaternion如何從幾何意義上去思考 圍繞軸旋轉函式 fromangleaxis ngle,rkaxis quaternion identity 預設狀態下的xyz軸資訊 x 紅色,y 綠色,z 藍色 ogre quaternion quat quat.fromanglea...