Android Kompass scheint unzuverlässig

Ich habe an einem kleinen Kompass App die letzten paar Tage gearbeitet, und habe den Code auf und läuft, aber es scheint, dass der Kompass Lesung ist nicht genau. Nach dem Kalibrieren von beiden Handys, mein erster Test, dass ich das in dem, was ich hielt einfach das Telefon gegen und flache Oberfläche sah auf die Lesung dann drehte es horizontal und legte es gegen die gleiche flache Oberfläche (eine 180 * Umdrehung) und der Wert tat Nicht ändern 180 * es war näher an 240 *.

Ich habe dann das Lesen gegen einen Kompass getestet, manchmal schien das Lesen zu schließen, aber an anderen Punkten war es mehr als 50 * off. Ich habe sogar versucht, mein Telefon und Kompass auf den Boden zu stellen, um die Kompasse von irgendwelchen magnetischen Störungen mit den gleichen Ergebnissen zu behalten (beachten Sie, dass ich auch den Kompass und das Telefon auseinander halten, um sie in die gleiche Richtung zu halten, indem Sie sich mit Kanten eines Buches ausrichten) .

  • Android: Hinzufügen eines einfachen Fragments
  • Drehen einer Schnur in eine ... (Android)
  • Android NDK: Was soll ich in Application.mk für APP_ABI setzen?
  • Unbekannter Netzwerkfehler beim Herunterladen von Android Studio
  • EOFException beim Lesen von QueueFile-Band
  • Kann OnPostExcecute-Methode in AsyncTask RETURN-Werten?
  • Ich stelle dann die Beispielanwendung auf ein anderes Telefon (zuerst war nexus S, zweitens war Motorola droid 1). Zwischen den beiden Telefonen reicht die Differenz von gleich an einigen Punkten, aber höchstens zwischen 50 und 15 Grad aus.

    Ich habe durch die Dokumentation geschaut und habe auch viele verschiedene Forenbeiträge durchgesehen und ich sehe niemanden mit den gleichen Ergebnissen. Vielleicht gibt es einen kleinen Fehler in meinem Code, der dazu führt, dass meine Lesung falsch herauskommt, oder ein dokumentierter Fehler, den ich nicht sehe.

    Jede Einsicht oder Anregungen wäre sehr dankbar!

    Heres mein auf Sensor geänderter Code in meiner SensorEventListener Klasse

    public void onSensorChanged(SensorEvent event) { // If the sensor data is unreliable return if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show(); } // Gets the value of the sensor that has been changed switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: m_vfgravity = event.values.clone(); break; case Sensor.TYPE_MAGNETIC_FIELD: m_vfgeomag = event.values.clone(); break; } if (m_vfgravity != null && m_vfgeomag != null) { if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag)) { SensorManager.getOrientation(m_vfinR, m_vforientVals); m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2; //convert to 0-360 from -180-180 if(m_fCompBearing < 0.0) { m_fCompBearing = 360 + m_fCompBearing; } mCompHead.setText("" + (int)m_fCompBearing); } calcOffset(); rotateCmp(); } } 

    Und Code in auf die Schaffung meiner Tätigkeit

      mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSListener = new cSensorListener(); mSMngr.registerListener(mSListener, mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI); mSMngr.registerListener(mSListener, mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); 

    Danke im Voraus!

    Bearbeiten: auch versuchte es mit dem Droid X mit den schlechtesten Ergebnissen noch … Wenn das Telefon um 45 Grad gerollt wird (um die z-Achse um ein Computer-Koordinatensystem gedreht) kann sich die Kompassüberschrift um 180 Grad ändern, in der Tat der Kurswert Geht in die entgegengesetzte Richtung der anderen Telefone, wenn in die gleiche Richtung gesponnen. Dies ist das einzige Telefon, das dieses Ergebnis auch nach der Kalibrierung in den Einstellungen erzeugt. Auch ihr ist ein Kompass Live Wallpaper Ich teste gegen das hat nicht das gleiche Problem. Also würde ich davon ausgehen, dass es etwas gibt, was ich in der Software tun kann, um das zu vermeiden.

  • Schalterpräferenz - Handhabung sowohl onPreferenceChange als auch onPreferenceClick
  • Nach dem Senden von Daten an den Server, wie man Antwort in der nächsten Aktivität zu drucken?
  • Lesen Sie die Assets-Datei als String
  • MQTT vs. XMPP Was soll ich wählen?
  • Wie fügt man den Benachrichtigungswert für Artikel auf NavigationView für Material Design Schublade hinzu?
  • Kann die Radio Button-Farbe auf Android nicht ändern
  • 3 Solutions collect form web for “Android Kompass scheint unzuverlässig”

    Auch wenn der Autor seine eigene Frage beantwortet hat, muss ich hier reinigen, um die fast völlige Nützlichkeit jeglicher Kompassfunktionalität auf der Android-Plattform zu verstärken.

    Ich bin zu dem Schluss gekommen, dass jeder, der von einer Android-Kompass-Anwendung abhängt, nach Ärger fragt, keiner von ihnen arbeitet zuverlässig und es ist nicht die Schuld des Entwicklers.

    Google und die mfg's haben einfach keinen Weg, um zuverlässige Genauigkeit von diesen Geräten zu bekommen, oder sogar zu bestimmen, ob die Genauigkeit ist zuverlässig, die noch schlimmer ist, weil manchmal sind sie und viele Male sind sie nicht und wenn jemand vertraut diese Geräte für echte Orientierungslauf Gott helfe ihnen.

    Der Grund, warum der Autor vermutlich denkt, dass er bessere Ergebnisse erhält, ist, dass sie einen ziemlich guten Rauschfilter auf dem veralteten Orientierungssensor verwenden (warum sie dies nicht auf der neueren Methode über mich hinausgehen konnten) und bei einer begrenzten Prüfung auf einem einzigen Gerät nach der Kalibrierung Das scheint zu funktionieren, aber im Feld mit vielen Geräten habe ich festgestellt, dass zum größten Teil die Zuverlässigkeit immer in Frage steht.

    Zuerst sind die Geräusche, die von den magnetischen und orientierungssensoren erzeugt werden, schrecklich, ja dies kann mit den richtigen DSP-Techniken überwunden werden, und mit 2.3 und gyro-fähigen Handys wird es insgesamt besser, aber Schande auf Google und die Mfg's für die Verschwendung so viel Entwickler Zeit mit Scharfe Implementierungen von Hard- und Software-Ausgängen.

    Zweitens habe ich mindestens 18 Telefone mit der richtigen DSP-Filterung getauscht und während das das Rauschen aufräumt, das es nicht mit Genauigkeit hilft, auch das gleiche Modell von Handys hat unterschiedliche Ausgänge (obwohl einige Modelle besser als andere erscheinen)

    Drittens haben Sie wenig in der Art zu bestimmen, ob die Sensoren kalibriert sind, auch die spastische Figur 8 Bewegung kann oder kann nicht kalibrieren das Telefon und der Benutzer nie wirklich weiß, ob es funktioniert oder nicht, es sei denn, Sie haben einen Kompass zu überprüfen, welche Art von Niederlagen der Punkt nicht wahr?

    HINWEIS: Sie können die magnetischen Sensoren miteinander multiplizieren und summieren und die Quadratwurzel dieser sqrt (x * x + y * y + z * z) nehmen und sicherstellen, dass es zwischen 25 und 65 ist Kann verwenden, um anomale Felder zu erkennen, aber es ist nicht ganz zuverlässig, besser als nichts, denke ich.

    Viertens sind viele Telefone völlig unzuverlässig, kalibriert oder nicht, was nicht auf Modelltypen beschränkt ist, sondern möglicherweise schäbige QA seitens des mfg, ich weiß wirklich nicht, warum ich aber sagen kann, dass 3 HTC ARIAs sehr unterschiedliche Ergebnisse ( Eine 30 Grad aus, die anderen 50, und ein dritter fast vor Ort) gleiche Sache mit unglaublichen, nexus, etc.

    Ich habe 18 Telefone getestet und viele waren ziemlich nah an genau, wenn man richtig kalibrieren konnte, aber viele von denen nahmen 2-10 Versuche (wir verifizierten nach jedem Kalibrierungsversuch mit einem Präzisionskompass) und mehr als ein paar Mal würden sie einfach nicht kalibrieren überhaupt.

    HINWEIS: Sie müssen für die Deklamation für einen echten Nordoffset verantwortlich sein, was Sie mit der API in Android tun können, wenn Sie Zugriff auf die aktuellen GPS-Koordinaten, Höhe, Tageszeit usw. haben. Das Problem war NICHT Ablehnung und wenn Sie sind Im Vergleich zu einem Kompass, der sowieso kein Problem ist, da es auch durch lokale Magnetfelder bewirkt wird.

    Fith, Kaltstarts benötigen immer den Kalibrierungsschritt auf jedem Telefon, das wir getestet haben, welches das X, das Unglaubliche, das Aria, den Nexus und den Thunderbolt beinhaltet. Mit anderen Worten, das erste Mal, wenn Sie den Sensor hören 95% der Zeit, die es erfordert einen Kalibrierungsschritt (auch eine gebrochene Uhr ist richtig zweimal am Tag) so, wenn Sie darauf bestehen, diese Funktionalität zu bestehen, würde ich nur sagen, Ihren Benutzer, es zu tun Der Beginn eines jeden Hörer-Events.

    Wenn du die Senatoren läuftest (schlecht für Akku), dann kannst du dich eventuell nicht neu kalibrieren, je nach den Feldern, auf die es gestoßen ist. Die obige Methode funktioniert dafür.

    Die Quintessenz ist, dass, wenn sie funktionieren, sie cool erscheinen, aber man kann sich NIEMALS der Genauigkeit des Azimuts sicher sein, was sie ziemlich unzuverlässig und nutzlos für jede echte Arbeit macht.

    Persönlich würde ich ein GPS-Lager während der Bewegung und dann eine Rotation Vektor-Methode, wenn möglich, könnte es nicht perfekt sein, aber es wäre ein Heck von viel besser als die craptacular Umsetzung, die Sie in der aktuellen Zeile der Telefone für Azimut haben.

    Tut mir leid wegen der langwierigen Antwort, aber ich habe fast einen Monat verschwendet, um zu versuchen, dies zu bekommen, um mit Hilfe eines Experten-DSP-Ingenieurs zu arbeiten und wir haben so ziemlich von der Android-Plattform als nützlich in dieser Hinsicht geschrieben.

    A "Manchmal funktioniert das, andere mal wird es nicht, man kann nie sicher sein, wenn man nicht einen echten Kompass hat" Haftungsausschluss sollte in jedem Kompass Anwendung meiner Meinung nach gestellt werden.

    Gut nach vielen Tests und Debugging. Ich kam zu dem Schluss, dass ja, wie einige von euch die Unterschiede erwähnten, dass mein Droid 1 und Nexus S rein Hardwareunterschied und magnetische Störungen waren.

    Allerdings war der Droid X ein anderes Problem, was auch immer ich versuchte ich konnte nicht die richtigen Lesungen aus der empfohlenen Weise mit getRotationMatrix und getOrientation, auch wenn hinzugefügt Re-Map-Koordinaten Funktion. Also nach einigen Basteln ohne Erfolg Ich dachte, id geben dem Orientierungssensor einen Schuss.

    Google sagt, dass dieser Weg veraltet ist und sie empfehlen, es so zu tun, wie ich angefangen habe, aber ich habe alle Arten von Kombinationen mit diesem Weg ohne Erfolg versucht. Also ging ich voran und ignorierte deine Warnung und benutzte den Orientierungssensor … und es funktionierte. Warum ? Ich habe keine Ahnung, der Droid x ist neuere os als mein Droid 1 so sollte es nicht mit der Verwendung von Legacy-Code zu tun haben. Allerdings macht es Sinn, warum Kompass-Apps schrieb auf Ziel 1.6 würde funktionieren, während meine App die "empfohlene Weise" nicht funktionierte.

    Wenn irgendjemand einen besseren Weg hat, dies zu tun, lass es mich wissen, oder wenn du einen Weg kommst, um es mit getRotationMatrix zu arbeiten und getOrientation auch zu erzählen.

    Ansonsten für jedermann, der diese Ziegelmauer so hart schlägt, wie ich sie hered hat, ist der Code, der für mich gearbeitet hat.

    Mein Sensor wurde geändert

      switch (event.sensor.getType()) { case Sensor.TYPE_ORIENTATION: m_vforientVals = event.values.clone(); break; } if(m_vforientVals != null) { m_fCompBearing = m_vforientVals[0]; mCompHead.setText("" + (int)m_fCompBearing); calcOffset(); rotateCmp(); } 

    Und initialisieren den Sensor-Listener

      mSMngr.registerListener(mSListener,mSMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); 

    Dein Code sieht mir gut aus, wenn es einen Fehler in deinem Code geben würde, bin ich mir ziemlich sicher, dass beide Geräte darunter leiden würden. Ich denke, es ist die Hardware in den Geräten, die die Unterschiede verursacht. Haben Sie "kalibriert" beide Kompasse, indem Sie das Telefon in Abbildung acht Formen? Viele Kompass-Apps deuten darauf hin, dass, einschließlich der Karten-Software, die mit Symbian-Geräte kommt. Das könnte funktionieren

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