2010-07-04 9 views
16

Ich schreibe eine App in Google Android 2.1, die wissen muss, in welche Richtung (n/w/s/e) das Gerät (HTC Hero) zeigt. Der Sensor und sein Zuhörer funktionieren gut, aber die Werte, die ich vom Sensor bekomme, sind total beschissen. z.B. es sagt mir, dass ich nach Norden schaue, wenn das Gerät nach SW oder so aussieht ...Wie kalibriert man den Orientierungssensor in Android?

Dies scheint ein bekanntes Problem mit Android-Geräten zu sein. Die „Lösungen“ ich im Internet wie folgt aussehen gefunden:

  • das Gerät schütteln um
  • bewegen Sie das Gerät wie ein acht
  • Tippen auf den Geräten zurück

Dieser Gedanke wird lösen Sie die Neukalibrierung der Sensoren aus. Und: Die Sache mit dem „bewegen“ funktioniert für mich ... aber das ist nicht sehr professionell Ich denke, ...

so - wie auslösen ich die Rekalibrierung des Orientierungssensors aus dem SDK? Ich brauche den Sensor richtig kalibriert ohne irgendwelche ausgefallenen Sachen, die Benutzer dieser App aussehen wie komplette Idioten machen würde, während sie ihre Telefone "manuell" neu kalibrieren ...

Gibt es eine Möglichkeit, dies "richtig" zu tun?

EDIT:

Oder: Gibt es eine Möglichkeit, programmatisch zu bestimmen, ob das Gerät richtig kalibriert ist oder nicht? Als Ausweichmöglichkeit sozusagen ... dann könnte ich den Benutzer warnen, dass das Gerät "manuell" neu kalibriert werden muss.

+1

sobald ich eine Kompassanwendung auf dem Markt sehe. Diese Anwendung gibt eine Nachricht, wenn die Traktion des Magnetfeldes schlecht ist. Ich weiß nicht, wie das funktioniert, also interessiert mich diese Antwort entweder – Michel

Antwort

3

Ich glaube nicht, dass es eine Möglichkeit gibt, programmatisch zu wissen, wenn der Kompasssensor korrekt kalibriert ist, es sei denn, Sie verwenden eine sekundäre Datenquelle wie GPS. Wenn Sie GPS verwenden können, können Sie beim Bewegen des Benutzers die GPS-Bewegung mit der Kompassrichtung vergleichen und korrigieren. Denken Sie daran, dass lokale Magnetfelder die Kompasswerte verfälschen können und die Geräte keine Ahnung haben, wenn Sie mitten im Wald oder neben einem Transformator sind.

Mit diesen Mikrogeräten gibt es immer ein bisschen Skew, mit dem Sie sich befassen müssen. Wenn Sie auch die Werte für den Beschleunigungssensor überprüfen, sehen Sie, dass sie im Ruhezustand nicht immer 9,8 m/s^2 (oder zumindest konsistent zwischen Geräten) zurückgeben.

In Ihrer Hilfe müssen Sie dem Benutzer lediglich mitteilen, dass er sein Telefon in einer Acht drehen/drehen muss, um den Kompass zurückzusetzen.

+0

danke für deine Antwort, aber leider kann ich GPS in dieser App überhaupt nicht verwenden. Problem ist, hatte ich meine htc Held mir total nonsenesse die ganze Zeit zurück, bis ich es bekommen, um seinen Sensor neu zu kalibrieren. ich muss wirklich wissen, wie man dieses durch sdk/ndk ... – xenonite

+1

anstellt Es gibt ein Forum, in dem sie einige Shellanweisungen erwähnt haben, um die Sensoren zu zwingen, eine neue Einstellungsdatei zu schreiben, aber erfordert den Befehl su, der Sie bedeutet möglicherweise nicht in der Lage, es in einer normalen Android-Version zu verwenden ... anders als das, könnten Sie eine Shell über Java öffnen, und geben Sie diese Befehle ein, obwohl ein Neustart erforderlich ist, damit es wirksam wird, vorausgesetzt, es funktioniert sowieso. Sie können den Link hier überprüfen: http://forum.xda-developers.com/showpost.php?p=4081673&postcount=4885 –

+0

Diese GPS-Kalibrierungsmethode würde nur funktionieren, wenn Sie den Benutzer anweisen, das Telefon in Richtung zu richten Bewegung, oder? Oder fehlt mir etwas? – MatrixFrog

-3

Dies sind einige Orientierungen Handler u

