matlab 欧拉角 方向余弦,旋转矩阵、欧拉角之间转换
在学习过程中涵盖了欧拉角与旋转矩阵之间的转换关系。为了更好地掌握相关知识体系,在此基础上系统地整理了欧拉角对应的四元数概念及其与旋转矩阵之间的相互转换关系。
本文摘自各大课本,博客,自己学习整理使用,侵删
MATLAB矩阵乘法从左到右依次相乘
用R表示旋转矩阵。
yaw(偏航) pitch(俯仰) roll(横滚)分别表示Z Y X轴的转角。
q=[q0,q1,q2,q3]’表示单位四元数。
1旋转矩阵(方向余弦矩阵)
当一旦确定该点在空间中的位置后,则需明确该点的姿态方能完整地界定其位姿。因此可采用坐标系{B}相对于坐标系{A}来描述物体的姿态

通俗地讲,则是由坐标系{B}各坐标方向与参考坐标系{A}各坐标方向之间的余弦值所组成的3×3矩阵,并被定义为旋转矩阵。

欧拉角
1、内旋和外旋



内在与外在旋转之间的转换关系:通过交换第一次和第三次旋转的位置,则两者的结果一致。如Z-Y-X型内旋与X-Y-Z型外旋的旋转变换矩阵相同。
一、绕定轴X-Y-Z旋转(RPY角)(外旋)
假设两个坐标系A和B,二者初始时完全重合。
具体来说,B围绕着A依次进行X轴、Y轴和Z轴方向上的旋转变换,每次分别转过γ、β和α角,最终完成整个旋转变换。在整个过程中,A保持静止,B则经历了一系列运动

旋转矩阵的具体数学表达式为R = R_z \cdot R_y \cdot R_x。其乘法顺序遵循从右到左的原则,在具体实现时,则是按照X-Y-Z轴的顺序依次进行绕轴旋转变换。

其中,cα = cosα,sα = sinα,矩阵相乘,结果如下:

二、绕动轴Z-Y-X旋转(Euler角)(内旋)
过程如下:B围绕其自身的Z轴旋转α角,在随后的过程中依次绕其自身的Y轴旋转β角和X轴旋转γ角,并最终完成整个旋转变换。在这一过程中(entire rotational process),A保持静止而B发生运动(undergoes motion)。
旋转矩阵的计算方法如下:R = Rz * Ry *Rx。乘法顺序:从左向右


欧拉角的表示方式比较直观,但是有几个缺点:
(1) 欧拉角的表示方法具有多样性。当设定不同起始方向和目标方向时,在固定 yaw、pitch、roll 顺序的前提下,“尽管可以选择不同的 yaw/pitch/roll 组合来实现所需旋转效果”。例如,在相同 yaw-pitch-roll 顺序下,“参数如 (0°, 90°, 0°) 和 (90°, 90°, 90°)”会导致同一个姿态结果出现。“其主要原因在于存在万向锁现象”。
(2) 欧拉角的插值比较难。
(3) 通常情况下,在旋转变换中需要用旋转矩阵进行表示为,在此时刻涉及大量三角函数项的计算会导致较大的计算规模。
欧拉角转旋转矩阵
当进行坐标变换运算时,在选择几何变换方式时选择一个更加方便的形式通常涉及使用旋转矩阵(Rotation Matrix)。三维空间中的任意一次旋转变换都可以被表示为一个3×3阶方阵。为了将给定的一组欧拉角(yaw、pitch、roll)转换为对应的旋转矩阵(Matrix),我们可以采用以下方法:假设这些角度分别为α(偏航)、β(俯仰)、γ(滚转),则旋转变换过程可具体表述如下:

eul2rotm函数中,默认采用ZYX旋转序列,并遵循从右至左的矩阵乘法顺序依次完成绕X、Y、Z轴的旋转变换操作
当使用Z-Y-X顺序的欧拉角参数与angle1-angle2-angle3的欧拉角表示相等时,则对应的旋转矩阵计算为绕Z轴旋转angle1乘以绕Y轴旋转angle2再乘以绕X轴旋转angle3。

