web-dev-qa-db-ja.com

Eigenを使用してピッチ、ヨー、ロールの回転行列を作成する

Eigenライブラリでピッチ、ヨー、ロールを使用して回転行列を作成するにはどうすればよいですか?

14
Caesar

これを行う事前構築された関数を見つけることができなかったので、私はそれを作成しました。これは、将来誰かがこの質問を見つける場合のためにあります

Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY());
Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX());

Eigen::Quaternion<double> q = rollAngle * yawAngle * pitchAngle;

Eigen::Matrix3d rotationMatrix = q.matrix();
23
Caesar

Eigenライブラリでピッチ、ヨー、ロールを使用して回転行列を作成するにはどうすればよいですか?

これを行うには48の方法があります。あなたはどれが欲しいですか?ここに要因があります:

  • 外因性対固有。
    回転は固定システムの軸を中心にしていますか(外部)、それとも回転した軸を中心にしていますか(内部)。

  • 回転と変形。
    オブジェクトを物理的に回転させる行列を表現しますか、またはある参照フレームから別の参照フレームにベクトルを変換する行列を表現しますか?

  • 天文シーケンス。
    6つの基本的な天文シーケンスがあります。正規オイラーシーケンスには、z軸を中心とした回転と、それに続く(回転した)x軸を中心とした回転と、それに続く(再度回転した)z軸を中心とした3番目の回転が含まれます。これらの天文スタイルのシーケンスはさらに5つあります(xyxxzxyxyyzy、- zyz)この標準的なzxzシーケンスに加えて。

  • 航空宇宙シーケンス。
    混乱を増すために、6つの基本的な航空宇宙シーケンスもあります。たとえば、ピッチ-ヨー-ロールシーケンスとロール-ピッチ-ヨーシーケンス。天文学コミュニティはz-x-zシーケンスにかなり落ち着いていますが、航空宇宙コミュニティについては同じことが言えません。どこかで、6つの可能なシーケンスのすべてを使用している人々を見つけます。このグループの6つのシーケンスはxyzxzyyzxyxzzxyです。 =、およびzyx
9
David Hammen

シーザーの答えは問題ありませんが、David Hammenが言うように、それはアプリケーションによって異なります。私(水中または空中戦車フィールド)の勝者の組み合わせは次のとおりです。

Eigen::Quaterniond
euler2Quaternion( const double roll,
                  const double pitch,
                  const double yaw )
{
    Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX());
    Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY());
    Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitZ());

    Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle;
    return q;
}
9
narcispr

回転行列を作成するために必要なのは、ピッチ、ヨー、ロール、および行列の乗算を実行する機能だけです。

まず、3つの回転行列を作成します。1つは回転軸ごとに1つ(つまり、ピッチ用、ヨー用、ロール用)です。これらの行列には次の値があります。

ピッチマトリックス:

1, 0, 0, 0,
0, cos(pitch), sin(pitch), 0,
0, -sin(pitch), cos(pitch), 0,
0, 0, 0, 1

ヨーマトリックス:

cos(yaw), 0, -sin(yaw),  0,
0, 1, 0, 0,
sin(yaw), 0, cos(yaw), 0,
0, 0, 0, 1

ロールマトリックス:

cos(roll), sin(roll), 0, 0,
-sin(roll), cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

次に、これらすべてを一緒に乗算します。ここでの順序は重要です。通常の回転の場合、最初にロールマトリックスとヨーマトリックスを乗算し、次に積にピッチマトリックスを乗算します。ただし、逆方向に移動して回転を「元に戻す」場合は、逆の順序で乗算を実行する必要があります(角度が反対の値に加えて)。