ELBE
電話:021-58780503 微信:18017854633 郵箱:sales_fullyear@126.com 地址:上海市浦東新區城南路168弄3號峰匯商務廣場B座911室本文重點討論萬向節死鎖是什么,為什么會產生,因此,將逐步從旋轉的定義出發。
旋轉的定義在一個給定的三維坐標系中,圍繞一個不動點的旋轉可以定義為任何點在旋轉前后,到不動點的距離都是不變的。公式是:
因為三點可以確定一個平面,所以x, f(x), p(即旋轉前的點、旋轉后的點、不動點)構成一個平面,稱為旋轉平面。根據旋轉定義,我們可以知道,x, f(x)這兩點到不動點的距離是相等的,所以x, f(x)事實上,以不動點為中心的圓上有兩點。如下圖所示,旋轉程度的概念可以用圓中的角度來定義,稱為旋轉角。
從上面可以發現,三維旋轉可以用旋轉平面、不動點、旋轉方向和旋轉角來定義。如果旋轉前的點是原始點,旋轉可以定義為:在旋轉平面上,以不動點為中心,以不動點到原始點的距離為半徑做一個圓,以原始點為起點在圓上畫一個弧。弧的中點為旋轉點。
旋轉代數表示我們已經知道,旋轉可以用旋轉平面、不動點、旋轉方向和旋轉角來定義,但如果計算機想要表示旋轉,它需要更多的代數表示,最好是向量和矩陣的排列。讓我們一個接一個地看看:
旋轉平面只是一個普通的平面,任何平面都可以用平面上的一點和垂直于平面的法向量來定義。我們知道原始點和不動點必須在旋轉平面上,所以用一個向量來表示旋轉平面就足夠了。不動點只是由相應的坐標值組成的向量。旋轉方向,我們可以定義旋轉方向平面的法向量,以滿足右手螺旋法則的方向。右手螺旋法則意味著舉起右手,豎起拇指,讓拇指向法向量方向,最后把剩下的四個手指放進手掌,然后四個手指的方向是旋轉的方向。旋轉角只是一個實數來表示大小。綜上所述,如果一個旋轉需要代數來表示,則需要四件事:一個表示旋轉平面法線方向的向量,一個表示不動點的向量,一個表示旋轉角度的實數。
如果我們規定不動點是原點,并使用右手螺旋法來尋求旋轉方向,并稱旋轉平面法向量為旋轉軸,那么旋轉只有兩件事:旋轉軸、旋轉角-一個向量和一個實數。當我們說旋轉時,我們指的是這樣一個旋轉只由旋轉軸和旋轉角表示。
旋轉的運算上面最后指出,旋轉只能通過旋轉軸和旋轉角來表示,因此它確實很容易被計算機存儲,但我們的最終目標是快速計算旋轉點的坐標。因此,我們不僅需要存儲,還需要一套方便的操作方法。
注:一般來說,旋轉操作有兩種方法,矩陣操作和四元數操作。這里只提到矩陣操作的想法,因為四元數,必須解釋數學,更麻煩,適當使用,四元數不會帶來通用鎖的問題。
通過疊加實現計算機中的計算旋轉。首先,很容易理解,如果你先做一個旋轉,然后做另一個旋轉,那么這兩個旋轉疊加的效果實際上相當于一個等效的旋轉,即兩個旋轉疊加或一個旋轉。這是因為根據旋轉的定義,兩點到不動點的距離不會改變兩次旋轉。具體來說,如果原點是x,第一次旋轉變成了x一、二次旋轉后x2,那么x, x1, x2到不動點的距離是相等的,所以我們可以把x到x整個過程被視為單獨旋轉。
其次,我們應該能夠更容易地接受一個結論:任何旋轉軸的旋轉都可以由三個單獨繞組x,y,z軸的旋轉疊加。也就是說,如果C是任意旋轉,總會有繞x軸的旋轉X,繞y軸旋轉Y,旋轉z軸Z,使得C(p)=Z(Y(X(p)))。這里不展開這個結論。通過應用這個結論,計算機可以用三個旋轉疊加來表示任意旋轉。而繞x, y, z軸旋轉后的點比較容易得到。
以z軸為旋轉角θ例如,如果旋轉前點的坐標是
,旋轉后的坐標是
,則有
,如果以矩陣和向量的形式寫,那就是
。關于x, y軸的旋轉也可以用矩陣操作來表示。
矩陣之間可以通過乘法計算得到一個新的矩陣,所以如果繞組z,y,x軸的旋轉矩陣分別為Z,Y,X,所以它們的乘積ZYX也是旋轉矩陣。
萬向節死鎖從上面可以看出,我們總是可以用三個分別來表示繞組x,y,z軸旋轉矩陣的乘積表示任何旋轉操作。這似乎沒有問題。事實上,在大多數情況下,沒有問題。
這里要稍微偏離一下話題,考慮一下自己的手臂。通過觀察手臂的結構,我們可以發現它大致是肩膀-肩關節-上臂-肘關節-小臂-腕關節-手。也就是說,我們用三個關節連接四個部分,這為我們的手臂提供了靈活性,因為我們的骨頭可以在關節處旋轉。如果沒有關節,手臂會筆直,不能彎曲。讓我們做一個不切實際的假設。假設肩關節只能沿z軸旋轉(上下抬起上臂),肘關節只能繞y軸旋轉(將手臂縮回胸部),腕關節只能繞x軸旋轉(讓拳頭像撥浪鼓一樣旋轉),然后攤開手,考慮手掌和手指的方向。假如我們的關節能360度旋轉,那就和上面提到的三個坐標軸一樣。在轉動肩關節時,顯然我們的手掌也會轉動,改變方向,這表明肘關節的轉動作用于手的轉動。顯然,肘關節和腕關節的旋轉也會影響到手,也就是說,三個關節的旋轉疊加在手上。另一方面,我們的手掌和手指可以朝任何方向,因為上面提到的任何旋轉都可以由三個坐標軸的旋轉疊加而成。好像沒問題。
但此時考慮一種情況,如圖所示(模型使用) ** gic poser web),抬起上臂,把小臂抬到胸前。然后嘗試腕關節和肩關節的旋轉,我們會發現這兩個不同關節的旋轉會使手掌的方向相同——它們都沿著z軸旋轉,即肩關節周圍的軸,而手指的方向是固定的。換句話說,我們應該分別沿著x軸,z軸這兩個方向的旋轉現在變成了同一個方向的旋轉。
為什么會這樣?注意三個關節不是獨立的:肩關節的旋轉會帶動肘關節和腕關節的運動,肘關節的旋轉也會帶動腕關節的運動。就像這三個關節都會在手臂末端工作一樣,上面的關節也會影響下面的關節。同時旋轉肩關節會驅動肘關節和腕關節,因此對肘關節和腕關節旋轉的影響是相同的。但肘關節只能帶動腕關節,不能帶動肩關節。在上述情況下,將手臂抬到胸部的行為會轉動肘關節,從而影響腕關節,但不影響肩關節,導致腕關節旋轉的效果與肩關節旋轉相同。
回到原來的問題,在計算機中使用三個矩陣來表示任意旋轉也會有同樣的問題嗎?之所以會出現上述問題,是因為中間的關節會影響底部的關節,而不會影響頂部的關節??纯淳仃嚤硎镜男D。我們用它ZYX這個矩陣乘積表示任意旋轉,即p'=ZYXp,我們將Z,Y,X,ZYX這四個矩陣都寫出來看看:
若我們取
,則乘積變為
,注意到,無論我們如何修改它,我們都注意到它θ、φ,都不會改變z’的值,z’始終等于-x。也就是說,當我們沿y軸旋轉90時°時,此時X,Z兩個旋轉矩陣都在旋轉z軸。這和以前手臂的情況是一樣的。因為矩陣的相乘作用也是有序的,我們先左乘X,再左乘Y,所以在乘Y的時候,其實已經乘進去了。X。乘Z時,會對X和Y同樣的影響。所以這里的p相當于我們手掌和手指的方向,X相當于腕關節,Y相當于肘關節,Z相當于肩關節。Y會影響X,但不會影響XZ,使X成為與Z同軸旋轉的矩陣。
結語本文介紹了計算機中旋轉的定義和操作方法,然后重點介紹了隨后的萬向節鎖問題。順便說一句,我想提一下萬向節。原萬向節之所以會出現萬向節死鎖問題,也是因為三個環不完全獨立,中間環會驅動最內環,但不會影響最外環。萬向節死鎖問題是一個不可避免的問題,只要使用不相互獨立的三次旋轉來表示任意旋轉,就會帶來這個問題。然而,萬向節鎖并不可怕。它只會出現在極端值的中間旋轉中。如果我們只是想表示旋轉,萬向節鎖不會帶來任何問題。畢竟,我們總能找到三個沿坐標軸旋轉的旋轉來表示任意旋轉。萬向節死鎖只會導致飛機控制、旋轉插值等問題,需要連續旋轉疊加。因此,本文未提及的四元數在這方面的應用中被廣泛引用。
什么是萬向節死鎖,為什么會出現這個問題,真的困擾了我很久。僅此而已 ** 如有不正之處,請指出記錄。