Гироскоп на iPhone

Мне нужна помощь с использованием гироскопа на iPhone. Я могу't понять показания CMAttitude относительно высоты тона, крена и рыскания в конкретной ситуации.

Это мой код

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

Позволять'Предположим, что iPhone лежит на плоскости, как показано на следующем рисунке:

наклон, крен и рыскание (почти) 0 градусов, и любой поворот вокруг оси возвращает понятные показания. Например, если повернуть устройство вправо, рыскание уменьшается, а Pitch and Roll остается равным 0.

Теперь iPhone находится в следующей позиции:

и измерение начинается снова.

Показания: Yaw = 0, Pitch = 90, Roll = 0

Поскольку устройства вращаются вокруг этой оси, шаг увеличивается.

Перемещение iPhone в это положение:

показания: Yaw = 30, Pitch = 90, Roll = 0

Еще раз, поскольку устройство вращается вокруг оси Yaw, это значение изменяется, а остальные нет.

Перемещение устройства вокруг оси крена:

показания: Yaw = 0, Pitch = 90, Roll = -20.

Теперь, что я могуТ понять. Перемещение iPhone по кругу радиуса R (R> 0), как на этом рисунке:

Тяга меняется между тем Pitch and Roll don 'т.

Я бы ожидал, что Йоу остался неизменным, а Ролл изменился.

Как это можно компенсировать, поскольку меня интересуют исключительно вращения вокруг оси Yaw, сделанные пользователем?

Еще одна проблема у меня дрейфует. IPhone находится в положении, описанном на втором рисунке, взятом в руке в покое в течение длительного времени (1 минута и более). Челюсть постоянно увеличивается. Есть идеи, как компенсировать дрейф?

заранее спасибо

ОБНОВИТЬ Я следовал советам Кея, но ничего не изменилось. Еще немного подробностей о моем коде. Я хотел бы использовать Yaw для поворота UIImage только тогда, когда пользователь поворачивает устройство вокруг оси Yaw. Это работает, но когда пользователь вращается вокруг своей вертикальной оси, рыскание изменяется. Я полагаю, что это не правильно, поскольку, когда пользователь перемещается вокруг своей вертикальной оси, устройства невращаться вокруг своей оси Yaw. Может быть, я ошибаюсь. Это мой оригинальный код:

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

Это код после предложения Кей:

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

Я запускаю мониторинг движения устройства с

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос