为何Euler旋转未按预期旋转向量?ZYX序列旋转问题排查
ZYX欧拉旋转的物体坐标系旋转误区
在ZYX欧拉旋转中,我理解初始绕自身Z轴的旋转会改变后续旋转的基准坐标系——欧拉角通常基于物体自身坐标系(body-fixed frame)测量,因此第二次绕Y轴的旋转应该基于第一次Z轴旋转后更新的Y轴,而非原世界坐标系的Y轴。
我写了一段测试代码,先绕物体Z轴旋转90度,再绕物体Y轴旋转90度:
% 旋转角度(度) psi_z = 90; % Z轴旋转角 theta_y = 90; % Y轴旋转角 % 构造旋转矩阵 R_z = [cosd(psi_z) -sind(psi_z) 0; sind(psi_z) cosd(psi_z) 0; 0 0 1]; R_y = [cosd(theta_y) 0 sind(theta_y); 0 1 0; -sind(theta_y) 0 cosd(theta_y)]; % 初始向量(代表飞机机头指向X轴) v = [1; 0; 0]; % 第一次绕Z轴旋转 v_z = R_z * v; disp("Z->"); disp(v_z); % 第二次绕Y轴旋转 v_zy = R_y * v_z; disp("Z->Y->"); disp(v_zy);
我预期的输出是:
Z-> 0 1 0 Z->Y-> 0 0 -1
但实际运行结果为:
Z-> 0 1 0 Z->Y-> 0 1 0
我无法理解为什么第二次旋转没有改变向量。用飞机模型类比:初始向量[1; 0; 0]是机头指向X轴,绕自身Z轴旋转90度后,机头指向原Y轴方向(即物体新的X轴),物体的新Y轴对应原X轴的负方向。此时绕物体Y轴旋转90度,机头应该指向原Z轴负方向,得到[0; 0; -1]才对。
我怀疑问题出在物体坐标系或中间坐标系的定义上,先明确几个术语:
- R: 完整的Z-Y-X欧拉旋转序列
- R0: 旋转前的初始姿态
- R1: R的第一个分量,绕Z轴的欧拉旋转
- R2: R的第二个分量,绕Y轴的欧拉旋转
- R3: 绕X轴的第三次旋转
显然R1是绕R0的Z轴旋转,R2应该绕R1执行后的物体Y轴旋转,但代码结果显示R2似乎是绕R0的Y轴旋转。这是不是向量未按预期旋转的原因?难道欧拉旋转序列中的每个角度始终相对于初始世界坐标系,而非更新后的物体坐标系?
内容的提问来源于stack exchange,提问作者KMC
相关产品推荐
相关产品推荐

