Мне нужна помощь с помощью гироскопа на iPhone. Я не могу понять показания 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 градусов, и любой поворот вокруг оси возвращает понятные показания. Например, поворачивая устройство вправо, Yaw уменьшается, а Pitch and Roll остается на 0.
Теперь iPhone находится в следующем положении:
и измерение снова начнется.
Показания: Yaw = 0, Pitch = 90, Roll = 0
Так как устройства повернуты вокруг этой оси, увеличивается Pitch.
Перемещение iPhone в эту позицию:
: Yaw = 30, Pitch = 90, Roll = 0
Опять же, поскольку устройство вращается вокруг оси Yaw, это значение изменяется, а другие нет.
Перемещение устройства вокруг оси Roll:
: Yaw = 0, Pitch = 90, Roll = -20.
Теперь я не могу понять. Перемещение iPhone вокруг круга радиуса R (R > 0), как на этом рисунке:
Изменчивость меняется, пока Pitch и Roll не делают.
Я бы ожидал, что Yaw остался без изменений, и Roll изменился.
Как можно компенсировать это, поскольку меня интересуют исключительно вращения вокруг оси Yaw, сделанные пользователем?
Другая проблема, которую я имею, - это дрейф. IPhone находится в положении, описанном на втором рисунке, которое длительное время удерживается у меня в покое (1 минута или больше). Yaw постоянно увеличивается. Любая идея, как компенсировать дрейф?
Заранее благодарю
UPDATE Я следовал рекомендациям Кей, но ничего не меняется. Еще несколько деталей моего кода. Я хотел бы использовать Yaw для поворота UIImage только тогда, когда пользователь поворачивает устройство вокруг оси Yaw. Это работает, но когда пользователь поворачивается вокруг своей собственной вертикальной оси, изменяется 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);
}
Это код после предложения 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);
}
Я запускаю мониторинг движения устройства с помощью
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error){
[self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];
}];