Pregunta

Yo les pido a 50 Hz / 50 veces por segundo para los datos. Cuando de repente me tapa del dispositivo en el eje x en 90 grados mientras que el dispositivo era plana sobre una mesa con pantalla hacia arriba bevore, los valores se mueven bastante lentamente al valor "objetivo" para esa posición.

Ahora lo raro es: Si aumento la velocidad de medición, el valor se moverá más rápido a ese nuevo valor a voltear de repente el dispositivo de 90 grados. Pero si yo sólo pido una vez por segundo para el nuevo valor, se necesita de mucho tiempo hasta que el valor alcanza el objetivo. ¿Cuál puede ser la razón de esto?

No hago ningún tipo de agregación de datos, y no se acumulan nada. Acabo de hacer algún tipo de filtrado sencillo para deshacerse del ruido. Mi método es el siguiente:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
    // accelerationX is an instance variable
    accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

    // round
    int i = accelerationX * 100;
    float clippedAccelerationValue = i;
    clippedAccelerationValue /= 100;

    [self moveViews:clippedAccelerationValue];
}

Más tarde, en mis -moveViews: método, hago esto:

-(IBAction)moveSceneForPseudo3D:(float)accelerationValue {
    if(fabs(lastAccelerationValue - accelerationValue) > 0.02) { // some little treshold to prevent flickering when it lays on a table
        float viewAccelerationOffset = accelerationValue * 19 * -1;

        newXPos = initialViewOrigin + viewAccelerationOffset;
        myView.frame = CGRectMake(newXPos, myView.frame.origin.y, myView.frame.size.width, myView.frame.size.height);

        lastAccelerationValue = accelerationValue;
    }
}

Como resultado, el dispositivo se excita 90 grados en la radiografía de achsis, o 180 grados, la vista sólo se mueve muy lentamente a su posición de destino. No sé si eso es debido a la física de los acelerómetros, o si se trata de un error en mi código de filtrado. Sólo sé que hay juegos de ritmo rápido donde se utilizan los acelerómetros para la dirección, por lo que casi no puedo imaginar que es un problema de hardware.

¿Fue útil?

Solución

Esta línea:

accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

es un filtro de paso bajo, que funciona mediante el cálculo de una media móvil de la x aceleración. En otras palabras, cada vez que se llama devolución de llamada, que está a sólo mover el accelerationX en un 5% hacia el nuevo valor acelerómetro. Es por eso que se necesita muchas iteraciones antes 0.05 refleja la nueva orientación.

Lo que debe hacer es aumentar el valor 0.2, decir #define. Me gustaría hacer un <=> global y jugar con diferentes valores, junto con diferentes frecuencias de actualización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top