IPhone-гироскоп - почему YAW и PITCH связаны?

У меня очень простое приложение, в котором я пытаюсь использовать гироскоп через основное движение.

В этот момент, для целей тестирования, я просто хватаю значения рулона, высоты тона и рыскания и печати на экране. Согласно приведенной ниже картинке и насколько я знаю, рулон, подача и рыскание соответствуют красной, зеленой и синей оси, верно?

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


}

enter image description here

Ответы

Ответ 1

Посмотрите мой вопрос и выбранный ответ для получения дополнительной информации об этом. Я думаю, что ответ, в частности, говорит вам, почему эти два связаны.

Ответ 2

Звучит как проблема, связанная с Gimbal Lock, особенно при работе с поворотами шага. Вы можете взглянуть на iPhone - понимание поворота iPhone

Gimbal Lock или подобные статьи описывают явление. Решение зависит от того, что вам нужно в вашем приложении. В большинстве случаев вам следует избегать использования углов Эйлера и вместо этого принимать матрицу вращения или кватернион. ОК, я знаю, это иногда невозможно. Хорошим моментом для начала может быть пример движения ядра чайника WWDC 2010.