为什么我的3轴系统坐标方向用y值改变x?

时间:2015-06-19 11:14:53

标签: matlab coordinate-systems coordinate-transformation euler-angles

我正在使用Matlab和Euler Angles来重新定向3axes坐标系。具体地,

Rz = [cos(ψ) sin(ψ) 0;-sin(ψ) cos(ψ) 0;0 0 1];
Ry = [cos(φ) 0 -sin(φ);0 1 0;sin(φ) 0 cos(φ)];
Rx = [1 0 0;0 cos(θ) -sin(θ);0 sin(θ) cos(θ)];
Rtotal = Rz*Ry*Rz

然后我遍历我的旧系统坐标(x,y,z)并制作一个矢量 coord_old 。然后我得到了带有(xn,yn,zn)

的重定向系统
for i=1:size(num,1)
    coord_old = [x(i,1);y(i,1);z(i,1)];
    coord_new = Rtotal*coord_old;
    xn(i,1) = coord_new(1,1);
    yn(i,1) = coord_new(2,1);
    zn(i,1) = coord_new(3,1);
end

我的问题是当θ,φ,ψ≃0然后 x-> -y和y-> x 以及θ时,φ ≃0和ψ= 90 然后 x和y将不会旋转!这意味着,当x,y应该旋转时,它们不会旋转,当它们不应该旋转时,它们会保持原样!

- EDIT-- 例如,当ψ= 20.0871,φ= 0.0580且θ= 0.0088时,我得到这些结果

See that x->y and y->x while z doesn't change at all

看到x-> -y和y-> x而z根本没有变化! 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

好的,我在这里看到两个主要问题:

  1. Rtotal = Rz*Ry*Rz可能不是你想要的,因为Rz乘以两次。我认为你的意思是Rtotal = Rz*Ry*Rx
  2. 您的旋转矩阵似乎不正确。检查this Wikipedia artice以获得正确的信号。
  3. 这是一个经过校正的旋转矩阵:

    Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0;      0 0 1];
    Ry = [cos(phi) 0 sin(phi);  0 1 0;                    -sin(phi) 0 cos(phi)];
    Rx = [1 0 0;                0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
    Rtotal = Rz*Ry*Rx;
    

    使用此矩阵,我得到了正确的结果:

    x=1; y=2; z=3;
    psi=0; phi=0; theta=0;
    [xn,yn,zn] >> 1 2 3
    
    x=1; y=2; z=3;
    psi=90/180*pi; phi=0; theta=0;
    [xn,yn,zn] >> -2 1 3
    

    这里是3d空间中立方体的完整图形示例:

    % Create cube (not in origin)
    DVert = [0 0 0; 0 1 0; 1 1 0; 1 0 0 ; ... 
             0 0 1; 0 1 1; 1 1 1; 1 0 1];     
    DSide = [1 2 3 4; 2 6 7 3; 4 3 7 8; ...
             1 5 8 4; 1 2 6 5; 5 6 7 8];
    DCol  = [0 0 1; 0 0.33 1; 0 0.66 1; ...
             0 1 0.33; 0 1 0.66; 0 1 1];
    
    % Rotation angles
    psi   = 20  /180*pi;    % Z
    phi   = 45  /180*pi;    % Y
    theta = 0   /180*pi;    % X
    
    % Rotation matrix
    Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0;      0 0 1];
    Ry = [cos(phi) 0 sin(phi);  0 1 0;                    -sin(phi) 0 cos(phi)];
    Rx = [1 0 0;                0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
    Rtotal = Rz*Ry*Rz;
    
    % Apply rotation
    DVertNew = Rtotal * DVert';
    
    % Plot cubes
    figure;
    patch('Faces',DSide,'Vertices',DVert,'FaceColor','flat','FaceVertexCData',DCol); 
    patch('Faces',DSide,'Vertices',DVertNew','FaceColor','flat','FaceVertexCData',DCol); 
    
    % Customize view
    grid on;
    axis equal;
    view(30,30);
    

答案 1 :(得分:0)

当我使用你的代码并为所有角度插入0时,我得到Rtotal:

Rtotal = 
1 0 0
0 1 0
0 0 1

这是单位矩阵,不会改变您的值。

矩阵乘法中有错误。我想你应该成倍增加:Rtotal*coord_old。我想你错过了_old。取决于你coord变量中的内容,这可能是错误。

当我跑步时:

for i=1:size(1,1)
    coord_old = [1;2;3];
    coord_new = Rtotal*coord_old;
    xn(i,1) = coord_new(1,1);
    yn(i,1) = coord_new(2,1);
    zn(i,1) = coord_new(3,1);
end

我得到了正确的结果:

coord_new = 
1
2
3

答案 2 :(得分:0)

感谢@Steffen和@Matt。不幸的是,我的声誉不够高,无法对你的答案进行投票!

问题与Rtotal无关,正如@Matt正确陈述的那样。它应该是Rz*Ry*Rx。但是,你的想法都帮助我用简单的例子(5组坐标和右手规则)测试我的代码,并意识到我(业余)错误的位置。

我忘记了我已经删除了部分代码,我正在用度数表达我的角度......我应该使用sind & cosd代替sin and cos