17

私は solvePnP を使用しており、翻訳ベクトルを取得しています。ここで、いくつかのオイラー角を solvePnP の結果と比較する必要があります。そして、オイラー角を「rodrigues」に変換したい/する必要があります。

solvePnP からの並進ベクトルはオイラー角に等しい。ロドリゲスと関係があるのは翻訳マトリックスだけですか? それとも、3 つのオイラー角とはまったく異なる特別なロドリゲス角がありますか? 両方の間の計算はどうですか?私が見つけられなかったOpenCV関数はありますか?

4

3 に答える 3

79

まず、並進ベクトルについて忘れてください。これは回転とは関係がないためです。並進は物を動かし、回転は向きを変えます。

ロドリゲス パラメータは、軸角度回転とも呼ばれます。それらは 4 つの数値[theta, x, y, z]で形成されます。つまり、単位ベクトルで表される軸を中心に角度 "シー​​タ" を回転させる必要がありますv=[x, y, z]cv::Rodrigues関数リファレンスを見ると、OpenCV は Rodrigues 表記の「コンパクトな」表現を 3 つの要素を持つベクトルとして使用しているようですrod2=[a, b, c]

  • 回転する角度thetaは、入力ベクトルのモジュールですtheta = sqrt(a^2 + b^2 + c^2)
  • 回転軸vは、正規化された入力ベクトルです。v = rod2/theta = [a/theta, b/theta, c/theta]

そのため、solvePnP からのロドリゲス ベクトルは、X、Y、Z 軸の組み合わせを中心とした 3 つの連続した回転を表すオイラー角の表記法とは少しも関係がありません。

両方の回転を比較するには?これは良い質問です。オイラー表現とロドリゲス表現の両方に、特異点とその他の問題があります。たとえば、2 つのオイラー ターンまたは 2 つのロドリゲス パラメータを比較すると、まったく異なって見えるかもしれませんが、実際にはほぼ同じ回転を表しています。両方の回転が同じ (またはおおよそ) かどうかを確認する必要がある場合は、次のアプローチに従うことができます。

  1. 両方の回転を行列表記に変換します (クォータニオンも有効です)。
  2. 一方の回転を他方の回転から「減算」します。つまり、一方を他方の反転と連結します
    • 回転行列を使用して、一方をもう一方の転置 (逆回転) で乗算します。ヌル回転は恒等行列です。
    • クォータニオンを使用して、一方を他方の複素共役で乗算します (最後の 3 つのコンポーネントを無効にします)。
  3. 結果が null 回転に近いかどうかを確認します。
    • Null 回転行列は恒等です。
    • ヌル四元数の最初のコンポーネントに 1 または -1 があります
于 2012-10-19T15:07:27.070 に答える
4

@dunadarの優れた回答に追加:

Rodriguesは回転行列 R に変換rvecされます (逆も同様です)。回転している (平行移動) ベクトルと内積を取ることにより、オイラー角から構築された回転行列を使用するのと同じ方法で、R を直接使用できます。v_rotate = R*v

ロドリゲス回転行列からオイラー角に変換できますが、複数の解があります。その理由は、オイラー回転 (ピッチ、ヨー、ロール) の順序が重要であるため、ロドリゲス回転を表す方法は複数あるためです。参照: http://www.staff.city.ac.uk/~sbbh653/publications/euler.pdf

于 2016-04-08T18:29:26.340 に答える