Accelerometer Low-Pass-Filterung
Immer noch auf der BigNerdRanch iOS-Entwicklung Buch.
In der Accelerometer Kapitel, Sie zuerst zu implementieren accelerometer-tracking, aber es ist ziemlich nervös. Sie dann schlagen die Anwendung eines low-pass-filter, um es durch eine änderung der original-code:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
[hv setXShift:10.0 * [acceleration x]];
[hv setYShift:10.0 * [acceleration y]];
[hv setNeedsDisplay];
}
zu diesem:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
float xShift = [hv xShift] * 0.8 + [accel x] * 2.0;
float yShift = [hv yShift] * 0.8 + [accel y] * 2.0;
[hv setXShift:xShift];
[hv setYShift:yShift];
[hv setNeedsDisplay];
}
Ziemlich einfache Frage: Woher haben Sie diese Werte aus? Ich habe auf der Suche durch die Dokumentation und ich habe etwas gefunden über low-pass-Filter, die schlägt vor, die folgenden code:
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
//Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
//Use the acceleration data.
}
Jedoch zuerst habe ich versucht mit diesem code, und ich bekam eine Fehlermeldung (durch die Analyse meiner app) sagt, " die Links-Wert '*' ist einen Müll Wert. Meine accelerometer-tracking hat nicht funktioniert entweder.
Ich bin ziemlich verwirrt, was diese Werte bedeuten. Zum Beispiel, in den ersten Teil des Codes, warum multiplizieren Sie die Beschleunigung der Werte durch 10? Um einen "größeren" Bewegung? Ich könnte einige machen Sinn, aber der zweite code mit dem low-pass-filter macht absolut keinen Sinn für mich.
- Ich glaube, der Grund für die Multiplikation mit 10 ist, dass UIAcceleration gibt Sie zurück, Werte in G, die 1 G ist 9.81 Meter pro Sekunde pro Sekunde. 10 ist eine Annäherung von 9.81.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was passiert in diesem code sind die Multiplikation der Beschleunigung im moment durch die Filterung Faktor 0,1 und dann hinzufügen, um das gefilterte Beschleunigung der letzten Zeit ein update wurde von 0.9.
Dies ist so ziemlich immer der neue Wert und hinzufügen als 10% der gesamten accelX die anderen 90% aus dem vorherigen Wert, welcher abhängig ist von dem Wert, bevor, dass, abhängig vom Wert vor, und so weiter. Dieser schneidet mit hoher Frequenz Werte, wie Sie nur erlaubt 10% von jeder änderung Durchlaufen, um den neuen accelX Wert.
Den KFilteringFactor von 0,1 macht diese filter schneiden alle hohen Frequenzen. Sie wollen auf jeden Fall Experimentieren, indem Sie diesen Wert entsprechend Ihrer speziellen Anwendung.
Da Sie arbeiten durch die Big Nerd Ranch-Book - eine gute Idee wäre, gehen Sie auf die Buch-Diskussionsforum.
Weitere Informationen haben Sie einen Blick auf die Wikepedia Artikel über low-pass Filter.
Und für ein weiteres Beispiel zum filtern haben Sie einen Blick auf apples AccelerometerGraph Beispiel
Auch - denken, wenn Sie kFilteringFactor 0,2 gibt den Multiplikator für den aktuellen Wert 0.8 1 - 0.2, und den Multiplikator für den neuen Wert ist 2.0, weil es 0,2 x 10
Ich nehme an, 10 ist der scaling-Faktor zu geben, sinnvolle Werte.