如何解决特征四元数,来自列专业与行专业?
我有一个来自第三方的变换矩阵,它描述了一个旋转(作为一个 3x3 矩阵)和一个位置(作为 x、y、z)。
当我提取旋转数据并将其转换为四元数时,我看到了非常奇怪的行为。
矩阵存储为:
double T[3][4];
当我使用:
std::cout << T[0][0] << " " << T[1][0] << " " << T[2][0] << std::endl;
std::cout << T[0][1] << " " << T[1][1] << " " << T[2][1] << std::endl;
std::cout << T[0][2] << " " << T[1][2] << " " << T[2][2] << std::endl;
std::cout << T[0][3] << " " << T[1][3] << " " << T[2][3] << std::endl;
我明白了:
0.22992 -0.66553 -0.710075
0.934688 0.354254 -0.0293813
0.271101 -0.656943 0.703513
9.03845 53.0525 -127.27
到目前为止,一切都很好。好像是列major,最上面的3x3是旋转,最后一行是位置。
我使用以下方法提取位置和旋转:
double camera_position[3] = { T[0][3],T[1][3],T[2][3] };
double camera_rotation[9] = { T[0][0],T[1][0],T[2][0],T[0][1],T[1][1],T[2][1],T[0][2],T[1][2],T[2][2] };
并像这样创建一个四元数:
Eigen::Map<Eigen::Matrix<double,3,Eigen::ColMajor> > M(camera_rotation);
Eigen::Quaterniond quat2(M);
quat2.normalize();
这个四元数是:
QX: 0.207417 QY: 0.323302 QZ: -0.529217 QW: 0.75656
这就是它变得奇怪的地方。我在 3D 视口中显示旋转。当我使用上面的四元数时,它看起来不错,但是 Pitch、Roll 和 Yaw 轴是倒置的(它向上指向哪里应该向下等等)。
当我做我通常会做的事情时,就是这样:
quat2 = quat2.inverse();
或:
quat2.w() = quat2.w() *-1;
3d 显示中的旋转在每个轴上都会发生变化,导致旋转不正确,而不是简单地反转轴。
我在乘以另一个四元数时看到同样的问题,例如当我乘以
Eigen::Quaterniond quat90(0.707,0.707);
我希望它增加 90 度,但是它改变了每个轴,并给出了不正确的结果。
这一切都可以归结为初始旋转矩阵数据吗?我在某处搞砸了列与行专业吗?
我在这里做错了什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。