残念ながら、オイラー角の標準的な定義はありません。理論的には、任意の軸を中心とした 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