Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 四元数代码和万向节锁背后的数学_Matlab_Matrix_Quaternions_Gyroscope_Euler Angles - Fatal编程技术网

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

我有下面的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 = 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;生成非一致的四元数,并且其所有乘积都是非一致的,因此,如果将转换应用于假定其单位的矩阵,则转换失败。