получить шаг, рыскать, катиться из CMRotationMatrix - PullRequest
8 голосов
/ 28 февраля 2012

У меня есть гниль CMRotationMatrix *, и я хотел бы получить шаг, рыскание, крен от матрицы. Есть идеи, как мне это сделать?

Спасибо

Ответы [ 3 ]

24 голосов
/ 12 сентября 2013

Лучше использовать кватернионы, чем углы Эйлера .... Значения крена, тангажа и рыскания могут быть получены из кватерниона с использованием следующих формул:

roll  = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z)
pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z)
yaw   =  asin(2*x*y + 2*z*w)

Может быть реализовано как:

CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));

где radianstoDegrees - это директива препроцессора, реализованная как:

#define radiansToDegrees(x) (180/M_PI)*x

Это делается для преобразования значений радиан, заданных формулами, в градусы.

Более подробную информацию о конвертации можно найти здесь: tinkerforge и здесь: Преобразование между кватернионами и углами Эйлера .

1 голос
/ 28 февраля 2012

тангаж, рыскание, крен от матрицы. Есть идеи, как мне это сделать?

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

Моя личная рекомендация: вообще не использовать углы Эйлера, они просто требуют (численных) неприятностей. Используйте матрицу (вы уже делаете) или кватернион.

0 голосов
/ 02 мая 2012

Сам выяснил:

CMAttitude *currentAttitude = motionManager.deviceMotion.attitude;    

        if (currentAttitude == nil)
        {
            NSLog(@"Could not get device orientation.");
            return;
        }
        else {
            float PI = 3.14159265;
            float yaw = currentAttitude.yaw * 180/PI;
            float pitch = currentAttitude.pitch * 180/PI;
            float roll = currentAttitude.roll * 180/PI;

        }
...