Nadal w książce rozwojowej BigOberdRanch iOS.Akcelerometr z dolnoprzepustowym filtrem
W rozdziale Przyspieszeniomierz najpierw wprowadzają śledzenie przyspieszeniomierza, ale jest ono dość niespokojne. Następnie proponuję zastosować filtr dolnoprzepustowy do niego poprzez zmianę oryginalnego kodu:
- (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];
}
do tego:
- (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];
}
dość proste pytanie: Skąd biorą te wartości od? Szukałem poprzez dokumentacji i znalazłem coś o filtry dolnoprzepustowe, co sugeruje następujący kod:
#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.
}
Jednak najpierw próbował z tym kodem i mam błąd (analizując mój app) mówiąc: "lewa wartość" * "to wartość śmieci". Moje śledzenie przyspieszeniomierza również nie działa.
Jestem dość zdezorientowany, co oznaczają te wartości. Na przykład, w pierwszej części kodu, dlaczego mnożą wartości przyspieszenia przez 10? Aby uzyskać "większy" ruch? Mógłbym to zrozumieć, ale drugi kod z filtrem dolnoprzepustowym nie ma dla mnie żadnego sensu.
Myślę, że powodem pomnożenia przez 10 jest to, że UIAcceleration daje wartości z powrotem w G, którego 1G wynosi 9,81 metra na sekundę na sekundę. 10 to przybliżenie 9,81. – SDJMcHattie