Небольшие изменения в кватернионе - огромные скачки угла Эйлера - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть последовательность поз камеры, и я хочу вычислить угловое изменение (шаг, рыскание, крен) от предыдущей позы камеры к текущей. В качестве входных данных у меня есть 3x3 матрицы вращения.

Когда я запускаю следующий код, он работает 90% времени, но в некоторых случаях - как в примере ниже - углы Эйлера выглядят странно, несмотря на очень небольшие изменения в кватернионе: они прыгают от 0 до значения около PI, которые могут быть все еще правильными, но я не могу вычислить мои соответствующие углы, так как я не спонтанно перевернул камеру с помощью PI. Есть ли лучший способ?

Код (цикл, пропущенная первая итерация)

std::cout << "----------\n";
std::cout << "R:\n" << R << std::endl;
Eigen::Quaternionf newQ(R);
Eigen::Quaternionf deltaQ = previousQ.conjugate()*newQ;
previousQ = newQ;
std::cout << "deltaQ:\nw = " << deltaQ.w() << "\nx = " << deltaQ.x() << "\ny = " << deltaQ.y() << "\nz = " << deltaQ.z() << std::endl;
std::cout << "Euler:\n" << deltaQ.toRotationMatrix().eulerAngles(0, 1, 2) << std::endl;

Журнал консоли

...
----------
R:
0.977515  -0.0134678    0.210437
0.0123623    0.999902  0.00656816
-0.210505 -0.00381899    0.977585
deltaQ:
w = 0.999747
x = 0.000164772
y = 0.022509
z = -0.000187157
Euler:
 0.000338229
   0.0450218
-0.000382023
----------
R:
   0.966075  -0.0153634    0.257802
  0.0136485    0.999871   0.0084406
  -0.257899 -0.00463564    0.966161
deltaQ:
w = 0.999702
x = -0.000619047
y = 0.0243718
z = 0.000825906
Euler:
 3.14031
 3.09285
-3.13991
----------
...
...