How can I get the magnetic field vector, independent of the device rotation?

前端 未结 4 1974
心在旅途
心在旅途 2020-12-11 16:16

What I want to archieve is a sort of \"magnetic fingerprint\" of a location. I use the MAGNETIC_FIELD sensor and in the event I get the 3 values for the (unfortunately not f

4条回答
  •  醉话见心
    2020-12-11 16:35

    Do this

    private static final int TEST_GRAV = Sensor.TYPE_ACCELEROMETER;
    private static final int TEST_MAG = Sensor.TYPE_MAGNETIC_FIELD;
    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() == TEST_GRAV) {
                // 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() == TEST_MAG) {
    
                magnetic[0] = event.values[0];
                magnetic[1] = event.values[1];
                magnetic[2] = event.values[2];
    
                float[] R = new float[9];
                float[] I = new float[9];
                SensorManager.getRotationMatrix(R, I, gravity, magnetic);
                float [] A_D = event.values.clone();
                float [] A_W = new float[3];
                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]);
    
            }
        }
    

提交回复
热议问题