2011-10-27 5 views
6

sto provando le nuove funzionalità di CoreMotion, soprattutto la possibilità di impostare il frame di riferimento, ma se utilizzo un DeviceMotionHandler e il frame di riferimento impostato su CMAttitudeReferenceFrameXTrueNorthZVertical l'output è alcuni di CMAttitudeReferenceFrameXArbitraryCorrectedZVertical. avvio l'app con l'iphone sempre nella stessa rotazione di imbardata rispetto alla mia scrivania, e provo diverse rotazioni di imbardata iniziale, ma il risultato è sempre lo stesso.CoreMotion L'atteggiamento di iOS 5 con frame di riferimento non funziona

motionManager = [[CMMotionManager alloc] init]; 
motionManager.showsDeviceMovementDisplay = YES; 
motionManager.deviceMotionUpdateInterval = 1.0/60.0;  

CMDeviceMotionHandler motionHandler =^(CMDeviceMotion *motion, NSError *error) { 
    NSLog(@"%f  %f   %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw); 
}; 

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler]; 

ho trovato la soluzione del mio problema, ma non riesco a capire perché il codice precedente non funziona. Aggiungo solo una variabile CMAttitude * a in motionHandler.

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
motionManager = [[CMMotionManager alloc] init]; 
motionManager.showsDeviceMovementDisplay = YES; 
motionManager.deviceMotionUpdateInterval = 1.0/60.0;  

CMDeviceMotionHandler motionHandler =^(CMDeviceMotion *motion, NSError *error) { 
    CMAttitude *a = motionManager.deviceMotion.attitude; 
    labelAngle.text = [NSString stringWithFormat:@"%f  %f   %f",a.pitch, a.roll,a.yaw]; 
    labelAngle2.text = [NSString stringWithFormat:@"%f  %f  %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw]; 
}; 

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];} 
+0

Vedo lo stesso comportamento. L'atteggiamento nel parametro di movimento che viene passato al blocco sembra essere l'atteggiamento "normale", mentre l'atteggiamento nella proprietà deviceMotion sembra essere compensato con il frame di riferimento. Mi chiedo se questo sia un bug, o se posso fare affidamento su questo comportamento, in quanto è abbastanza utile. La combinazione dei due rende possibile compensare il comportamento magnetico eccentrico di iPhone con una direzione stabile del giroscopio. – fishinear

+0

Ho segnalato questo come un bug verso Apple: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/1sukWbI5nvOZQ2Y6MPBXnw/14.66 – fishinear

risposta

0

penso che questo è dovuto al fatto .. se si definisce il gestore prima, la proprietà atteggiamento del vostro oggetto di movimento è già stata impostata al valore di default. Più tardi nel tuo codice questa proprietà attitudine diventa di sola lettura. Quindi, quando avvii gli aggiornamenti di movimento con questo gestore, la proprietà attitudinale del movimento non può più essere modificata. Ma la proprietà attitude di motionManager.deviceMotion è impostata su qualsiasi cosa specificata in startDeviceMotionUpdatesUsingReferenceFrame e viene letto nell'oggetto quando si avviano gli aggiornamenti di movimento con startDeviceMotionUpdatesUsingReferenceFrame. L'oggetto ha ora l'atteggiamento corretto, mentre l'oggetto movimento ha l'atteggiamento predefinito.

+0

provo a definire motionHandler all'interno del metodo startDeviceMotionUpdatesUsingReferenceFrame, ma il risultato è sempre lo stesso. '[MotionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXTrueNorthZVertical toQueue: [NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * movimento, NSError * errore) { CMAttitude * test = motion.testAttitude; labelAncle4.text = [NSString stringWithFormat: @ "% f% f% f", radiansToDegree (test.pitch), radiansToDegree (test.roll), radiansToDegree (test.yaw)]; }]; ' – Batti

+0

È ovvio che la mia precedente risposta non è corretta. È anche ovvio che queste due istanze di CMDeviceMotion non sono le stesse. Il frame di riferimento appartiene ovviamente all'oggetto CMDeviceMotionMananger.deviceMotion e non all'oggetto CMDeviceMotion specificato nel gestore. È forse un bug? – janBP

+0

Un oggetto CMDeviceMotion non ha alcun atteggiamentoReferenceFrame stesso. Un attitudeReferenceFrame è una proprietà di un oggetto CMMotionManager. Ho davvero pensato che il puntatore ai gestori dell'oggetto CMDeviceMotion fosse un puntatore alla proprietà DeviceMotion di CMMotionManagers. Ovviamente non lo è, ma piuttosto un puntatore ai dati prima di ogni riferimento. – janBP

Problemi correlati