歡迎光臨ELBE網(wǎng)站!
您的位置: ELBE > 行業(yè)資訊 > 三維旋轉(zhuǎn)與萬(wàn)向節(jié)死鎖
網(wǎng)站頭像

文章分類

Article classification
聯(lián)系我們

ELBE

電話:021-58780503 微信:18017854633 郵箱:sales_fullyear@126.com 地址:上海市浦東新區(qū)城南路168弄3號(hào)峰匯商務(wù)廣場(chǎng)B座911室
三維旋轉(zhuǎn)與萬(wàn)向節(jié)死鎖
時(shí)間:2022-12-15 查看:22 作者:小葉

本文重點(diǎn)討論萬(wàn)向節(jié)死鎖是什么,為什么會(huì)產(chǎn)生,因此,將逐步從旋轉(zhuǎn)的定義出發(fā)。

旋轉(zhuǎn)的定義

在一個(gè)給定的三維坐標(biāo)系中,圍繞一個(gè)不動(dòng)點(diǎn)的旋轉(zhuǎn)可以定義為任何點(diǎn)在旋轉(zhuǎn)前后,到不動(dòng)點(diǎn)的距離都是不變的。公式是:

因?yàn)槿c(diǎn)可以確定一個(gè)平面,所以x, f(x), p(即旋轉(zhuǎn)前的點(diǎn)、旋轉(zhuǎn)后的點(diǎn)、不動(dòng)點(diǎn))構(gòu)成一個(gè)平面,稱為旋轉(zhuǎn)平面。根據(jù)旋轉(zhuǎn)定義,我們可以知道,x, f(x)這兩點(diǎn)到不動(dòng)點(diǎn)的距離是相等的,所以x, f(x)事實(shí)上,以不動(dòng)點(diǎn)為中心的圓上有兩點(diǎn)。如下圖所示,旋轉(zhuǎn)程度的概念可以用圓中的角度來(lái)定義,稱為旋轉(zhuǎn)角。

從上面可以發(fā)現(xiàn),三維旋轉(zhuǎn)可以用旋轉(zhuǎn)平面、不動(dòng)點(diǎn)、旋轉(zhuǎn)方向和旋轉(zhuǎn)角來(lái)定義。如果旋轉(zhuǎn)前的點(diǎn)是原始點(diǎn),旋轉(zhuǎn)可以定義為:在旋轉(zhuǎn)平面上,以不動(dòng)點(diǎn)為中心,以不動(dòng)點(diǎn)到原始點(diǎn)的距離為半徑做一個(gè)圓,以原始點(diǎn)為起點(diǎn)在圓上畫一個(gè)弧?;〉闹悬c(diǎn)為旋轉(zhuǎn)點(diǎn)。

旋轉(zhuǎn)代數(shù)表示

我們已經(jīng)知道,旋轉(zhuǎn)可以用旋轉(zhuǎn)平面、不動(dòng)點(diǎn)、旋轉(zhuǎn)方向和旋轉(zhuǎn)角來(lái)定義,但如果計(jì)算機(jī)想要表示旋轉(zhuǎn),它需要更多的代數(shù)表示,最好是向量和矩陣的排列。讓我們一個(gè)接一個(gè)地看看:

旋轉(zhuǎn)平面只是一個(gè)普通的平面,任何平面都可以用平面上的一點(diǎn)和垂直于平面的法向量來(lái)定義。我們知道原始點(diǎn)和不動(dòng)點(diǎn)必須在旋轉(zhuǎn)平面上,所以用一個(gè)向量來(lái)表示旋轉(zhuǎn)平面就足夠了。不動(dòng)點(diǎn)只是由相應(yīng)的坐標(biāo)值組成的向量。旋轉(zhuǎn)方向,我們可以定義旋轉(zhuǎn)方向平面的法向量,以滿足右手螺旋法則的方向。右手螺旋法則意味著舉起右手,豎起拇指,讓拇指向法向量方向,最后把剩下的四個(gè)手指放進(jìn)手掌,然后四個(gè)手指的方向是旋轉(zhuǎn)的方向。旋轉(zhuǎn)角只是一個(gè)實(shí)數(shù)來(lái)表示大小。

