Ответ 1
Посмотрите мой вопрос и выбранный ответ для получения дополнительной информации об этом. Я думаю, что ответ, в частности, говорит вам, почему эти два связаны.
У меня очень простое приложение, в котором я пытаюсь использовать гироскоп через основное движение.
В этот момент, для целей тестирования, я просто хватаю значения рулона, высоты тона и рыскания и печати на экране. Согласно приведенной ниже картинке и насколько я знаю, рулон, подача и рыскание соответствуют красной, зеленой и синей оси, верно?
OK. Когда я кладу iphone на стол, лежащий на его левой стороне (главная кнопка справа), отлично на 90 градусов относительно плоскости стола, это значения, которые я читаю для рулона, высоты тона и рыскания: -90, 0, 0. Затем я начинаю поворачивать iPhone в соответствии с вертикальной осью стола против часовой стрелки, которая будет находиться в положительном направлении в соответствии с вертикальной осью стола. На iPhone это будет означать поворот шага, но по мере поворота шаг остается постоянным, и YAW - это тот, который меняет!!!!!
Если iPhone стоит на левой стороне стола, зеленая ось (шаг) является вертикальной. Если я вращаю устройство против часовой стрелки (положительное) на X, я должен увидеть увеличение угла тангажа, а не рыскания.
Единственное объяснение, которое у меня есть для этого, - ось вращения гироскопа не вращается при повороте устройства. Итак, если я использую ссылку на отношения по умолчанию, iPhone считает, что позиция покоя вверх по умолчанию является по умолчанию, а синяя ось (рыскание) всегда будет вертикальной. Правильно ли это?
Это код, который я использую...
в главном коде
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0/60.0; //60 Hz
[motionManager startDeviceMotionUpdates];
timer = [[NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
target:self
selector:@selector( readIt )
userInfo:nil
repeats:YES]
retain];
оставшийся код
#define degrees(x) (180.0 * x / M_PI)
- (void) readIt {
// CMAttitude *referenceAttitude;
CMAttitude *attitude;
CMDeviceMotion *motion = motionManager.deviceMotion;
if (!motion) {
return;
}
attitude = motion.attitude;
NSLog(@"roll = %f... pitch = %f ... yaw = %f", degrees(attitude.roll), degrees(attitude.pitch), degrees(attitude.yaw));
}
Посмотрите мой вопрос и выбранный ответ для получения дополнительной информации об этом. Я думаю, что ответ, в частности, говорит вам, почему эти два связаны.
Звучит как проблема, связанная с Gimbal Lock, особенно при работе с поворотами шага. Вы можете взглянуть на iPhone - понимание поворота iPhone
Gimbal Lock или подобные статьи описывают явление. Решение зависит от того, что вам нужно в вашем приложении. В большинстве случаев вам следует избегать использования углов Эйлера и вместо этого принимать матрицу вращения или кватернион. ОК, я знаю, это иногда невозможно. Хорошим моментом для начала может быть пример движения ядра чайника WWDC 2010.