Вращайте кватернион с углами Эйлера, используя Eigen

Я пытаюсь создать кватернион, повернуть его вокруг углов Эйлера и преобразовать обратно в углы Эйлера. Я использую Eigen. Преобразование из Euler в Quaternion и наоборот работает нормально, но когда я вращаюсь вокруг, используя Angle Axis, мои значения составляют примерно 20 — 50%. Например, когда я пытаюсь повернуть от 0,0,0 до 90,50,60, я получаю x: 75,5 y: 103,13, z: 78,46.
Есть идеи, где я поверну не туда? Я использую соглашение 102 / YXZ.
Я попытался реализовать это, как описано здесь: Повернуть кватернион по входным значениям углов Эйлера.

  Vector3f retVector;
Matrix3f rotFromMat, qautRotMatrix;

const auto fromPitch = xFrom*M_PI/360;
const auto fromYaw = zFrom*M_PI / 360;
const auto fromRoll = yFrom*M_PI / 360;rotFromMat = AngleAxisf(fromRoll,  Vector3f::UnitY())
* AngleAxisf(fromPitch, Vector3f::UnitX())
* AngleAxisf(fromYaw,   Vector3f::UnitZ());
Quaternionf fromQuat(rotFromMat);

fromQuat.normalize();

fromQuat = fromQuat * AngleAxisf(yTo, Vector3f::UnitY());
fromQuat = fromQuat * AngleAxisf(xTo, Vector3f::UnitX());
fromQuat = fromQuat * AngleAxisf(zTo, Vector3f::UnitZ());qautRotMatrix = fromQuat.toRotationMatrix();

retVector = quatRotMatrix.eulerAngles(1, 0, 2);
retVector *= 360 / M_PI;

return retVector;

2

Решение

Вы не дали достаточно подробностей о том, как воспроизвести это.

Но я могу сказать, вижу две ошибки:
* Соотношение между градусами и радианами составляет 180 / PI, а не 360 / PI.
* Ваш порядок вращения неправильный! Левая сторона вращается правой стороной:

fromQuat = AngleAxisf(...) * fromQuat;

С даты, которую я могу догадаться, вы уже решили эту проблему, я комментирую здесь для новых зрителей

1

Другие решения


По вопросам рекламы [email protected]