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