2

回転行列からオイラー角を抽出しようとしています。私の信念:マトリックス列-メジャー、座標系右利き、正の角度右利き、回転順序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);
}
4

1 に答える 1

1

わかりました、私はこれを計算して解決します。私は紙とペンを取り、3 つの回転行列 (私の場合: X、Y、Z) を書きました。そして、回転させたい順序でそれらを乗算しました (私の場合: Y*X*Z)。

結果の行列には、 -sinBに等しい値の 1 つがあり、Bは 2 番目の回転です。その値からB回転を計算できます。行列を見続けると、sinA*cosBcosA*cosBに等しい 2 つの値があることもわかります。この 2 つの値の除算により cosB が単純化され、sinA/cosA得られ、tanAと同じになります初回転。その分割からA回転を計算できます。同様に、sinC*cosBcosC*cosB の値に気付くでしょう。

最後に、 cosB=0の場合を考慮する必要があります。これはB=90またはB=-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 );
}
于 2012-06-23T12:51:37.640 に答える