2

我有一個應用程序讀取磁力計返回的值。
它目前的做法是在電話的座標系統中。Android磁力計全局座標

我希望能夠經常閱讀的磁場矢量在全球座標系(X,Y,Z - 華東,華北,天空)

我試過的代碼(從這個question啓發)將導致對於x軸分量,值爲0,而變量y,z取決於我傾斜手機的方式。據我所知,旋轉矩陣變換應該使我的座標系統成爲全局的,但似乎並不是這樣。

只要我把手機放在一個地方,不管它的傾斜度如何,預期的行爲就是在x,y,z分量上具有相同的值。

private final float alpha = (float) 0.8; 
private float gravity[] = new float[3]; 
private float magnetic[] = new float[3]; 

public void onSensorChanged(SensorEvent event) { 

    Sensor sensor = event.sensor; 
    if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     // Isolate the force of gravity with the low-pass filter. 
      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 
    } else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 

     magnetic[0] = event.values[0]; 
     magnetic[1] = event.values[1]; 
     magnetic[2] = event.values[2]; 

     float[] R = new float[9]; //rotation matrix 
     float[] I = new float[9]; //inclination 
     SensorManager.getRotationMatrix(R, I, gravity, magnetic); 
     float [] A_D = event.values.clone(); // device coordinates 
     float [] A_W = new float[3];   // global coodinates 
     A_W[0] = R[0] * A_D[0] + R[1] * A_D[1] + R[2] * A_D[2]; 
     A_W[1] = R[3] * A_D[0] + R[4] * A_D[1] + R[5] * A_D[2]; 
     A_W[2] = R[6] * A_D[0] + R[7] * A_D[1] + R[8] * A_D[2]; 

     Log.d("Field","\nX :"+A_W[0]+"\nY :"+A_W[1]+"\nZ :"+A_W[2]); 
    } 

回答

0

該代碼是正確的,但總是有波動,因爲gravity只是一個估計值。實際上,如果設備仍然存在,世界座標系中的accelerometer在理論上應該與位置無關,因爲當設備靜止時,作用於其上的唯一力是minus gravity,因此accelerometer應該是gravity。您只能預期當設備靜止時,EastNorth座標非常小。