Żyroskop na iPhone

Potrzebuję pomocy przy użyciu żyroskopu na iPhonie. Nie rozumiem odczytów z CMAttitude dotyczących wysokości, przechylenia i odchylenia w konkretnej sytuacji.

To jest mój kod

- (void)handleDeviceMotion:(CMDeviceMotion*)motion {

   NSLog(@"Yaw   %f ",attitude.yaw * 180 / M_PI);
   NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
   NSLog(@"Roll  %f ",attitude.roll * 180 / M_PI);
}

Załóżmy, że iPhone kładzie się na płaszczyźnie, jak na poniższym rysunku:

pitch, roll i yaw są (prawie) 0 stopni, a każdy obrót wokół osi zwraca zrozumiałe odczyty. Na przykład, przekręcając urządzenie w prawo, Yaw zmniejsza się, a Pitch and Roll pozostaje na 0.

Teraz iPhone znajduje się w następującej pozycji:

i pomiar rozpoczyna się ponownie.

Odczyty to: Yaw = 0, Pitch = 90, Roll = 0

Ponieważ urządzenia obracały się wokół tej osi, Pitch wzrasta.

Przenoszenie iPhone'a na tę pozycję:

odczyty to: Yaw = 30, Pitch = 90, Roll = 0

Ponownie, ponieważ urządzenie obraca się wokół osi Yaw, ta wartość zmienia się, a inne nie.

Przesuwanie urządzenia wokół osi rolki:

Odczyty: Yaw = 0, Pitch = 90, Roll = -20.

Teraz czego nie mogę zrozumieć. Przemieszczanie iPhone'a wokół okręgu o promieniu R (R> 0), jak na tym rysunku:

Zmiany odchylenia w międzyczasie nie zmieniają się.

Spodziewałbym się, że Yaw pozostanie niezmieniona, a Roll się zmienił.

Jak to zrekompensować, ponieważ interesują mnie wyłącznie obroty wokół osi Yaw wykonane przez użytkownika?

Kolejny problem, jaki mam, to dryfowanie. IPhone znajduje się w pozycji opisanej na drugim rysunku, wziętej w ręku w spoczynku przez długi czas (1 minuta lub dłużej). Yaw stale rośnie. Masz pomysł, jak zrekompensować dryfowanie?

Z góry dziękuję

AKTUALIZACJA Śledziłem sugestie Kaya, ale nic się nie zmienia. Więcej szczegółów na temat mojego kodu. Chciałbym użyć Yaw do obracania UIImage tylko wtedy, gdy użytkownik obróci urządzenie wokół osi Yaw. Działa to, ale gdy użytkownik obraca się wokół własnej osi pionowej, zmienia się Yaw. Przypuszczam, że nie jest to poprawne, ponieważ gdy użytkownik porusza się wokół swojej osi pionowej, urządzenia nie obracają się wokół własnej osi odchylenia. Może się mylę. To jest mój oryginalny kod:

- (void)handleDeviceMotion:(CMDeviceMotion*)motion { 

   CMAttitude      *attitude = motion.attitude;

   NSLog(@"Yaw   %f ",attitude.yaw * 180 / M_PI);
   NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
   NSLog(@"Roll  %f ",attitude.roll * 180 / M_PI);

   image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}

Oto kod po sugestii Kay:

- (void)handleDeviceMotion:(CMDeviceMotion*)motion { 

   CMAttitude      *attitude = motion.attitude;        

   if (startAttitude == 0) {

      startAttitude = attitude;
   }

   [attitude multiplyByInverseOfAttitude:startAttitude];

   NSLog(@"Yaw   %f ",attitude.yaw * 180 / M_PI);
   NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
   NSLog(@"Roll  %f ",attitude.roll * 180 / M_PI);


   image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}

Rozpoczynam monitorowanie ruchu urządzenia za pomocą

 [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue]
                                                           withHandler: ^(CMDeviceMotion *motion, NSError *error){

                                                               [self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];
                                                           }];

questionAnswers(1)

yourAnswerToTheQuestion