【问题标题】:Eigen: matrix to quaternion and back have different result特征:矩阵到四元数和返回有不同的结果
【发布时间】:2017-05-10 14:53:09
【问题描述】:

我使用 Eigen 库将矩阵转换为四元数,但是当我将其中一个矩阵转换为四元数并将其烧回时,它变成了另一个矩阵,即单位矩阵。我使用的旋转矩阵是从一个变换矩阵分解而来的。

    Eigen::Matrix3f R3d = R.topLeftCorner<3,3>();
    *Rquat = R3d;

    R3d = (*Rquat).normalized().toRotationMatrix();

什么可能导致这个问题? This is the matrix before change to quaternion

This is the matrix when I turn it back form the quaternion

【问题讨论】:

  • 你传递的矩阵是一个反射,所以你不能从中得到一个有效的四元数。不过,您使用的是什么版本的 Eigen?
  • 我正在使用 Eigen 3
  • 那么版本 3.0?这已经被弃用了一段时间......
  • 确保源旋转矩阵是真正的仅旋转矩阵。

标签: matrix eigen quaternions


【解决方案1】:

刚刚检查了Eigen's matrix to quaternion conversion 的实现。它基于 Ken Shoemake 的“四元数微积分和快速动画”。

在分析源代码时可以看到,这假设矩阵确实是一个旋转矩阵(或接近一个)。事实上,所有带有M.trace()&gt;0 的对称矩阵都会产生一个(缩放的)身份四元数。如果您对无效的旋转矩阵有任何期待,您需要实现自己的转换方法。

【讨论】:

    【解决方案2】:

    正如之前的答案和 cmets 所建议的,单位四元数只能表示 3D 旋转矩阵。

    要使矩阵成为旋转矩阵,它必须位于 SO(3),the special orthogonal group,定义为:

    所以你需要检查矩阵乘以它的转置是否等于恒等以及它的行列式是否等于一(而不是减一,否则它只位于orthogonal group,而不是它的子组,特殊正交)。

    此时,用于从矩阵创建四元数的Eigen function 不会检查传递的矩阵是否确实是旋转矩阵。如您所述,可能需要修复或警告,因为这可能导致意外行为。

    我发现自己处于相同的位置,因为我试图从基矩阵的变化(由三个基向量形成)形成一个四元数,并且它仅在所述基是直接基时才有效。如果不是直接的,那么从这个基础到standard basis(反之亦然)的转换不是轮换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多