Gyroscope auf dem iPhone

Ich benötige Hilfe bei der Verwendung des Gyroskops auf dem iPhone. Ich kann die Messwerte von CMAttitude in Bezug auf Neigen, Rollen und Gieren in einer bestimmten Situation nicht verstehen.

Das ist mein Code

- (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);
}

Angenommen, das iPhone legt sich in ein Flugzeug wie in der folgenden Abbildung:

Pitch, Roll und Yaw sind (fast) 0 Grad und jede Drehung um eine Achse liefert verständliche Messwerte. Wenn Sie beispielsweise das Gerät nach rechts drehen, verringert sich das Gieren und Pitch and Roll bleibt auf 0.

Jetzt befindet sich das iPhone in der folgenden Position:

und die Messung wird erneut gestartet.

Ablesungen sind: Gieren = 0, Neigen = 90, Rollen = 0

Da sich die Geräte um diese Achse drehen, erhöht sich die Tonhöhe.

Bewegen Sie das iPhone in diese Position:

Ablesungen sind: Gieren = 30, Neigen = 90, Rollen = 0

Da sich das Gerät wieder um die Gierachse dreht, ändert sich dieser Wert und die anderen nicht.

Bewegen des Geräts um die Rollachse:

Ablesungen sind: Gieren = 0, Neigen = 90, Rollen = -20.

Nun, was ich nicht verstehen kann. Bewegen Sie das iPhone um einen Kreis mit dem Radius R (R> 0), wie in der folgenden Abbildung dargestellt:

Gieren ändert sich während Pitch and Roll nicht.

Ich hätte erwartet, dass Yaw unverändert geblieben war und Roll sich verändert hatte.

Wie kann ich das ausgleichen, da ich mich ausschließlich für vom Benutzer vorgenommene Rotationen um die Gierachse interessiere?

Ein anderes Problem, das ich habe, driftet. Das iPhone befindet sich in der in der zweiten Abbildung beschriebenen Position und wurde für eine lange Zeit (1 Minute oder länger) in meiner Hand gehalten. Das Gieren nimmt ständig zu. Irgendeine Idee, wie man das Treiben kompensiert?

Danke im Voraus

AKTUALISIEREN Ich bin Kay Vorschlägen gefolgt, aber nichts hat sich geändert. Noch ein paar Details zu meinem Code. Ich möchte Yaw nur verwenden, um ein UIImage zu drehen, wenn der Benutzer das Gerät um die Yaw-Achse dreht. Dies funktioniert, aber wenn sich der Benutzer um seine eigene vertikale Achse dreht, ändert sich die Gier. Ich nehme an, dass dies nicht korrekt ist, da sich die Geräte nicht um ihre eigene Gierachse drehen, wenn sich der Benutzer um ihre vertikale Achse bewegt. Vielleicht irre ich mich. Dies ist mein ursprünglicher Code:

- (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);
}

Dies ist der Code nach Kay Vorschlag:

- (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);
}

Ich starte die Bewegungsüberwachung mit

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

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage