2017-08-28 613 views
1

我使用兩個相同類型的IMU(BHI160,即方向相對於北方,與北方對齊,IMU的本地y軸指向北方)對象,讓我們說鋼筆,增加的困難,如果我把兩個物體平行放置,兩個IMU的z軸指向上,但是一個IMU相對於另一個繞z軸旋轉180°。對齊IMU方向,然後獲得相對旋轉

現在,如果我在這裏正確地理解數學,我從IMU接收的四元數據是相對於北方方向的半角度旋轉,從而使q * north_dir * q_inv = IMU_y_axis(與north_dirIMU_y_axis是全球空間三維向量,或爲了這個計算而使用純四元數)。

由於IMU的旋轉,我會假設當兩個筆指向相同的方向時,我應該能夠計算第二筆的方向爲q_2 = q_rot_z * q_1,其中q_rot_z等於圍繞z軸旋轉90°,軸 - 遵循這樣的直覺:如果我將兩個筆指向北方,我將通過計算q_rot_z * north_dir * q_rot_z_inv

來獲得筆2的y軸的全局方向(即筆1的y軸圍繞z軸旋轉180°)

因此,如果我想知道筆尖的相對旋轉(例如,我需要從第一筆筆尖移動到第二筆筆尖的旋轉),那麼我需要計算q_r = q_2 * q_rot_z_inv * q_1_inv以便通過計算從提示1到提示?或者,圍繞z軸的「事先」旋轉在這種情況下無關緊要,我只需要像往常一樣計算q_r = q_2 * q_1_inv

編輯: 這基本上是this question的擴展,但我想知道,如果同樣的答案也適用於我的情況還是已知相對IMU旋轉會在我的情況需要被包括在內

回答

2

讓我們一步一步來完成。您有一個全球座標系G,它與北方向對齊。它如何對齊或者它是否對齊,並不重要。

然後,我們必須使用IMU及其各自的座標系I1I2。座標系是從全局系統到本地系統的旋轉。在下面,我們將使用該符號R[G->I1]。這代表從GI1的輪換。如果用此旋轉方式轉換G中的任何矢量,則將在座標系G中表示的I1中獲得相同的矢量。讓我們用變換TT ° v來表示載體v的轉換。下圖說明了這一點:

Transform

在該圖中,我已經添加了一個翻譯到變換(其四元數當然可以不表示)。這只是爲了使這一點更清楚。所以,我們有一個矢量v。相同的矢量可以位於座標系統GI中。並且轉換的矢量R[G->I] ° v表示在G的座標系中的Iv。請確保這實際上是您從IMU獲得的輪換。你也可能得到逆變換(這將是系統變換視圖,而我們使用模型變換視圖)。在下面的推導中這個變化很小。因此,我會堅持這第一個假設。如果您需要反轉,請相應地調整公式。

正如你已經知道,操作R ° v可通過轉動v成純四元數,計算R * v * conjugate(R),並再次把它變成一個載體來完成(或者在整個過程中純四元數工作)。

現在筆開始發揮作用。筆具有內在的座標系,您可以任意定義。從您的描述中,似乎您想要定義它,使筆的局部y軸指向尖端。所以,我們有一個額外的座標系每個筆與旋轉R[I1->P1]R[I2->P2]。我們可以連接的旋轉,以找到全局方位(*是四元數乘法):

R[G->P1] = R[G->I1] * R[I1->P1] 
R[G->P2] = R[G->I2] * R[I2->P2] 

在您定義筆的局部座標系的方式,我們知道R[I1->P1]是單位(局部座標系對齊與IMU)並且R[I2->P2]圍繞z軸旋轉180°。所以,這簡化爲:

R[G->P1] = R[G->I1] 
R[G->P2] = R[G->I2] * RotateZ(180°) 

注意的是,Z-旋轉的IMU的局部座標系中進行(這是在右側乘)。我不知道你爲什麼認爲它應該是90°。這實際上是180°的旋轉。

如果您想查找提示之間的相對旋轉,首先需要定義旋轉應在哪個座標系中表示。假設我們想要在P1的座標系中表示旋轉。然後,你要查找的是旋轉R[P1->P2],這樣

R[G->P1] * R[P1->P2] = R[G->P2] 

如果插在上面的定義這解決了對

R[P1->P2] = conjugate(R[G->P1]) * R[G->P2] 

,你會得到:

R[P1->P2] = conjugate(R[G->I1]) * R[G->I2] * RotateZ(180°) 

就是這樣。

這很可能是你想要的東西略有不同。這就是爲什麼我詳細解釋它,所以你將能夠相應地修改計算。

+0

哇,這是一個精心設計的答案 - 非常感謝!關於我對90°/ 180°旋轉的困惑:根據我的理解,如果您想使用四元數將矢量v圍繞特定軸旋轉180°,則需要使用90°作爲角度構建四元數,因爲'q * v * inv(q)'基本上將該角度應用兩次(導致180°旋轉)。我從來沒有真正清楚過的是爲什麼這是與直接四元數乘法不一致,因爲我認爲在技術上產品'q1 * q_rot'會隱式地再次用於旋轉,例如, y軸。 – Sty

+0

描述角度「a」的旋轉的四元數的確在其中包含了術語「cos(a/2)」和「sin(a/2)」。儘管如此,它仍然是「a」的旋轉(只是編碼方式不同)。這種編碼也是'°'運算符兩次使用四元數的原因之一。最後,(單位)四元數描述了圍繞某個軸的某個角度的旋轉。在內部,它的編碼方式不同。但是,除非你想與簡單的圖書館不支持的四元數有關的數學計算,否則這應該不重要。 –

+0

啊,我的困惑主要在於術語?也就是說,通過'RotateZ(180°)',你可以指定一個四元數,你可以通過指定一個角度和一個軸來獲得,在這個例子中是180°和z軸,但是在內部會導致一個四元數的計算在不同部件中90°角度的「cos」和「sin」 - 是否正確? – Sty