簡體   English   中英

Android磁力計全局坐標

[英]Android magnetometer global coordinates

我有一個讀取磁力計返回值的應用程序。
目前,它的執行方式是在手機的坐標系中。

我希望能夠始終讀取全局坐標系中的磁場矢量(x,y,z-東,北,天空)

我嘗試的代碼(受此問題啟發)將導致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]);
    }

該代碼是正確的,但總會出現波動,因為gravity只是一個估計值。 實際上,如果設備accelerometer ,則世界坐標系中的accelerometer理論上應與位置無關,而相同,因為作用在其上的唯一力是minus gravity ,因此當設備靜止時, accelerometer應為gravity 您只能期望設備靜止時EastNorth坐標非常小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM