2011-10-27 10 views
6

Próbuję nowych funkcji CoreMotion, przede wszystkim możliwość ustawienia ramki odniesienia, ale jeśli używam DeviceMotionHandler i ramka odniesienia ustawiona na CMAttitudeReferenceFrameXTrueNorthZVertical, wyjście jest niektóre z CMAttitudeReferenceFrameXArbitraryCorrectedZVertical. Uruchamiam aplikację z iPhonem zawsze w tej samej rotacji odchylenia, szanuję moje biurko i testuję różne początkowe odchylenia, ale wynik jest zawsze taki sam.Ustawienie CoreMotion iOS 5 z ramką odniesienia nie działa

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]; 

znalazłem rozwiązanie mojego problemu, ale nie mogę zrozumieć, dlaczego poprzedni kod nie działa. Dodaję tylko zmienną CMAttitude * a w 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

Widzę to samo zachowanie. Postawa w parametrze ruchu przekazywana do bloku wydaje się być postawą "normalną", podczas gdy postawa w właściwości deviceMotion wydaje się być kompensowana ramką odniesienia. Zastanawiam się, czy jest to błąd, czy mogę polegać na tym zachowaniu, ponieważ jest całkiem użyteczny. Połączenie tych dwóch elementów pozwala zrekompensować dziwne zachowanie magnetyczne iPhone'a ze stabilnym kierunkiem pochylenia żyroskopu. – fishinear

+0

Zgłaszałem to jako błąd w stosunku do Apple: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/1sukWbI5nvOZQ2Y6MPBXnw/14.66 – fishinear

Odpowiedz

0

Myślę, że to dlatego, że .. jeśli najpierw zdefiniować obsługi, właściwość postawa Twojego obiektu ruchu został już ustawiony na wartość domyślną. Później we własnym kodzie ta właściwość postawy staje się tylko do odczytu. Tak więc, po uruchomieniu aktualizacji ruchu z tym handler'em właściwość położenia ruchu nie może już być zmieniana. Ale właściwość position obiektu motionManager.deviceMotion jest ustawiona na dowolną wartość określoną w pliku startDeviceMotionUpdatesUsingReferenceFrame i jest ona odczytywana do obiektu po uruchomieniu aktualizacji ruchu za pomocą komendy startDeviceMotionUpdatesUsingReferenceFrame. Obiekt ma teraz prawidłową postawę, podczas gdy obiekt ruchu ma domyślną postawę.

+0

Próbuję zdefiniować motionHandler wewnątrz metody startDeviceMotionUpdatesUsingReferenceFrame, ale wynik jest zawsze taki sam. '[motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXTrueNorthZVertical toQueue: [NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * motion, NSError * error) { CMAttitude * test = motion.testAttitude; labelAncle4.text = [NSString stringWithFormat: @ "% f% f% f", radiansToDegree (test.pitch), radiansToDegree (test.roll), radiansToDegree (test.yaw)]; }]; ' – Batti

+0

Jest oczywiste, że moja poprzednia odpowiedź jest nieprawidłowa. Oczywiste jest również, że te dwie instancje CMDeviceMotion nie są takie same. Ramka odniesienia oczywiście należy do obiektu CMDeviceMotionMananger.deviceMotion, a nie do obiektu CMDeviceMotion określonego w procedurze obsługi. Czy to może być błąd? – janBP

+0

Obiekt CMDeviceMotion nie ma żadnej wartości positionReferenceFrame. Właściwość attitudeReferenceFrame jest właściwością obiektu CMMotionManager. Naprawdę sądziłem, że wskaźnik obsługi do obiektu CMDeviceMotion był wskaźnikiem do właściwości urządzenia CMMotionManagers. Oczywiście nie jest, ale raczej wskaźnik do danych przed jakąkolwiek ramką odniesienia. – janBP

Powiązane problemy