2017-01-11 69 views
0

返回錯誤的值我有以下代碼以提取從四元的標題。javax.vecmath四元計算(其中reffernce執行工作的正確)

import javax.vecmath.Matrix3d; 
import javax.vecmath.Quat4d; 
import javax.vecmath.Vector3d; 

public static double toHeading(Quat4d q) { 
     Vector3d v = new Vector3d(1.0, 0.0, 0.0); 
     Matrix3d m = new Matrix3d(); 
     m.set(q); 
     m.transform(v); 
     double headingRad = Math.atan2(v.y, v.x); 
     return headingRad; 
    } 

一般來說它的工作,因爲它應該,但僅限於小角度值,我看到一個奇怪的現象。當我輸入下面的四元x=0.00666661728238647, y=0.0, z=0.0, w=0.9999777778600933那麼它應該返回0.7622087155227671程度,但它返回0。當我輸入的值here在線計算器返回正確的值。對我來說,這看起來像一個錯誤。有人可以驗證這一點?我在這裏做錯了什麼?

我用下面的Java版本

java version "1.8.0_91" 
Java(TM) SE Runtime Environment (build 1.8.0_91-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode) 

回答

1

你的四元數

q = w + i*x+j*y+k*z 
= cos(phi) + i*sin(phi) where phi = 0.006666666664992743 

你要轉換的載體是

v = i 

轉型是

v = q * v * q.conj() = i 

並且因此返回不變的向量。該對的第一個座標是(v.x,v.y) = (1,0),其角度爲零。因此,Java庫返回正確的結果。


你可能想和進入網絡公式推的是讓四元數是

q = cos(phi) + k*sin(phi) 

,使旋轉軸是Z軸。然後旋轉公式給出

v = q*v*q.conj() 
= (cos(phi) + k*sin(phi))^2*i 
= (cos(2*phi)+k*sin(2*phi)) *i 
= i*cos(2*phi)+j*sin(2*phi) 

這裏(v.x, vy) = (cos(2*phi), sin(2*phi))具有角度2*phi=0.013333333329985486=0.76394372664928°

+0

非常感謝你,你的explanaition幫助解決問題!我使用了一個轉換'EulerAngle' - >'AxisAngle' - >'Quaternion',並且AxisAngle部分導致了代碼爲'double norm = x * x + y * y + z * z的問題;如果(標準<0.001)x = 1; \t y = z = 0; } else {...}'現在我將它改爲z軸,一切正常 – Westranger