Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 further explained) X, Y and Z axis.

Problem is, that the values change as I rotate the device, so I guess the 3 axis are relative to the device. What I'd need is to compensate the device rotation so that I get the same 3 values, regardless of how the device is rotated.

I tried to multiply with the rotation matrix (I know how to get that), tried to multiply with the inclination matrix and so on, but nothing works. Regardless of what I try, still the values change when I rotate the device.

So does anyone know how to do it right? Preferrably with code, because I read a lot of stuff like 'well then you'll have to compensate that using rotation matrix' but did not find a single concrete, working example.

like image 461
Ridcully Avatar asked Aug 02 '12 07:08

Ridcully


People also ask

Can the objects in rotational motion create a magnetic field provide an example?

A rapidly rotating sphere may itself generate a significant magnetic field, which will affect the sphere's eddy currents. The change in the eddy currents then changes the magnetic field, resulting in an infinite feedback process.

Does the magnetic field rotate?

A permanent magnet in such a field will rotate so as to maintain its alignment with the external field. This effect was utilized in early alternating-current electric motors. A rotating magnetic field can be constructed using two orthogonal coils with a 90-degree phase difference in their alternating currents.

What creates a magnetic field more than one answer may be correct?

All magnetic fields are created by moving charged particles. Even the magnet on your fridge is magnetic because it contains electrons that are constantly moving around inside. Was this answer helpful?

How do you think a magnetic field is created?

Magnetic fields are produced by moving electric charges. Everything is made up of atoms, and each atom has a nucleus made of neutrons and protons with electrons that orbit around the nucleus. Since the orbiting electrons ≠are tiny moving charges, a small magnetic field is created around each atom.


1 Answers

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]);

        }
    }
like image 200
vineetv2821993 Avatar answered Sep 28 '22 08:09

vineetv2821993