Wie bekomme ich den Magnetfeldvektor unabhängig von der Geräterotation?

Was ich zu archivieren möchte, ist eine Art "magnetischer Fingerabdruck" eines Ortes. Ich verwende den MAGNETIC_FIELD Sensor und bekomme im Falle der 3 Werte für die (leider nicht weiter erläuterte) X-, Y- und Z-Achse.

Problem ist, dass sich die Werte ändern, während ich das Gerät drehe, also denke ich, dass die 3 Achse relativ zum Gerät sind. Was ich brauche, ist, die Drehung des Geräts zu kompensieren, damit ich die gleichen 3 Werte bekomme, unabhängig davon, wie das Gerät gedreht wird.

  • Wie kann ich javadoc zu Google Play Services in Android Studio hinzufügen?
  • Cordova Ionic: Enable Android Emoji Soft-Tastatur
  • GetIntent () Extras immer NULL
  • Öffnen von pdf-Datei vom Server mit Android-Absicht
  • Android Studio 0.6.0 kann keine neuen Module erstellen
  • Erstellen von Standardstil mit benutzerdefinierten Attributen
  • Ich habe versucht, mich mit der Rotationsmatrix zu vermehren (ich weiß, wie man das bekommt), versuchte, sich mit der Neigungsmatrix zu vermehren und so weiter, aber nichts funktioniert. Unabhängig davon, was ich versuche, ändern sich die Werte immer noch, wenn ich das Gerät drehe.

    Also weiß jemand, wie man das richtig macht? Bevorzugt mit Code, denn ich lese viel Sachen wie 'gut dann musst du das mit der Rotationsmatrix kompensieren, aber kein einziges konkretes Beispiel finden.

  • Wie bekomme ich Android AVD Name von adb Gerätenamen
  • Pure Java Video Endcodierung / Decodierung Bibliotheken
  • Spracherkennung auf Android mit aufgezeichneten Klangclip?
  • Was ist die richtige Reihenfolge der Aufruf von Superklasse Methoden in onPause, onStop und onDestroy Methoden? und warum?
  • Hat Fragment.getArguments () nach der Konfigurationsänderung die Argumente zurückgegeben?
  • Google Play Services Aktivitätserkennung - Akku verwenden?
  • 4 Solutions collect form web for “Wie bekomme ich den Magnetfeldvektor unabhängig von der Geräterotation?”

    Mach das

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

    Lösung:

    Möglichkeit 1:

    MAGNETIC_FIELD ist sehr instabil in Bezug auf die Rotation, die Sie nicht auf nur einige Mathematik beziehen können, um Landschafts- und Porträt-Werte zu konvertieren, der Hauptgrund ist, dass die Hardware unterschiedliche Captoren für verschiedene Achsen verwendet, dann, wenn Sie rotieren, verwenden Sie einen anderen Hardware-Captor, der Wert wird niemals derselbe sein , Auf irgendeinem hallo Endgerät ist es das gleiche aber nicht auf den meisten Geräten.

    Wenn du etwas willst und auf vielen Geräten kompatibel bist, musst du das MAGNETIC_FIELD mit Rotation berechnen, sondern nur die Orientierung mit deiner Anwendung erzwingen. Force "portrait" Orientierungsmodus

    Möglichkeit 2:

    Du hast über "magnetic fingerprint" of a location. Wenn es nur darum geht, einen Standort ohne GPS zu identifizieren, haben Sie viele weitere Informationen, um mit zu arbeiten. Erste "Wifi SSIDs" dann "Mobile Networks Cells" auch "Connected Wifi" etc. Wenn dies interessiert, könnte ich Ihnen Code für sie geben.

    Möglichkeit 3:

    Wenn Sie unbedingt MAGNETIC_FIELD für Ihren Standort berechnen müssen und nicht die Rotation erzwingen möchten, können Sie sowohl Wertlandschaft als auch Porträt anfangen, anstatt sie zu berechnen. Dann, wenn man vergleichbar mit beiden Werten vergleicht.

    Auch wenn Sie schauen, um Platz zu finden, wo Sie Magnet haben oder hight magnetischen Lage können Sie mit einem Hi Toleranz Prozentsatz nur zu erkennen, wenn ein Magnet vorhanden ist oder so,

    Hinweis :

    Wenn Sie mit der Mathematik bleiben, vergessen Sie nicht, dass die Funktion auf fast jedem Gerät unterschiedlich sein wird … zögern Sie nicht, mehr Infos über Ihre Frage zu geben, ich werde mich freuen, meine Antwort anzupassen;)

    Um die Stärke des Magnetfeldes zu erhalten, musst du die x, y, z-Werte des Magnetfeldes (von Sensor.TYPE_MAGNETIC_FIELD) erhalten und die folgende Formel anwenden:

     double magnetic_field_strength = Math.sqrt( (Xvalue*Xvalue) + (Yvalue*Yvalue) + (Zvalue*Zvalue) ); 

    Magnetische Feldstärke wird in Mikrotesla (μT) ausgedrückt
    Es konnte festgestellt werden, dass die durchschnittliche Magnetfeldstärke der Erde 50 μT beträgt, entsprechend dieser Website .

    So wäre ein möglicher Code:

     private SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_MAGNETIC_FIELD: magnetic_field_strength = Math.sqrt((event.values[0]*event.values[0])+(event.values[1]*event.values[1])+(event.values[2]*event.values[2])); break; default: return; } } } 

    Die Koordinaten des Magnetfeldvektors sind relativ zum Mobiltelefon gegeben, wie in diesem Bild:

    Bildbeschreibung hier eingeben

    Um den Magnetfeldvektor im Koordinatensystem des folgenden Bildes zu erhalten:

    Bildbeschreibung hier eingeben

    Sie müssen den magnetischen Vektor m mit der aus Matrix R abgerufenen Rotationsmatrix R multiplizieren, wie R * m . Dieser Vektor wird durch die Erde zum magnetischen Nordpol zeigen.

    Wenn man es auch mit Neigung I multipliziert, würde der Vektor um die X-Achse gedreht werden, um vollständig auf der Y-Achse zu sein:

    [0 m 0] = I * R * geomagnetisch (m = Größe des geomagnetischen Feldes)

    Dieser Vektor sollte für jede Position auf der Erde konstant sein. Allerdings können die Ergebnisse auf Ihrem Mobiltelefon leichte Abweichungen zeigen, denn Sie müssen sehr vorsichtig sein, die Position des Sensors beim Drehen des Gerätes nicht zu ändern.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.