problemi CMDeviceMotion con multiplyByInverseOfAttitude
-
27-10-2019 - |
Domanda
sto avendo la mia prima commedia in giro con nucleo di movimento ed ho colpito un problema e non riesco a capire cosa sta succedendo. Sono sicuro che sarà una questione semplice. Ecco il codice:
file h
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface TempVC : UIViewController {
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
CMAttitude *attitude;
}
- (void)updateData;
@end
file .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));
}
Questo codice andrà in crash senza una reale indicazione di ciò che va male. Se io commento
[attitude multiplyByInverseOfAttitude:referenceAttitude];
Tutto funziona bene ??? Ho ho implementato il torto di riferimento?
Soluzione
accedere alla proprietà deviceMotion di CMMotionManager prima di iniziare gli aggiornamenti. Ci si memorizza il referenceAttitude che sarà comunque pari a zero in quel momento. Quando viene chiamato UpdateData pochi millisecondi dopo [attitude multiplyByInverseOfAttitude:referenceAttitude];
fallirà.
Prova invece per impostare il referenceAttitude in prima convocazione di UpdateData e dovrebbe funzionare.