特征四元数,来自列专业与行专业?

问题描述

我有一个来自第三方的变换矩阵,它描述了一个旋转(作为一个 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...