欧拉角、方向余弦矩阵和四元数是导航领域中常用的表示方式,课程中会讲授相关的理论并要求自己编写函数进行实现,以起到学习巩固的目的。但之间的转换具有不同的计算方式,对于不同项目的坐标系的定义不同、代码风格也不同,几乎每一个导航代码包都会配套自己的实现方法,对于多个项目融合可能会带来一定的影响。因此在个人组织项目时选择使用MATLAB官方的函数来进行实现,尽量避免了多个项目进行组合时出现多个命名相似但功能有差异的函数编写。
项目环境:MATLAB R2022b,配置有Robotics System Toolbox工具箱(一般成套的MATLAB中都会自带)
先上干货,使用中知己按照该方式调用即可。注:两套体系也不可混用
% 已知按顺序绕n系下x,y,z轴旋转对应角度后得到b系
% 即描述物体在n系下的姿态角(角标描述先下后上)
x=deg2rad(-22.2727);
y=deg2rad(-0.9673);
z=deg2rad(-37.7648);
% 欧拉角→方向余弦
Cbn=eul2rotm([z,y,x]);
% 欧拉角→四元数
q=eul2quat([z,y,x])
% 方向余弦→欧拉角
rotm2eul(Cbn);
% 方向余弦→四元数
rotm2quat(Cbn);
% 四元数→方向余弦
quat2rotm(q);
% 四元数→欧拉角
quat2eul(q);
% 使用类方法进行求解
% 欧拉角→方向余弦
Cbn_=eul2rotm(-eul_,"XYZ")'
% 欧拉角→四元数
q_=quaternion([x,y,z],'euler','XYZ','point')
% 方向余弦→欧拉角
eul_=-rotm2eul(Cbn_',"XYZ")
% 方向余弦→四元数
q2_=quaternion(Cbn,'rotmat','point')
% 四元数→方向余弦
Cbn_=rotmat(q_,"point")
% 四元数→欧拉角
eul_=euler(q_,"XYZ","point")
由于类中不包括方向余弦和欧拉角之间的相互转化,因此依然需要引入上述方法来求解,所以建议在转化的过程中用四元数进行过渡(在使用四元数姿态更新方法的过程中会更方便)。
这里默认读者已经有了基础的理论知识,直接给出转换的示例代码以及相关的经验说明。
x=deg2rad(-22.2727);
y=deg2rad(-0.9673);
% z=deg2rad(322.2352);
z=deg2rad(-37.7648);
% ==/欧拉角转换为方向余弦矩阵/==
Cbn=eul2rotm([z,y,x])
%{
0.7904 0.5718 0.2198
-0.6123 0.7276 0.3092
0.0169 -0.3790 0.9253
%}
% ==/方向余弦矩阵转换为欧拉角/==
eul=rotm2eul(Cbn);
rad2deg(eul)
% -37.7648 -0.9673 -22.2727
程序非常简单,这里主要做一些说明:
MATLAB中可以使用基础的四元数(单位哈密顿四元数)转换函数进行转换,其调用如下:
x=deg2rad(-22.2727);
y=deg2rad(-0.9673);
% z=deg2rad(322.2352);
z=deg2rad(-37.7648);
% ==/欧拉角转换为四元数/==
q=eul2quat([z,y,x])
% 0.9278 -0.1854 0.0547 -0.3191
% ==/四元数转换为欧拉角/==
eul=quat2eul(q);
rad2deg(eul)
% -37.7648 -0.9673 -22.2727
欧拉角转换为四元数求解注意事项与转换为方向余弦的注意事项相同。
四元数与方向余弦的转换调用如下:
%{
0.7904 0.5718 0.2198
-0.6123 0.7276 0.3092
0.0169 -0.3790 0.9253
%}
q=rotm2quat(Cbn)
% 0.9278 -0.1854 0.0547 -0.3191
Cbn=quat2rotm(q)
%{
0.7904 0.5718 0.2198
-0.6123 0.7276 0.3092
0.0169 -0.3790 0.9253
%}
具体的使用说明,可以在MATLAB命令行中键入doc quaternion进行查看,这里给出所具有的重要功能的列表
在配置有Robotics System Toolbox工具箱的MATLAB版本中,当进行简单运算时建议使用四元数类进行求解,当运算量较大(涉及到放入循环中进行惯导解算时),建议使用简单函数。