Constants int ORIENTATION_UNKNOWN von onOrientationChanged Retour verwenden können, wenn die Vorrichtung Orientierung nicht bestimmt werden kann (in der Regel, wenn das Gerät in einer Nähe der flachen Position ist). Öffentliche Konstruktoren OrientationEventListener (Kontextkontext) Erstellt einen neuen OrientationEventListener. OrientationEventListener (Kontextkontext, Int-Rate) Erstellt einen neuen OrientationEventListener. Öffentliche Methoden boolean canDetectOrientation() void disable() Deaktiviert den OrientationEventListener. void enable() Aktiviert den OrientationEventListener, damit er den Sensor überwacht und OnOrientationChanged (int) aufruft, wenn sich die Ausrichtung des Geräts ändert. abstract void onOrientationChanged (int orientation) Wird aufgerufen, wenn sich die Ausrichtung des Geräts geändert hat. [Erweitern] Inherited Methods Aus der Klasse java.lang.Object Objekt clone() Erstellt eine Kopie dieses Objekts und gibt sie zurück. Boolescher Wert (Objekt o) Vergleicht diese Instanz mit dem angegebenen Objekt und gibt an, ob sie gleich sind. void finalize() Wird aufgerufen, bevor der Speicher des Objekts von der VM zurückgewonnen wird. final Klasse getClass() Gibt die eindeutige Instanz der Klasse zurück, die die Klasse dieses Objekts darstellt. int hashCode() Gibt einen Ganzzahl-Hash-Code für dieses Objekt zurück. final void notify() Bewirkt, dass ein Thread, der auf dem Monitor dieses Objekts wartet (durch Aufruf einer der wait() -Methoden) aufgeweckt wird. final void notifyAll() Bewirkt, dass alle Threads, die auf dem Monitor dieses Objekts warten (durch Aufruf einer der wait() -Methoden), aufgeweckt werden. String toString() Gibt eine Zeichenfolge mit einer präzisen, lesbaren Beschreibung dieses Objekts zurück. final void wait (lange millis, int nanos) Bewirkt, dass der aufrufende Thread wartet, bis ein anderer Thread die Methode notify() oder notifyAll() dieses Objekts aufruft oder bis das angegebene Zeitlimit abgelaufen ist. final void wait (long millis) Bewirkt, dass der aufrufende Thread wartet, bis ein anderer Thread die Methode notify() oder notifyAll() dieses Objekts aufruft oder bis das angegebene Zeitlimit abgelaufen ist. final void wait() Bewirkt, dass der aufrufende Thread wartet, bis ein anderer Thread die Methode notify() oder notifyAll() dieses Objekts aufruft. Constants public static final int ORIENTATION_UNKNOWN Seit: API Stufe 3

von onOrientationChanged zurückgegeben, wenn die Geräteausrichtung nicht bestimmt werden kann (in der Regel, wenn das Gerät in einer Nähe der flache Position ist). Siehe auch

* onOrientationChanged(int) 

Konstante Wert: -1 (0xffffffff) öffentlicher Konstrukteurs öffentlicher OrientationEventListener (Context Kontext) seit: API Ebene 3

ein neues OrientationEventListener Schafft. Parameter Kontext für den OrientationEventListener. public OrientationEventListener (Kontextkontext, Int-Rate) Seit: API Level 3

Erstellt einen neuen OrientationEventListener. Parameter Kontext für den OrientationEventListener. Rate, mit der Sensorereignisse verarbeitet werden (siehe auch SensorManager). Verwenden Sie den Standardwert SENSOR_DELAY_NORMAL für die einfache Erkennung der Bildschirmausrichtung. Public Methoden public boolean canDetectOrientation() seit: API-Level 3

public void disable() seit: API-Level 3

Deaktiviert die OrientationEventListener. public void aktivieren() Seit: API Stufe 3

die OrientationEventListener Ermöglicht es so den Sensor überwacht wird, und rufen onOrientationChanged (int), wenn die Vorrichtung Orientierungsänderungen. public abstract void onOrientationChanged (Int-Ausrichtung) Seit: API Level 3

Wird aufgerufen, wenn sich die Ausrichtung des Geräts geändert hat. Orientierungsparameter sind in Grad von 0 bis 359. Orientierung ist 0 Grad wenn das Gerät in seiner natürlichen Position ausgerichtet ist, 90 Grad wenn seine linke Seite oben ist, 180 Grad wenn es auf dem Kopf steht und 270 Grad wenn es ist rechte Seite ist nach oben. ORIENTATION_UNKNOWN wird zurückgegeben, wenn das Gerät fast leer ist und die Ausrichtung nicht bestimmt werden kann.

+6

http://meta.stackexchange.com/questions/22186/how-doi-format-my-code-blocks – MatrixFrog

+0

Es ist nicht hilfreich, die unformatierte Dokumentation der API zu kopieren und zu verwerfen. Ein Beispiel wäre ratsamer. – Spindizzy

0

Ich nehme an, Sie beziehen sich auf das Magnetometer im Inneren des Helden.

Das Kalibrieren ist schwierig und erfordert immer eine Benutzerinteraktion für eine zuverlässige Kalibrierung. Es gibt verschiedene Strategien, um damit umzugehen. Sie könnten die Benutzer bitten, das Gerät in nördlicher Richtung zu halten und dann wieder aufzurufen. Wenn die Benutzer nicht wissen, wo Norden ist, können Sie sie bitten, das Gerät in Richtung der Sonne zu führen und basierend auf Ort und Zeit können Sie berechnen, wo das ist.

Lassen Kallibrierung beiseite, würde ich vermuten, dass Ihr Problem ist, dass die Messwerte, die Sie vom Sensor erhalten, ungenau sind. Natürlich ist die Kalibrierung eine Voraussetzung für genaue Messungen, aber es spielen auch andere Faktoren eine Rolle.

Es ist üblich, Sensordaten von einem Sensor mit den Daten eines anderen Sensors zu ergänzen, um die Genauigkeit zu erhöhen. Sie können das GPS verwenden, um eine Richtung zu bestimmen, wenn der Benutzer sich bewegt. Wenn er sich jedoch langsam bewegt, ist dies ebenfalls ungenau. Sie könnten die vom Accelerometer berichteten Daten integrieren, um Orientierungsänderungen (nicht die absolute Ausrichtung) zu erraten. Aber ehrlich gesagt wäre ein Gyrometer in diesem Fall idealer.

Systeme, die so funktionieren, werden manchmal Inertial Navigation Systems (INS) genannt, weil sie bei einem festen Punkt im Raum ihre spätere relative Position und Orientierung ohne weitere externe Daten genau bestimmen können. Die Verwendung eines Kalman-Filters ist gängige Praxis, um das System von Zeit zu Zeit wieder aufzurufen, wenn eine absolute Position (z. B. über GPS abgerufen) verfügbar ist.

Obwohl es unrealistisch ist, ein vollwertiges INS zu implementieren, können Sie sicherlich einige Ideen aus ihrer Arbeitsweise ziehen, um Ihre Orientierungswerte genauer zu machen.