2010-08-15 5 views
0

Je travaille sur une application qui doit détecter un mouvement de rotation de l'iPhone. J'ai écrit un code qui interroge CMMotionManager pour les données de rotation, mais pour une raison quelconque, ces valeurs changent constamment même si le téléphone est stationnaire sur la table. Je ne suis pas sûr de ce que je fais mal ici. J'ai consulté les docs d'Apple et il semble que je fasse ce qu'ils suggèrent, et la chose fonctionne sans s'écraser, mais les chiffres qui sortent n'ont aucun sens. Voici ce que je fais:Avoir un problème avec la rotation du gyroscope Core Motion

-(void)startDetectingMotion { 

if (!motionQueue){ 
    motionQueue = [[NSOperationQueue mainQueue] retain]; 
} 

if (motionManager.isDeviceMotionAvailable) { 

    CMDeviceMotionHandler motionHandler =^(CMDeviceMotion *motion, NSError *error) { 
    [self processMotion:motion withError:error]; 
}; 


[motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:motionHandler]; 

} 
else { 
    NSLog(@"motion not available"); 
} 

} 

.....

-(void)processMotion:(CMDeviceMotion *)motion withError:(NSError *)error { 

CMRotationRate rotation = motion.rotationRate; 
if(rotation.y > 2 || rotation.y < -2) { 
    NSLog(@"CM Motion X rotation:%f, Y rotation:%f, Z Rotation:%f", rotation.x, rotation.y, rotation.y); 
    .... 

    [self stopDetectingMotion]; 

} 
} 

Le point de piégeage pour y> 2 ou < 2 est de chercher une rotation rapide de l'iPhone sur un plan horizontal , c'est ce que je cherche.

La sortie se présente comme suit:

15/08/2010 16: 15: 43,475 PokerFoldTest [539: 307] rotation CM X Mouvement: rotation 11,415660, Y: 7,865920, Z Rotation: 7,865920

2010-08-15 16: 04: 33.843 PokerFoldTest [539: 307] Rotation CM Motion X: 8.925084, rotation Y: 8.414384, rotation Z: 8.414384

2010-08-15 16: 11: 14.314 PokerFoldTest [539: 307] Rotation CM Motion X: 10.245130, rotation Y: -8.243847, rotation Z: -8.243847

2 010-08-15 16: 11: 16.136 PokerFoldTest [539: 307] Rotation CM Motion X: 10.212860, rotation Y: -4.303616, Z Rotation: -4.303616

2010-08-15 16: 11: 18.242 PokerFoldTest [ 539: 307] rotation CM Motion X: 9.988654, rotation Y: -7.074587, rotation Z: -7.074587

2010-08-15 16: 11: 19.678 PokerFoldTest [539: 307] Rotation CM Motion X: 16.092894, Y rotation: -10,562743, Z rotation: -10,562743

2010-08-15 16: 15: 41,662 PokerFoldTest [539: 307] rotation CM X Mouvement: 12,854285, rotation Y: 7,247667, Z rotation: 7,247667

Comme ces chiffres sont suppo sed à être radians/sec rotation, ils suggèrent que lorsque le téléphone est à l'arrêt sur la table, il tourne follement. Que se passe-t-il? Une chance que mon téléphone ait un mauvais gyroscope?

Répondre

1
  • Vérifiez que motion n'est pas nul (et que error est nul). Vous obtenez des données parasites si vous appelez la méthode struct-return sur zéro.
  • Vous imprimez uniquement les valeurs extrêmes (il semble que vous en receviez une toutes les quelques secondes, alors que le taux de mise à jour devrait être beaucoup plus élevé). Si vous imprimez toutes les mises à jour, vous aurez peut-être une meilleure idée de ce qui se passe.
+0

Curieusement, les choses fonctionnent maintenant. Je ne suis même pas sûr de ce que j'ai changé pour que ça marche, mais maintenant ça marche. Toutes les valeurs de rotation sont maintenant autour de 0 sauf si je lui donne un bon flip. – fogelbaby