【问题标题】:Matrix to EulerAnglesEulerAngles 矩阵
【发布时间】:2012-06-23 15:42:02
【问题描述】:

我正在尝试从旋转矩阵中提取欧拉角。 我的约定: 矩阵列主要,右手坐标系,右手正角,旋转顺序 YXZ(先航向,然后是姿态,然后是坡度)

我找到了这个,但无法使用它,因为他们使用其他轴顺序:(http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm)

/** this conversion uses conventions as described on page:
*   http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm
*   Coordinate System: right hand
*   Positive angle: right hand
*   Order of euler angles: heading first, then attitude, then bank
*   matrix row column ordering:
*   [m00 m01 m02]
*   [m10 m11 m12]
*   [m20 m21 m22]*/
public final void rotate(matrix  m) {
    // Assuming the angles are in radians.
    if (m.m10 > 0.998) { // singularity at north pole
        heading = Math.atan2(m.m02,m.m22);
        attitude = Math.PI/2;
        bank = 0;
        return;
    }
    if (m.m10 < -0.998) { // singularity at south pole
        heading = Math.atan2(m.m02,m.m22);
        attitude = -Math.PI/2;
        bank = 0;
        return;
    }
    heading = Math.atan2(-m.m20,m.m00);
    bank = Math.atan2(-m.m12,m.m11);
    attitude = Math.asin(m.m10);
}

【问题讨论】:

  • 您确定要“态度、航向、银行”吗?我假设在飞机术语中,姿态意味着俯仰,航向意味着偏航。如果您不首先进行标题,则它不再是具有地理意义的标题。
  • 你是对的,我已经改变了问题,我想要实现的旋转顺序是偏航、俯仰、滚动。问题是我的轴与我发布的示例中的轴不同。我使用,yaw=Y,pitch=X,roll=Z,而示例使用yaw=Y,pitch=Z,roll=X。

标签: c++ matrix-multiplication opengl-3


【解决方案1】:

好的,我通过数学来解决这个问题。我拿了一张纸和一支笔,写了 3 个旋转矩阵(在我的例子中:X、Y、Z)。然后我按照我愿意旋转的顺序将它们相乘(在我的例子中:Y*X*Z)。

生成的矩阵有一个等于 -sinB 的值,即 B 第二次旋转。您可以根据该值计算 B 旋转。如果继续查看矩阵,您还会注意到有两个值等于 sinA*cosBcosA*cosB,这两个值的除法简化了 cosB 导致 sinA/cosAtanA 相同,是第一个旋转的 A。您可以根据该除法计算 A 旋转。同样,您会注意到 sinC*cosBcosC*cosB 值。

最后,需要考虑 cosB=0 this 是 B=90B=-90 的情况,在这个万一你不能做我之前告诉过的除法,因为你会被零除!所以在这种情况下,您考虑 B=+-90 C=0 并从更简单的结果矩阵计算 A

这就是我为我的约定编写的代码!!

/**
*   Matrix column-major
*   Coordinate System right-handed
*   Positive Angle right-handed
*   Rotation Order YXZ (first heading, then attitude, then bank)
*   [m00 m01 m02]
*   [m10 m11 m12]
*   [m20 m21 m22]
*/
public final void rotate(matrix  m) {
    // Assuming the angles are in radians.
    if ( m.m12 > 0.998 || m.m12 < -0.998 ) { // singularity at south or north pole
        heading = Math.atan2( -m.m20, m.m00 );
        bank = 0;
    } else {
        heading = Math.atan2( m.m02, m.m22 );
        bank = Math.atan2( m.m10, m.m11 );
    }
    attitude = Math.asin( m.m12 );
}

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2018-04-02
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多