web-dev-qa-db-ja.com

回転行列から角度を計算する方法

1つのオブジェクトの2つの画像を使用しています。オブジェクトは最初の画像からある程度回転しています。

各画像のPOSEを計算し、Rodergues()を使用して回転ベクトルをMatrixに変換しました。最初の位置からどれだけ回転したかを計算して確認するにはどうすればよいですか?

私は多くの方法を試しましたが、答えは近くありませんでした

編集:私のカメラはオブジェクトが動いているだけで固定されます。

23
N.J

次の式を使用して、回転行列からオイラー角を取得できます。

3×3の回転行列がある場合

enter image description here

3つのオイラー角は

enter image description here

enter image description here

enter image description here

ここでatan2は同じアークタンジェント関数で、象限チェックがあり、通常はCまたはMatlabにあります。

注:y軸の周りの角度が正確に+/- 90°である場合は注意が必要です。その場合、最初の列と最後の行のすべての要素は、下隅の要素(1または-1)を除いて、すべて0(cos(1)= 0)になります。 1つの解決策は、x軸を中心とした回転を180°に固定し、atan2(r_12、-r_22)からz軸を中心とした角度を計算することです。

オイラー角の6つの異なる次数の実装を含む https://www.geometrictools.com/Documentation/EulerAngles.pdf も参照してください。

42
Krish

もし R (3x3)回転行列で、回転角度はacos((tr(R)-1)/ 2)、ここでtr(R)は、行列のトレース(つまり、対角要素の合計)です。

それがあなたが求めたものです。 90%の確率で、あなたが望んでいない確率だと思います。

11
Beta

参考までに、このコードはMATLABでオイラー角を計算します。

function Eul = RotMat2Euler(R)

if R(1,3) == 1 | R(1,3) == -1
  %special case
  E3 = 0; %set arbitrarily
  dlta = atan2(R(1,2),R(1,3));
  if R(1,3) == -1
    E2 = pi/2;
    E1 = E3 + dlta;
  else
    E2 = -pi/2;
    E1 = -E3 + dlta;
  end
else
  E2 = - asin(R(1,3));
  E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2));
  E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2));
end

Eul = [E1 E2 E3];

Graham Taylor、Geoff Hinton、Sam Roweisによって提供されたコード。詳細については、 ここ を参照してください

2
Curnane

R1cとR2cを、計算した2つの回転行列とします。これらは、ポーズ1と2のオブジェクトからカメラフレームへの回転を表します(したがって、2番目のcサフィックス)。必要な回転行列は、ポーズ1からポーズ2まで、つまりR12です。それを計算するには、あなたの心の中で、pose_1-to-camera、次にcamera-to-pose_2のオブジェクトを回転させる必要があります。後者の回転は、R2cによって抑制されるpose_2-to-cameraの逆なので、次のようになります。

R12 = R1c * inv(R2c)

次に、行列R12から、ロディゲスの公式を使用して角度と回転軸を計算できます。

0