綜上所述,如果一個(gè)旋轉(zhuǎn)需要代數(shù)來(lái)表示,則需要四件事:一個(gè)表示旋轉(zhuǎn)平面法線方向的向量,一個(gè)表示不動(dòng)點(diǎn)的向量,一個(gè)表示旋轉(zhuǎn)角度的實(shí)數(shù)。

如果我們規(guī)定不動(dòng)點(diǎn)是原點(diǎn),并使用右手螺旋法來(lái)尋求旋轉(zhuǎn)方向,并稱旋轉(zhuǎn)平面法向量為旋轉(zhuǎn)軸,那么旋轉(zhuǎn)只有兩件事:旋轉(zhuǎn)軸、旋轉(zhuǎn)角-一個(gè)向量和一個(gè)實(shí)數(shù)。當(dāng)我們說(shuō)旋轉(zhuǎn)時(shí),我們指的是這樣一個(gè)旋轉(zhuǎn)只由旋轉(zhuǎn)軸和旋轉(zhuǎn)角表示。

旋轉(zhuǎn)的運(yùn)算

上面最后指出,旋轉(zhuǎn)只能通過(guò)旋轉(zhuǎn)軸和旋轉(zhuǎn)角來(lái)表示,因此它確實(shí)很容易被計(jì)算機(jī)存儲(chǔ),但我們的最終目標(biāo)是快速計(jì)算旋轉(zhuǎn)點(diǎn)的坐標(biāo)。因此,我們不僅需要存儲(chǔ),還需要一套方便的操作方法。

注:一般來(lái)說(shuō),旋轉(zhuǎn)操作有兩種方法,矩陣操作和四元數(shù)操作。這里只提到矩陣操作的想法,因?yàn)樗脑獢?shù),必須解釋數(shù)學(xué),更麻煩,適當(dāng)使用,四元數(shù)不會(huì)帶來(lái)通用鎖的問題。

通過(guò)疊加實(shí)現(xiàn)計(jì)算機(jī)中的計(jì)算旋轉(zhuǎn)。首先,很容易理解,如果你先做一個(gè)旋轉(zhuǎn),然后做另一個(gè)旋轉(zhuǎn),那么這兩個(gè)旋轉(zhuǎn)疊加的效果實(shí)際上相當(dāng)于一個(gè)等效的旋轉(zhuǎn),即兩個(gè)旋轉(zhuǎn)疊加或一個(gè)旋轉(zhuǎn)。這是因?yàn)楦鶕?jù)旋轉(zhuǎn)的定義,兩點(diǎn)到不動(dòng)點(diǎn)的距離不會(huì)改變兩次旋轉(zhuǎn)。具體來(lái)說(shuō),如果原點(diǎn)是x,第一次旋轉(zhuǎn)變成了x一、二次旋轉(zhuǎn)后x2,那么x, x1, x2到不動(dòng)點(diǎn)的距離是相等的,所以我們可以把x到x整個(gè)過(guò)程被視為單獨(dú)旋轉(zhuǎn)。

其次,我們應(yīng)該能夠更容易地接受一個(gè)結(jié)論:任何旋轉(zhuǎn)軸的旋轉(zhuǎn)都可以由三個(gè)單獨(dú)繞組x,y,z軸的旋轉(zhuǎn)疊加。也就是說(shuō),如果C是任意旋轉(zhuǎn),總會(huì)有繞x軸的旋轉(zhuǎn)X,繞y軸旋轉(zhuǎn)Y,旋轉(zhuǎn)z軸Z,使得C(p)=Z(Y(X(p)))。這里不展開這個(gè)結(jié)論。通過(guò)應(yīng)用這個(gè)結(jié)論,計(jì)算機(jī)可以用三個(gè)旋轉(zhuǎn)疊加來(lái)表示任意旋轉(zhuǎn)。而繞x, y, z軸旋轉(zhuǎn)后的點(diǎn)比較容易得到。

以z軸為旋轉(zhuǎn)角θ例如,如果旋轉(zhuǎn)前點(diǎn)的坐標(biāo)是

,旋轉(zhuǎn)后的坐標(biāo)是

,則有

,如果以矩陣和向量的形式寫,那就是

。關(guān)于x, y軸的旋轉(zhuǎn)也可以用矩陣操作來(lái)表示。

矩陣之間可以通過(guò)乘法計(jì)算得到一個(gè)新的矩陣,所以如果繞組z,y,x軸的旋轉(zhuǎn)矩陣分別為Z,Y,X,所以它們的乘積ZYX也是旋轉(zhuǎn)矩陣。

