Aún en el libro de desarrollo BigNerdRanch para iOS.Filtro de paso bajo del acelerómetro
En el capítulo Acelerómetro, primero implementan el seguimiento del acelerómetro, pero es bastante nervioso. A continuación, sugieren aplicar un filtro de paso bajo para que al cambiar el código original:
- (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];
}
a esto: pregunta
- (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];
}
bastante simple: ¿de dónde sacan estos valores? He estado buscando a través de la documentación y he encontrado algo acerca de los filtros de paso bajo, lo que sugiere el siguiente código:
#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.
}
Sin embargo, intentó por primera vez con ese código y me dio un error (mediante el análisis de mi aplicación) diciendo 'el valor de la izquierda de' * 'es un valor de basura'. El seguimiento de mi acelerómetro tampoco funcionaba.
Estoy bastante confundido en cuanto a lo que significan estos valores. Por ejemplo, en la primera parte del código, ¿por qué multiplican los valores de aceleración por 10? Para obtener un movimiento 'más grande'? Podría darle sentido a eso, pero el segundo código con filtro de paso bajo no tiene ningún sentido para mí.
Creo que la razón para multiplicar por 10 es que UIAcceleration te devuelve valores en G que 1G es 9.81 metros por segundo por segundo. 10 es una aproximación de 9.81. – SDJMcHattie