rotm2eul()
计算单位为弧度制,计算结果的顺序对应欧拉角旋转轴顺序
deg2rad()%MATLAB角度转弧度函数
% Z Y X
eul=[0 pi/2 0];
yaw=0;
pitch=pi/2'
roll=0;
R_x=[1 0 0;
0 cos(roll) -sin(roll);
0 sin(roll) cos(roll)];
R_y=[cos(pitch) 0 sin(pitch);
0 1 0;
-sin(pitch) 0 cos(pitch)];
R_z=[cos(yaw) -sin(yaw) 0;
sin(yaw) cos(yaw) 0;
0 0 1];
R=R_zR_yR_x;%欧拉角转旋转矩阵
R2=angle2dcm(eul,'ZYX');%由欧拉角转方向余弦矩阵
R2=eul2rotm(eul,'ZYX');%欧拉角转旋转矩阵
四元数(后续补充)
一篇介绍四元数的文章
在MATLAB中可使用quatmultiply函数来进行四元数相乘操作,并分别提供quatinv函数用于求取四元数的逆元素以及quatconj函数用于获取其共轭值。对于涉及四元数旋转变换与对应旋转矩阵的关系可通过以下MATLAB代码进行验证
% Matlab code by MulinB, Aerospace Toolbox is needed
pt = [10,20,30]; % point coordinate
yaw = 45;
pitch = 30;
roll = 60;
q = angle2quat(yaw/180pi,pitch/180pi,roll/180*pi);
R = angle2dcm(yaw/180pi,pitch/180pi,roll/180*pi);
pt1 = R*pt';
pt2 = quatmultiply(quatconj(q), quatmultiply([0,pt],q)); % NOTE the order
disp(pt1');disp(pt2(2:4));
通过查看上述代码片段可知quaternion、direction cosine matrix (DCM)以及Euler angles之间的相互转换关系,在MATLAB中非常便捷地实现了这些类型的互相转换。此外,在通过quaternion计算轴与角度时,则可以通过以下代码实现相应的变换。
% Matlab code by MulinB, Compute the axis and angle from a quaternion
function [axis, theta] = quat2axisangle(q)
theta = acos(q(1)) * 2;
axis = q(2:4)/sin(theta/2);
总结:
转欧拉角:
旋转矩阵转欧拉角
[r2,r2,r3]=dcm2angle(R, S)
eul=rotm2rul(R,S)
注:得到的结果为弧度,若需要角度需进一步转化
四元数转欧拉角
[r1,r2,r3]=quat2angle([q0 q1 q2 q3],S)
注:S 的选择有12种,【‘ZYX’,‘ZYZ’,‘ZXY’,‘ZXZ’,‘YXZ’,‘YXY’,‘YZX’,‘YZY’,‘XYZ’,‘XYX’,‘XZY’,‘XZX’】
S 默认 ‘ZYX’
转旋转矩阵
四元数转旋转矩阵
R=quat2dcm([q0 q1 q2 q3])
欧拉角转旋转矩阵
R=angle2dcm(r1,r2,r3,S);
R=angle2dcm(yaw/180pi,pitch/180pi,roll/180*pi)
注:根据欧拉角是弧度/角度,选择以上操作
转四元数
旋转矩阵转四元数
q =dcm2quat®;
欧拉角转四元数
q=angle2quat(r1,r2,r3,S);
clear all;
close all;
clc;
%欧拉角
x = 0.5;
y = 0.6;
z = 0.7;
Ang1 = [x y z];
%欧拉角转旋转矩阵
Rx = [1 0 0;
cos(x) -sin(x);
sin(x) cos(x)];
Ry = [cos(y) 0 sin(y);
1 0;
-sin(y) 0 cos(y)];
Rz = [cos(z) -sin(z) 0;
sin(z) cos(z) 0;
0 1];
R = RzRyRx;
R1 = R;
%旋转矩阵转欧拉角
x = atan2(R(3,2),R(3,3));
y = atan2(-R(3,1),sqrt(R(3,2)2+R(3,3)2));
z = atan2(R(2,1),R(1,1));
Ang2 = [x y z];
%旋转矩阵转四元数
t=sqrt(1+R(1,1)+R(2,2)+R(3,3))/2;
q=[t (R(3,2)-R(2,3))/(4t) (R(1,3)-R(3,1))/(4t) (R(2,1)-R(1,2))/(4*t)];
Q1 = q;
%四元数转旋转矩阵
R=[ 2q(1).2-1+2*q(2)2 2(q(2)*q(3)-q(1)q(4)) 2(q(2)*q(4)+q(1)*q(3));
2*(q(2)q(3)+q(1)q(4)) 2q(1)2-1+2*q(3)2 2(q(3)*q(4)-q(1)*q(2));
2*(q(2)*q(4)-q(1)q(3)) 2(q(3)*q(4)+q(1)q(2)) 2q(1)2-1+2*q(4)2];
R2 = R;
%欧拉角转四元数
q = [cos(x/2)*cos(y/2)*cos(z/2) + sin(x/2)*sin(y/2)*sin(z/2) ...
sin(x/2)*cos(y/2)*cos(z/2) - cos(x/2)*sin(y/2)*sin(z/2) ...
cos(x/2)*sin(y/2)*cos(z/2) + sin(x/2)*cos(y/2)*sin(z/2) ...
cos(x/2)*cos(y/2)*sin(z/2) - sin(x/2)*sin(y/2)*cos(z/2)];
Q2 = q;
%四元数转欧拉角
x = atan2(2*(q(1)*q(2)+q(3)q(4)),1 - 2(q(2)2+q(3)2));
y = asin(2*(q(1)*q(3) - q(2)*q(4)));
z = atan2(2*(q(1)*q(4)+q(2)q(3)),1 - 2(q(3)2+q(4)2));
Ang3 = [x y z];
Ang1
Ang2
Ang3
R1
R2
Q1
Q2