萬(wàn)向節(jié)死鎖

從上面可以看出,我們總是可以用三個(gè)分別來(lái)表示繞組x,y,z軸旋轉(zhuǎn)矩陣的乘積表示任何旋轉(zhuǎn)操作。這似乎沒有問題。事實(shí)上,在大多數(shù)情況下,沒有問題。

這里要稍微偏離一下話題,考慮一下自己的手臂。通過(guò)觀察手臂的結(jié)構(gòu),我們可以發(fā)現(xiàn)它大致是肩膀-肩關(guān)節(jié)-上臂-肘關(guān)節(jié)-小臂-腕關(guān)節(jié)-手。也就是說(shuō),我們用三個(gè)關(guān)節(jié)連接四個(gè)部分,這為我們的手臂提供了靈活性,因?yàn)槲覀兊墓穷^可以在關(guān)節(jié)處旋轉(zhuǎn)。如果沒有關(guān)節(jié),手臂會(huì)筆直,不能彎曲。讓我們做一個(gè)不切實(shí)際的假設(shè)。假設(shè)肩關(guān)節(jié)只能沿z軸旋轉(zhuǎn)(上下抬起上臂),肘關(guān)節(jié)只能繞y軸旋轉(zhuǎn)(將手臂縮回胸部),腕關(guān)節(jié)只能繞x軸旋轉(zhuǎn)(讓拳頭像撥浪鼓一樣旋轉(zhuǎn)),然后攤開手,考慮手掌和手指的方向。假如我們的關(guān)節(jié)能360度旋轉(zhuǎn),那就和上面提到的三個(gè)坐標(biāo)軸一樣。在轉(zhuǎn)動(dòng)肩關(guān)節(jié)時(shí),顯然我們的手掌也會(huì)轉(zhuǎn)動(dòng),改變方向,這表明肘關(guān)節(jié)的轉(zhuǎn)動(dòng)作用于手的轉(zhuǎn)動(dòng)。顯然,肘關(guān)節(jié)和腕關(guān)節(jié)的旋轉(zhuǎn)也會(huì)影響到手,也就是說(shuō),三個(gè)關(guān)節(jié)的旋轉(zhuǎn)疊加在手上。另一方面,我們的手掌和手指可以朝任何方向,因?yàn)樯厦嫣岬降娜魏涡D(zhuǎn)都可以由三個(gè)坐標(biāo)軸的旋轉(zhuǎn)疊加而成。好像沒問題。

但此時(shí)考慮一種情況,如圖所示(模型使用) ** gic poser web),抬起上臂,把小臂抬到胸前。然后嘗試腕關(guān)節(jié)和肩關(guān)節(jié)的旋轉(zhuǎn),我們會(huì)發(fā)現(xiàn)這兩個(gè)不同關(guān)節(jié)的旋轉(zhuǎn)會(huì)使手掌的方向相同——它們都沿著z軸旋轉(zhuǎn),即肩關(guān)節(jié)周圍的軸,而手指的方向是固定的。換句話說(shuō),我們應(yīng)該分別沿著x軸,z軸這兩個(gè)方向的旋轉(zhuǎn)現(xiàn)在變成了同一個(gè)方向的旋轉(zhuǎn)。

為什么會(huì)這樣?注意三個(gè)關(guān)節(jié)不是獨(dú)立的:肩關(guān)節(jié)的旋轉(zhuǎn)會(huì)帶動(dòng)肘關(guān)節(jié)和腕關(guān)節(jié)的運(yùn)動(dòng),肘關(guān)節(jié)的旋轉(zhuǎn)也會(huì)帶動(dòng)腕關(guān)節(jié)的運(yùn)動(dòng)。就像這三個(gè)關(guān)節(jié)都會(huì)在手臂末端工作一樣,上面的關(guān)節(jié)也會(huì)影響下面的關(guān)節(jié)。同時(shí)旋轉(zhuǎn)肩關(guān)節(jié)會(huì)驅(qū)動(dòng)肘關(guān)節(jié)和腕關(guān)節(jié),因此對(duì)肘關(guān)節(jié)和腕關(guān)節(jié)旋轉(zhuǎn)的影響是相同的。但肘關(guān)節(jié)只能帶動(dòng)腕關(guān)節(jié),不能帶動(dòng)肩關(guān)節(jié)。在上述情況下,將手臂抬到胸部的行為會(huì)轉(zhuǎn)動(dòng)肘關(guān)節(jié),從而影響腕關(guān)節(jié),但不影響肩關(guān)節(jié),導(dǎo)致腕關(guān)節(jié)旋轉(zhuǎn)的效果與肩關(guān)節(jié)旋轉(zhuǎn)相同。

