Wie man einen genauen Kompass auf Android macht
meinem android-Anwendung zeigt die Richtung zu einem bestimmten Ort in der Welt und daher muss der Kompass Grad.
Dies ist der code, den ich benutzt habe, um die Berechnung der Grad:
public void getDirection() {
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI);
}
else{
TextView alert = (TextView)findViewById(R.id.instruct);
alert.setText(getString(R.string.direction_not_found));
myCompassView.setVisibility(myCompassView.INVISIBLE);
}
}
private SensorEventListener mySensorEventListener = new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
//TODO Auto-generated method stub
compassBearing = (float)event.values[0];
float bearing;
bearing = compassBearing - templeBearing;
if (bearing < 0)
bearing = 360 + bearing;
myCompassView.updateDirection(bearing);
}
};
Diese Methode funktioniert meistens, aber manchmal ist es einfach immer den falschen Norden an, was muss ich tun, um eine genauere Lage?
InformationsquelleAutor der Frage eladrich | 2011-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich ein paar Vorschläge für Sie:
1) Ihr Gerät kann nicht kalibriert werden. Um es zu tun, bewegen Sie ihn in eine form 8 (dies sehen). Wenn Sie nicht, wenn Ihr Gerät kalibriert ist oder nicht, einige tests machen, indem Sie das Gerät an einen bekannten Kardinal Punkt die Richtung und die Werte vergleichen. In der Regel, wenn ein Gerät nicht kalibriert ist, sehen Sie große Unterschiede in der azimuth-Wert für kleine Rotationen. Das ist, was würde ich besorgt sein.
Nun, vergessen Sie nicht, dass der sensor gibt Ihnen die Peilung auf Magnetisch Norden, nicht Wahr North! Dieser Unterschied ist bekannt als Deklination des Magnetfeldes und dessen Wert ändert sich von Ort zu Ort und von Zeit zu Zeit aufgrund von änderungen in das Magnetfeld der Erde. Diese app berechnen können einige der Werte, für die Sie mit relativer Genauigkeit. Ich würde nicht zu viel über diese sorgen, wie die Deklination ist in der Regel klein, aber vielleicht sind Sie auf der Suche nach guten Präzision (wo ich wohne die Deklination ist, 3º, derzeit).
2) Bleiben Sie Weg von metallischen Gegenständen oder Sachen, die starke Magnetfelder erzeugen. Zum Beispiel, nicht tests durchführen, wenn Sie Ihr Telefon in der Nähe des Computers oder einer körperlichen Tastaturen! Dies ist reines Gift für die Erprobung Kompass-geolocation. Einige apps Messen die Intensität des Magnetfeldes (wenn das Gerät unterstützt). Wenn Sie näher an metal-Sachen, die Sie erleben höhere Werte und die starken Veränderungen in Richtung. Für Spaß gibt es auch einige "Metalldetektoren": diese app erkennt änderungen im magnetischen Feld und vibriert, wenn Sie in der Nähe von "Metall-Objekt" oder Sachen, die magnetisch stören mit dem Gerät.
3) denken Sie Daran, aktualisieren Sie die Lager, wenn Sie kippen Sie Ihr Gerät in das Querformat. ("Artikel Lesen ist ein muss!) Denn Azimut-Wert basiert auf der rotation der senkrechten Achse zu der Ebene des Telefons. Wenn Sie drehen Sie das Gerät ins Querformat, wird dieser Wert verändert sich um +/-90º! Dies nicht behoben ist, deaktiviert die Anwendung das Querformat! Sie wird zu entscheiden haben, es programmgesteuert durch die Analyse von Rotationen um die anderen beiden Achsen (pitch und roll). Dies ist nicht trivial, aber es gibt einige Beispiele im Netz irgendwo.
edit:Wenn Sie daran interessiert sind, einige code, check out Mixarees ist ein open-source augmented-reality-framework unter der GPL3 für Android. Werfen Sie einen Blick auf Ihren code hinsichtlich Orientierung, Kompass, geolocation und Lager.
PS: ich habe nicht jede Art von Verbindung mit den Machern der genannten Anwendungen.
InformationsquelleAutor der Antwort MobileCushion