1

回転行列から方向の 3 つの角度を抽出する方法により、MATLAB 外部カメラ パラメーターが得られました。たとえば、次の回転行列を指定した場合、

Rc_ext = [ -0.012785     0.999906    -0.004886

            0.982489     0.011654    -0.185957

           -0.185883     -0.007178   -0.982546 ]

方向の 3 つの角度 (x 軸、y 軸、z 軸周り) を見つけますか?

4

2 に答える 2

1

残念ながら、オイラー角の標準的な定義はありません。理論的には、任意の軸を中心とした 3 つの回転の角度のセットを任意の順序で見つけることができ、同じ回転行列を取得できます。これを読んで絶望してください。

多くの人は、正の回転がどの方向であるか、または使用する単位を定義することを気にしません。ABB ロボット アームが出力する角度の正しい解釈をリバース エンジニアリングするのに 3 週間かかったことがあります。

ベクトルの長さに沿って見ると、正の回転が時計回りとして定義される右手座標系のコードを次に示します。ヨー (Z 軸周りの回転)、ピッチ (Y 周りの回転)、ロール (X 周りの回転) が必要で、matrix = r_z * r_y * r_x でマトリックスを作成すると仮定します。

次に、私のコードは次のとおりです。

function [yaw, pitch, roll] = euler_angles(rot_mat)
    pitch = asin(rot_mat(3,1)) * (180.0/pi);
    yaw   = atan2(rot_mat(2,1), rot_mat(1,1)) * (180.0/pi);
    roll  = atan2(rot_mat(3,2), rot_mat(3,3))* (180.0/pi);
end

オイラー角から行列を再生成するコードを次に示します。

function rotation = euler_rotation(yaw_deg, pitch_deg, roll_deg)
    % rads = deg2rad([yaw_deg, pitch_deg, roll_deg]);
    rads = ([yaw_deg, pitch_deg, roll_deg]) * (pi/180.0);
    cos_y = cos(rads(1));
    sin_y = sin(rads(1));
    cos_p = cos(rads(2));
    sin_p = sin(rads(2));
    cos_r = cos(rads(3));
    sin_r = sin(rads(3));

    r_x = eye(3);
    r_x(2,2) = cos_r;
    r_x(3,3) = cos_r;
    r_x(2,3) = -sin_r;
    r_x(3,2) = sin_r;

    r_y = eye(3);
    r_y(1,1) = cos_p;
    r_y(3,3) = cos_p;
    r_y(1,3) = -sin_p;
    r_y(3,1) = sin_p;

    r_z = eye(3);
    r_z(1,1) = cos_y;
    r_z(2,2) = cos_y;
    r_z(1,2) = -sin_y;
    r_z(2,1) = sin_y;

    rotation = r_z * r_y * r_x;    
end
于 2018-07-25T13:13:34.483 に答える
0

Wiki Euler AnglesE = RX(φ)*RY(ψ)*RZ(θ)に見られるように、私はちょうど試しています。

  • 最初に試しE*RZ(-θ) = RX(φ)*RY(ψ)てみて、要素 [1,2] を選択して取得します

    0.999906 COS(θ)-0.012785 SIN(θ)=0 } θ=269.267°

  • 次に、要素 [1,3] を選択し、要素 [1,1] で割ります。

    -0.004886/0.99998773245525367 = TAN(ψ) } ψ=-0.279948385°

  • 最後に、要素 [3,2] を要素 [2,2] で分割して、

    -0.18595957899545633/0.98255769599450146 = TAN(φ) } φ = 169.28292°

于 2015-06-10T01:25:57.617 に答える