Giroscópio no iPhone

Preciso de ajuda para usar o giroscópio no iPhone. Não consigo entender as leituras do CMAttitude em relação a pitch, roll e yaw em uma situação particular.

Este é o meu código

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

Vamos supor que o iPhone esteja pousado em um avião, como na figura a seguir:

pitch, roll e yaw são (quase) 0 graus e qualquer volta em torno de um eixo retorna leituras compreensíveis. Por exemplo, girando o dispositivo para a direita, o Yaw diminui e o Pitch and Roll permanece em 0.

Agora o iPhone está na seguinte posição:

e a medição é iniciada novamente.

As leituras são: Yaw = 0, Pitch = 90, Roll = 0

Como os dispositivos giraram em torno desse eixo, o Pitch aumenta.

Movendo o iPhone para esta posição:

as leituras são: Yaw = 30, Pitch = 90, Roll = 0

Mais uma vez, como o dispositivo gira em torno do eixo Yaw, esse valor muda e os outros não.

Movendo o dispositivo ao redor do eixo do rolo:

as leituras são: Yaw = 0, Pitch = 90, Roll = -20.

Agora o que não consigo entender. Movendo o iPhone em torno de um círculo de raio R (R> 0), como nesta figura:

Yaw muda enquanto Pitch and Roll não.

Eu teria esperado que Yaw permanecesse inalterado e Roll tivesse mudado.

Como posso compensar isso, já que estou interessado exclusivamente em rotações em torno do eixo Yaw feitas pelo usuário?

Outro problema que tenho é à deriva. O iPhone está na posição descrita na segunda figura, tomada na minha mão em repouso por um longo tempo (1 minuto ou mais). O guincho constantemente aumenta. Alguma ideia de como compensar a deriva?

Agradeço antecipadamente

ATUALIZAR Eu segui as sugestões de Kay, mas nada muda. Mais alguns detalhes sobre o meu código. Eu gostaria de usar o Yaw para girar um UIImage somente quando o usuário girar o dispositivo ao redor do eixo Yaw. Isso funciona, mas quando o usuário gira em torno de seu próprio eixo vertical, o Yaw muda. Suponho que não esteja correto desde quando o usuário se move em torno de seu eixo vertical, os dispositivos não giram em torno do seu próprio eixo Yaw. Talvez eu esteja errado. Este é o meu código original:

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

Este é o código após a sugestão de 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);
}

Eu começo o monitoramento de movimento do dispositivo com

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

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

questionAnswers(1)

yourAnswerToTheQuestion