J'ai besoin d'aide en utilisant le gyroscope de l'iPhone. Je ne peux pas comprendre les lectures de CMAttitude concernant le tangage, le roulis et le lacet dans une situation particulière.
C'est mon code
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
}
Supposons que l'iPhone est posé sur un plan comme dans la figure suivante:
de tangage, de roulis et de lacet sont (presque) 0 degrés et tout en tournant autour d'un axe renvoie compréhensible lectures. Par exemple, en tournant le dispositif de droit, le Lacet diminue et le Tangage et le Roulis reste à 0.
Maintenant que l'iPhone est dans la position suivante:
et la mesure est démarré à nouveau.
Les lectures sont: Lacet = 0, Hauteur = 90, Rouleau = 0
Depuis les dispositifs mis en rotation autour de cet axe, la Hauteur augmente.
Déplacement de l'iPhone dans cette position:
les lectures sont: Lacet = 30, Hauteur = 90, Rouleau = 0
Une fois de plus, puisque l'appareil pivote autour de l'axe de Lacet, cette valeur change et les autres ne sont pas.
Déplacement de l'appareil autour de l'axe de Roulis:
les lectures sont: Lacet = 0, Hauteur = 90, Rouleau = -20.
Maintenant, ce que je ne comprends pas. Déplacement de l'iPhone autour d'un cercle de rayon R (R > 0), comme sur la figure suivante:
Lacet change en attendant de Tangage et de Roulis n'est pas.
Je me serais attendu à Lacet est resté inchangé et Rouler avait changé.
Comment peut compenser ce depuis que je m'intéresse exclusivement à des rotations autour de l'axe de Lacet faite par l'utilisateur ?
Un autre problème que j'ai est à la dérive. L'iPhone est dans la position décrite dans la deuxième figure, pris dans ma main au repos pendant une longue période (1 minute ou plus). Le Lacet en constante augmentation. Une idée de comment compenser la dérive ?
Je vous remercie à l'avance
Mise à JOUR J'ai suivi Kay suggestions, mais rien ne change. Plus de détails sur mon code. Je voudrais utiliser un mouvement de Lacet de rotation d'une UIImage uniquement lorsque l'utilisateur de faire tourner l'appareil autour de l'axe de Lacet. Cela fonctionne, mais lorsque l'utilisateur tourne autour de son propre axe vertical le Lacet change. Je suppose que c'est pas correcte, car lorsque l'utilisateur se déplace autour de son axe vertical, les appareils ne tourne pas autour de son axe de Lacet. Peut-être que je me trompe. C'est mon code d'origine:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
C'est le code après Kay suggestion:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
if (startAttitude == 0) {
startAttitude = attitude;
}
[attitude multiplyByInverseOfAttitude:startAttitude];
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
Je commence appareil de contrôle de mouvement avec
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error){
[self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];
}];