Android磁力计全球坐标

时间:2016-03-06 00:19:52

标签: android transform android-sensors rotational-matrices magnetometer

我有一个应用程序,可以读取磁力计返回的值 它目前的做法是在手机的坐标系统中。

我希望能够始终在全局坐标系统(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]);
    }

1 个答案:

答案 0 :(得分:0)

代码是正确的,但总是有波动,因为gravity只是一个估计值。实际上,如果设备仍然存在,世界坐标中的accelerometer理论上应该与位置无关,因为作用于它的唯一力是minus gravity,因此accelerometer应该是{{} 1}}当设备静止时。当设备静止时,您只能期望gravityEast坐标非常小。