我们如何从旋转矩阵中提取三个方向角导致 MATLAB 外部相机参数。例如,如果您给出以下旋转矩阵,
Rc_ext = [ -0.012785 0.999906 -0.004886
0.982489 0.011654 -0.185957
-0.185883 -0.007178 -0.982546 ]
找到三个方向角(围绕 x 轴、y 轴和 z 轴)?
不幸的是,欧拉角没有标准定义。理论上,您可以找到一组角度,以任何顺序围绕任何轴进行 3 次旋转,并获得相同的旋转矩阵。读到这里,绝望。
许多人懒得去定义正向旋转是哪种方式,或者他们使用什么单位。曾经我花了三周的时间对 ABB 机械臂输出的角度进行逆向工程。
这是我的右手坐标系代码,当沿着向量的长度看时,正旋转被定义为顺时针方向。假设您想要 yaw(绕 Z 轴旋转)、pitch(绕 Y 旋转)和 Roll(绕 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
我只是在尝试E = RX(φ)*RY(ψ)*RZ(θ)
如Wiki Euler Angles中所见。
首先我尝试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°