2012-09-10 3 views
3

J'essaie de mesurer la distance à laquelle un appareil glisse à l'aide de l'accéléromètre. Voilà comment je fais:Distance de glissement iOS avec accéléromètre

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    CGFloat interval = [NSDate timeIntervalSinceReferenceDate] - lastTime; 

    CGFloat velocity = ((acceleration.y + lastAcceleration)/2) * interval * 9.8 + lastVelocity; 

    totalDistance += velocity * interval; 

    lastAcceleration = acceleration.y; 
    lastVelocity = velocity; 

    lastTime = [NSDate timeIntervalSinceReferenceDate]; 
} 

Les résultats sont extrêmement erratiques, allant +/- 30% de la valeur réelle. Mes calculs sont-ils corrects, et si oui, comment puis-je rendre ce code plus précis?

+0

Avez-vous envisagé que le frottement le long d'une surface provoque des vibrations pour modifier les valeurs de capteur se déplace alors qu'il se déplaçant dans l'air est une transition beaucoup plus douce? Ce que vous essayez de faire est l'un des problèmes les plus difficiles dans la détection de mouvement et sans un moyen de réorienter la distance estimée parcourue au fil du temps sera de pire en pire. – FaultyJuggler

+0

On dirait que vous essayez de faire [l'infâme double-intégrale] (http://stackoverflow.com/a/7835988/341970). Je suis surpris que vous ayez seulement 30% d'erreur. – Ali

+0

Hmmm ... donc ce que vous dites est que ce n'est pas possible avec le matériel actuel de l'iPhone? –

Répondre

0

Vous pouvez vous débarrasser de certaines des inexactitudes du matériel en appliquant un filtre sur les résultats.

Voici une bibliothèque pour faire une transformation rapide de Fourier sur les valeurs.

http://sourceforge.net/projects/kissfft/

Questions connexes