四元数的微小变化-巨大的欧拉角跳变

时间:2018-09-12 09:38:10

标签: eigen quaternions euler-angles

我有一系列摄像机姿态,并且想要计算从上一个摄像机姿态到当前摄像机姿态的角度变化(俯仰,偏航,横滚)。作为输入,我有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
----------
...

0 个答案:

没有答案