2013-04-13 16 views
1

下面的圖像示出了兩個座標系統A和B,位於所述全局幀G: coordinate systems configuration旋轉在本地幀,表示爲四元數

我需要找到四元數,其旋轉A到B,但在表達第一部分很容易,B.conjugate()*A(從A的旋轉中減去B的旋轉),這給出圍繞(-1,0,0)的π/ 2旋轉。這顯然是正確的,因爲圍繞全局-x軸旋轉A 90°給出B

現在我需要在A中表示結果;期望的結果是π/ 2大約在(這就是全局的-x在A中),但是我不能僅僅通過旋轉組合來到那裏。

我可以將四元數轉換爲角度軸表示(π/ 2在(-1,0,0)左右),將軸旋轉爲A*(-1,0,0)=(0,0,-1),並將其轉換回四元數,但我希望儘可能避免該轉換。

如何僅使用四元數乘法獲得旋轉?


代碼本身是C++,但我檢查的蟒蛇與minieigen

from minieigen import * 
from math import * 
A=Quaternion((0,-1,0),pi/2) 
B=Quaternion((sqrt(3)/3,-sqrt(3)/3,sqrt(3)/3),(2/3.)*pi) 
# rotation in global frame: 
rg=B.conjugate()*A   # is Quaternion((-1,0,0),pi/2) 
# rotation in local frame: 
# ?? what now?! hack around with angle-axis 
aa=rg.toAngleAxis() 
rl=Quaternion(A*aa[1],aa[0]) # is Quaternion((0,0,-1),pi/2) 

for q in A,B,rg,rl: print q 

這給:

Quaternion((0,-1,0),1.5707963267948966) 
Quaternion((0.5773502691896257,-0.5773502691896257,0.5773502691896257),2.0943951023931953) 
Quaternion((-1,-7.850462293418876e-17,-7.850462293418876e-17),1.5707963267948968) 
Quaternion((-1.1102230246251568e-16,-7.850462293418877e-17,-1),1.5707963267948968) 

回答

0

這是一個很容易的,但我離開這裏備案號:

A*B.conjugate() 
0

你的方程式不太適合我。

我將使用Q'爲Q.conjugate。現在我們知道Q'* Q是身份,所以它是Q * Q'。因此,如果你想知道,轉變一個四元數(在全球框架因爲一個都在全球框架),然後你開始與方程(假設這些四元表示施加到列向量旋轉):

Q * A = B

然後您移動到另一側

Q * A * A'= B * A'= Q

這個,我們可以看出是正確的,因爲B * A'* A = B。你問題中的方程式表示:B'* A * A = B。一般來說,我認爲這並不成立。現在

,如果你想旋轉處於一個的框架,而不是全球性框架,這相當於說你要,在一個的框架。這與從B刪除A相同。像這樣:A'* B。這樣,如果您從A的幀旋轉到全局幀,您最終將再次得到BA * A'* B = B