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