Matlab 四元数代码和万向节锁背后的数学
我有下面的matlab代码,它给出了四元数的旋转矩阵。做这件事的人说他使用了一些库,它最初来自这个旋转矩阵 根据代码显示的旋转矩阵如下所示 对角线元素和符号已更改。有人能给我解释一下这两者之间差异的数学或条件吗Matlab 四元数代码和万向节锁背后的数学,matlab,matrix,quaternions,gyroscope,euler-angles,Matlab,Matrix,Quaternions,Gyroscope,Euler Angles,我有下面的matlab代码,它给出了四元数的旋转矩阵。做这件事的人说他使用了一些库,它最初来自这个旋转矩阵 根据代码显示的旋转矩阵如下所示 对角线元素和符号已更改。有人能给我解释一下这两者之间差异的数学或条件吗 Q0 = Quat(1); Q1 = Quat(2); Q2 = Quat(3); Q3 = Quat(4); %% set f2q to 2*q0 and calculate products f2q = 2 * Q0; f2q0q0 = f2q * Q0; f2q0q1 = f
Q0 = Quat(1);
Q1 = Quat(2);
Q2 = Quat(3);
Q3 = Quat(4);
%% set f2q to 2*q0 and calculate products
f2q = 2 * Q0;
f2q0q0 = f2q * Q0;
f2q0q1 = f2q * Q1;
f2q0q2 = f2q * Q2;
f2q0q3 = f2q * Q3;
%% set f2q to 2*q1 and calculate products
f2q = 2 * Q1;
f2q1q1 = f2q * Q1;
f2q1q2 = f2q * Q2;
f2q1q3 = f2q * Q3;
%% set f2q to 2*q2 and calculate products
f2q = 2 * Q2;
f2q2q2 = f2q * Q2;
f2q2q3 = f2q * Q3;
f2q3q3 = 2 * Q3 * Q3;
%% calculate the rotation matrix assuming the quaternion is normalized
R(1, 1) = f2q0q0 + f2q1q1 - 1;
R(1, 2) = f2q1q2 + f2q0q3;
R(1, 3) = f2q1q3 - f2q0q2;
R(2, 1) = f2q1q2 - f2q0q3;
R(2, 2) = f2q0q0 + f2q2q2 - 1;
R(2, 3) = f2q2q3 + f2q0q1;
R(3, 1) = f2q1q3 + f2q0q2;
R(3, 2) = f2q2q3 - f2q0q1;
R(3, 3) = f2q0q0 + f2q3q3 - 1;
还有
旋转矩阵用于计算欧拉角,欧拉角也适用于万向锁
%%calculate the pitch angle -90.0 <= Theta <= 90.0 deg
pitchdeg = asin(-R(1, 3)) * (180 / pi);
%% calculate the roll angle range -180.0 <= Phi < 180.0 deg
rolldeg = atan2(R(2, 3), R(3, 3)) * (180 / pi);
%% map +180 roll onto the functionally equivalent -180 deg roll
if (rolldeg == 180)
rolldeg = -180;
end
%% calculate the yaw (compass) angle 0.0 <= Psi < 360.0 deg
if (pitchdeg == 90)
%% vertical upwards gimbal lock case
yawdeg = (atan2(R(3, 2), R(2, 2)) * (180 / pi)) + rolldeg;
elseif (pitchdeg == -90)
%% vertical downwards gimbal lock case
yawdeg = (Math.Atan2(-R(3, 2), R(2, 2)) * (180 / pi)) - rolldeg;
else
%% general case
yawdeg = atan2(R(1, 2), R(1, 1)) * (180 / pi);
end
%% map yaw angle Psi onto range 0.0 <= Psi < 360.0 deg
if (yawdeg < 0)
yawdeg = yawdeg + 360;
end
%% check for rounding errors mapping small negative angle to 360 deg
if (yawdeg >= 360)
yawdeg = 0;
end
Euler.Roll = rolldeg;
Euler.Pitch = pitchdeg;
Euler.Yaw = yawdeg;
%%计算俯仰角-90.0是的,有数学依据。不,这不是要求数学辅导的地方。注意,f2q=2*Q0;产生非一致的四元数,并且它的所有乘积都是非一致的,所以如果你将转换应用到矩阵,假设它的单位,它失败了。是的,它背后有数学。不,这不是要求数学辅导的地方。注意,f2q=2*Q0;生成非一致的四元数,并且其所有乘积都是非一致的,因此,如果将转换应用于假定其单位的矩阵,则转换失败。