私はsolvePnPを使用していて、変換ベクトルを取得しています。ここで、いくつかのオイラー角をsolvePnPの結果と比較する必要があります。そして、オイラー角を「rodrigues」に変換する必要があります。
solvePnP からの変換ベクトルはオイラー角と等しいですか。変換行列だけがロドリゲス角と関係があるのでしょうか。それとも、3 つのオイラー角とはまったく異なる特別なロドリゲス角があるのでしょうか。両者の間の数学はどのようになっているのでしょうか。見つけられなかった OpenCV 関数があるのでしょうか。
ベストアンサー1
まず忘れてください翻訳ベクトルは、回転: 平行移動は物体を移動させ、回転は物体の向きを変えます。
ロドリゲスパラメータは、軸角度回転これらは4つの数字で構成されており[theta, x, y, z]
、単位ベクトルで記述された軸を中心に角度「theta」回転する必要があることを意味しますv=[x, y, z]
。cv::ロドリゲス関数リファレンスによると、OpenCV は、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 つのロドリゲス パラメーターを比較すると、まったく異なって見えるかもしれませんが、実際にはほぼ同じ回転を表しています。両方の回転が同じ (または近似) かどうかを確認する必要があるだけの場合は、次のアプローチに従うことができます。
- 両方の回転を行列表記に変換します(四元数も有効です)
- OpenCVロドリゲスベクトルは、以下を使用して行列に変換できます。cv::ロドリゲス関数
- オイラーを行列に変換するには、以下を参照することをお勧めします。コンバージョンセクションeuclideanspace.com の
- 1つの回転を他の回転から「減算」する、つまり1つの回転を他の回転の逆回転と連結する
- 回転行列を使用して、一方を他方の転置(逆回転)で乗算します。ヌル回転は単位行列です。
- 四元数を使用して、一方を他方の複素共役で乗算します (最後の 3 つの要素を否定します)。
- 結果がヌル回転に近いかどうかを確認します。
- ヌル回転行列は恒等行列です。
- ヌル四元数は最初の要素に1または-1を持つ。