Ich versuche, das Rauschen des Orientierungs- / Kompasssensors in meinem magischen Telefon herauszufiltern.
Einige der Messwerte scheinen um 90-180 Grad zu schwanken und es gibt eine Menge Wackeln. Ich habe verschiedene Dinge mit begrenztem Erfolg ausprobiert, also habe ich mich gefragt, ob irgendjemand einen Algorithmus empfehlen könnte, um diese Art von Rauschen zu filtern, um eine stabile Ausgabe zu erhalten.
BR, Mads
Das ist wirklich spät, aber es könnte Leuten wie mir helfen, die zu dieser Frage gekommen sind.
Verwenden Sie den Typ Rotationsvektorsensor. Sie müssen kein Tiefpassfilter verwenden oder einen Durchschnittswert der letzten x Sensorwerte berechnen.
Hier ist ein Code:
%Vor%Ich fand die Werte sehr schnell und problemlos und nutze diese in meiner App. Ich habe Beschleunigungsmesser und Magnetometer als Backup verwendet, falls der Rotationsvektor im Gerät nicht vorhanden ist, es handelt sich um einen softwarebasierten Sensor (Sensor Fusion), der das Magnetometer, Beschleunigungsmesser und Gyroskop (falls vorhanden) verwendet.
Ich habe den Großteil des Rauschens durch eine langsamere Aktualisierungszeit losgeworden. Ich bin mir nicht sicher, ob Android einen eingebauten Filter für diese hat, aber es scheint sich zu stabilisieren. Etwas wie:
%Vor%SensorManager bietet Folgendes an:
SENSOR_DELAY_FASTEST
: Erhalten Sie Sensordaten so schnell wie möglich SENSOR_DELAY_GAME
: Rate geeignet für Spiele SENSOR_DELAY_NORMAL
: rate (Standard), geeignet für Änderungen der Bildschirmausrichtung SENSOR_DELAY_UI
: Rate geeignet für die Benutzeroberfläche Was hast du probiert? Wie viele Messwerte bekommst du pro Sekunde?
Ich würde etwas im Sinne eines Durchschnitts der letzten X Anzahl von Lesungen vorschlagen, um die "Jiggles" loszuwerden und alle Lesungen wegzuwerfen, die sich wild von der aktuellen Richtung unterscheiden, um jedes verrückte "Springen" von Werten zu stoppen . Je nachdem, wie viele Messwerte Sie erhalten und wie viel Durchschnitt Sie erzielen, verliert Ihre App möglicherweise die Reaktionsfähigkeit.
Der folgende Link könnte nützlich sein. Ссылка
Wenn Sie eine signifikante Anzahl von völlig falschen Werten erhalten, möchten Sie diese wahrscheinlich nicht nur mitteln. Sie könnten zuerst versuchen, einen Median-Filter anzuwenden - nehmen Sie N Samples, berechnen Sie den Median und werfen Sie etwas mehr als + - irgendeinen Schwellenwert raus. Sie können danach einen Glättungsfilter anwenden.
Wenn Ihre Messwerte "90-180 Grad aus" sind, müssen Sie entweder Ihren Kompass kalibrieren oder Ihr Sensor ist fehlerhaft.
Sicherlich hat der Magnetsensor viel Wackeln, aber die "Standardabweichung" eines solchen Rauschens beträgt etwa 4 Grad. Sie können eine Vielzahl von mathematischen Filtern (Tiefpass, Kalman) und Algorithmen (Mittelwertbildung, fallweise falsche Messwerte) auswählen, um sie auf die Messungen anzuwenden, die Ihnen akzeptable Ergebnisse liefern.
Benutzt du:
%Vor%Sie registrieren möglicherweise zwei separate Sensorhandles, die beide auf Ihre onSensorChanged-Methode verweisen. Nun, bei meiner onSensorChanged-Methode sende ich den Peilungswert basierend auf dem Herstellernamen entweder an die primäre oder an die sekundäre Methode. Probieren Sie diesen Code aus:
%Vor%Tags und Links android