2011-06-12 3 views
0

Je commence à jouer avec Core Motion et j'ai rencontré un problème et je n'arrive pas à comprendre ce qui se passe. Je suis sûr que ce sera une question simple. Voici le code:Problèmes avec CMDeviceMotion avec multiplyByInverseOfAttitude

.h

#import <UIKit/UIKit.h> 
#import <CoreMotion/CoreMotion.h> 

@interface TempVC : UIViewController { 
CMMotionManager *motionManager; 
CMAttitude *referenceAttitude; 
CMAttitude *attitude; 
} 
- (void)updateData; 
@end 

fichier .m

#import "TempVC.h" 
#define DEGREES(radians) (radians/M_PI * 180.0) 
@implementation TempVC 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.view.backgroundColor = [UIColor brownColor]; 

motionManager = [[CMMotionManager alloc] init]; 
referenceAttitude = nil; 

CMDeviceMotion *dm = motionManager.deviceMotion; 
attitude = dm.attitude; 
referenceAttitude = [attitude retain]; 

motionManager.deviceMotionUpdateInterval = 0.1; 
[motionManager startDeviceMotionUpdates]; 

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateData) userInfo:nil repeats:YES]; 

} 

- (void)updateData 
{ 
attitude = motionManager.deviceMotion.attitude; 
[attitude multiplyByInverseOfAttitude:referenceAttitude]; 
NSLog(@"\n Roll: %.0f\n Pitch: %.0f\n Yaw: %.0f",DEGREES(attitude.roll), DEGREES(attitude.pitch), DEGREES(attitude.yaw)); 
} 

Ce code se bloque sans indication réelle de ce qui se passe mal. Si je commente

[attitude multiplyByInverseOfAttitude:referenceAttitude]; 

Tout fonctionne bien ??? Ai-je mis en place la référence erronée?

Répondre

2

Vous accédez à la propriété deviceMotion de CMMotionManager avant de lancer les mises à jour. Là, vous stockez votre référence, qui sera toujours nulle à ce moment-là. Lorsque updateData est appelé quelques millis plus tard [attitude multiplyByInverseOfAttitude:referenceAttitude]; échouera. Essayez plutôt de définir l'attribut referenceAttitude sur le premier appel de updateData et cela devrait fonctionner.

+0

J'ai suivi votre conseil et ajouté if (referenceAttitude == nil) {referenceAttitude = [attitude retain]; } et l'a enlevé de viewDidLoad mais cela n'a fait aucune différence ???? C'est étrange, je suis sûr que ce code devrait fonctionner. Merci pour l'essai :) – EcksMedia

+0

Existe-t-il un autre endroit où referenceAttitude est utilisé? Essayez de définir un point d'arrêt dans updateData à ivnestigate s'il s'agit du premier, du deuxième ou du nième appel. Peut-être que CMAttitude n'aime pas qu'il soit multiplié avec lui-même? Essayez de placer le multiplyBIOA dans le bloc else de if (referenceAttitude == nil) – Kay