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?
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
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