从3x3旋转矩阵中提取Euler角度导致相机校准过程

时间:2013-10-05 21:28:33

标签: matlab matrix rotation

我们如何从旋转矩阵中提取三个方向角导致了MATLAB外部摄像机参数。例如,如果您给出了以下旋转矩阵,

Rc_ext = [ -0.012785     0.999906    -0.004886

            0.982489     0.011654    -0.185957

           -0.185883     -0.007178   -0.982546 ]

找到三个方向角(围绕x轴,y轴和z轴)?

2 个答案:

答案 0 :(得分:1)

不幸的是,没有欧拉角的标准定义。从理论上讲,您可以找到一组绕任意轴以任何顺序旋转3的角度,并获得相同的旋转矩阵。阅读this并感到绝望。

许多人不会费心定义正向旋转的方式或使用的单位。我曾经花了三个星期的时间对ABB机械臂输出的角度进行正确的逆向工程。

这是我的右手坐标系代码,其中沿着向量的长度看时,正向旋转定义为顺时针旋转。假设您要偏航(绕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

答案 1 :(得分:0)

我只是在Wiki Euler Angles中看到E = 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°