下面的圖像示出了兩個座標系統A和B,位於所述全局幀G: 旋轉在本地幀,表示爲四元數
我需要找到四元數,其旋轉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)