回到原來(lái)的問題,在計(jì)算機(jī)中使用三個(gè)矩陣來(lái)表示任意旋轉(zhuǎn)也會(huì)有同樣的問題嗎?之所以會(huì)出現(xiàn)上述問題,是因?yàn)橹虚g的關(guān)節(jié)會(huì)影響底部的關(guān)節(jié),而不會(huì)影響頂部的關(guān)節(jié)??纯淳仃嚤硎镜男D(zhuǎn)。我們用它ZYX這個(gè)矩陣乘積表示任意旋轉(zhuǎn),即p'=ZYXp,我們將Z,Y,X,ZYX這四個(gè)矩陣都寫出來(lái)看看:

若我們?nèi)?/p>

,則乘積變?yōu)?/p>

,注意到,無(wú)論我們?nèi)绾涡薷乃覀兌甲⒁獾剿?、φ,都不?huì)改變z’的值,z’始終等于-x。也就是說(shuō),當(dāng)我們沿y軸旋轉(zhuǎn)90時(shí)°時(shí),此時(shí)X,Z兩個(gè)旋轉(zhuǎn)矩陣都在旋轉(zhuǎn)z軸。這和以前手臂的情況是一樣的。因?yàn)榫仃嚨南喑俗饔靡彩怯行虻?,我們先左乘X,再左乘Y,所以在乘Y的時(shí)候,其實(shí)已經(jīng)乘進(jìn)去了。X。乘Z時(shí),會(huì)對(duì)X和Y同樣的影響。所以這里的p相當(dāng)于我們手掌和手指的方向,X相當(dāng)于腕關(guān)節(jié),Y相當(dāng)于肘關(guān)節(jié),Z相當(dāng)于肩關(guān)節(jié)。Y會(huì)影響X,但不會(huì)影響XZ,使X成為與Z同軸旋轉(zhuǎn)的矩陣。

結(jié)語(yǔ)

本文介紹了計(jì)算機(jī)中旋轉(zhuǎn)的定義和操作方法,然后重點(diǎn)介紹了隨后的萬(wàn)向節(jié)鎖問題。順便說(shuō)一句,我想提一下萬(wàn)向節(jié)。原萬(wàn)向節(jié)之所以會(huì)出現(xiàn)萬(wàn)向節(jié)死鎖問題,也是因?yàn)槿齻€(gè)環(huán)不完全獨(dú)立,中間環(huán)會(huì)驅(qū)動(dòng)最內(nèi)環(huán),但不會(huì)影響最外環(huán)。萬(wàn)向節(jié)死鎖問題是一個(gè)不可避免的問題,只要使用不相互獨(dú)立的三次旋轉(zhuǎn)來(lái)表示任意旋轉(zhuǎn),就會(huì)帶來(lái)這個(gè)問題。然而,萬(wàn)向節(jié)鎖并不可怕。它只會(huì)出現(xiàn)在極端值的中間旋轉(zhuǎn)中。如果我們只是想表示旋轉(zhuǎn),萬(wàn)向節(jié)鎖不會(huì)帶來(lái)任何問題。畢竟,我們總能找到三個(gè)沿坐標(biāo)軸旋轉(zhuǎn)的旋轉(zhuǎn)來(lái)表示任意旋轉(zhuǎn)。萬(wàn)向節(jié)死鎖只會(huì)導(dǎo)致飛機(jī)控制、旋轉(zhuǎn)插值等問題,需要連續(xù)旋轉(zhuǎn)疊加。因此,本文未提及的四元數(shù)在這方面的應(yīng)用中被廣泛引用。

什么是萬(wàn)向節(jié)死鎖,為什么會(huì)出現(xiàn)這個(gè)問題,真的困擾了我很久。僅此而已 ** 如有不正之處,請(qǐng)指出記錄。

繼續(xù)閱讀與本文標(biāo)簽相同的文章
cache
Processed in 0.008966 Second.