Гироскоп на iPhone
Мне нужна помощь с использованием гироскопа на 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 градусов, и любой поворот вокруг оси возвращает понятные показания. Например, если повернуть устройство вправо, рыскание уменьшается, а 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 - нет.
Я бы ожидал, что Йоу остался неизменным, а Ролл изменился.
Как это можно компенсировать, поскольку меня интересуют исключительно вращения вокруг оси 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];
}];