首页 > 技术 > 内容

利用欧拉角与旋转矩阵来对陀螺仪与加速度计的原始数据进行姿态求解

时间:2025-12-07  作者:Diven  阅读:0

 

 1IMU姿态解算  

IMU,即惯性测量单元,一般包含三轴陀螺仪与三轴加速度计。之前的文章MPU6050姿态解算方式1-DMP已将对MPU6050这款IMU作了简单的介绍,并通过其内部的DMP处理单元直接得到姿态解算的四元数结果。本篇将通过软件解算的方式,利用欧拉角与旋转矩阵来对陀螺仪加速度计的原始数据进行姿态求解,并将两种姿态进行互补融合,最终得到IMU的实时姿态。

本篇的姿态解算选用的旋转顺序为ZYX,即IMU坐标系初始时刻与大地坐标系重合,然后依次绕自己的Z、Y、X轴进行旋转,这里先自定义一下每次的旋转名称和符号:

  • 绕IMU的Z轴旋转:航向角yaw,  转动 y 角度

  • 绕IMU的Y轴旋转:俯仰角pitch,转动 p 角度

  • 绕IMU的X轴旋转:横滚角row,   转动 r 角度

三次旋转的示意图如下:

 

 

另外,横滚roll,俯仰pitch,偏航yaw的实际含义如下图:

 

 

 

2旋转矩阵  

旋转矩阵的知识请先参阅3维旋转矩阵推导与助记与3维旋转矩阵推导与助记-补充篇,这里只列出本篇需要用到的3个旋转矩阵,注意这3个旋转矩阵是坐标变换的旋转矩阵。

 

 

3欧拉角旋转  

欧拉角旋转的知识请先参阅欧拉角旋转,这里需要说明的是,本篇需要用到的绕着自己运动的轴,以ZYX顺序旋转。

4加速度计解算姿态角  

加速度计测量的是其感受到的加速度,在静止的时候,其本身是没有加速运动的,但因为重力加速度的作用,根据相对运动理论,其感受的加速度与重力加速度正好相反,即读到的数据是竖直向上的。加速度计的英文简写为acc,下面用首字母a代表加速度计数据。

加速度利用静止时刻感受到重力加速度,计算姿态:

  • 当加速度计水平放置,即Z轴竖直向上时,Z轴可以读到1g的数值(g为重力加速度),X轴和Y轴两个方向读到0,可以记作(0,0,g)。

  • 当加速度计旋转一定的姿态时,重力加速度会在加速度的3个轴上产生相应的分量,其本质是大地坐标系下的(0,0,g)在新的加速度计自身坐标系下的坐标,加速度计读到的3个值就是(0,0,g)向量的新坐标。

姿态的旋转选用ZYX顺序的3次旋转方式,则上述描述可表示为:

 

 

解这个方程,可以得到roll和pitch角(由于绕Z旋转时,感受到的重力加速度是不变的,因此加速度计无法计算yaw角)

 

 

3次旋转过程的分解过程如下图:

 

 

 

5陀螺仪解算姿态角  

陀螺仪测量的绕3个轴转动的角速度,对角速度积分,可以得到角度。陀螺仪的英文简写为gyro,下面用首字母g代表陀螺仪数据。

如下图,IMU在第n个时刻的姿态角度为r、p、y,其含义为IMU坐标系从初始位置,经过绕Z旋转y角度,绕Y旋转p角度,绕X旋转r角度,得到了最终的姿态,此时需要计算下一个时刻(n+1)的姿态。设n+1时刻的姿态角为r+Δr、p+Δp、y+Δy,该姿态也是经历了3次旋转。要想计算n+1时刻的姿态,只要在n时刻姿态的基础上,加上对应的姿态角度变化量即可。姿态角度的变化量可以通过角速度与采用时间周期积分即可。

 

 

这里红框中dr/dt等角速度实际是假想的角速度,用于姿态更新,姿态更新是以大地坐标系为参考,而陀螺仪在第n个状态读出的角速度是以自己所在的坐标系为参考,需要将读到的gyro陀螺数据经过变换,才能用于计算更新第n+1次的姿态。

那dr/dt等角速度该怎样理解呢?看下面这个图,还是将其分解为3次旋转:

 

 

首先来看dy/dt,是3次旋转过程中绕Z轴的yaw角的角速度,3次旋转首先就是绕着Z轴旋转,Z轴方向的单位向量可表示为[0 0 1]T,T表示向量转置,因此[0 0 dy/dt]T表示在图中状态①的坐标中绕Z的角速度。由于之后该坐标系还要经历绕Y和绕X的两次旋转,因此这里[0 0 dy/dt]T角速度在经历两次旋转后,在最终的坐标系(状态③)中的坐标也要经历两次变换。图中的[gx_Z gy_Z gz_Z]T表示3次旋转过程中绕Z轴的yaw角的角速度在最终姿态中的等效转动角速度,实际就是状态①坐标系中绕Z轴的角速度在状态③坐标系中的新的坐标。

同理,dp/dt还需要经历1次旋转变换,而dr/dt不需要经历旋转。

将dy/dt,dp/dt,dr/dt三者都变换到状态③坐标系中的新的坐标相加,实际就是状态③时刻陀螺仪自己读到的gyro数据。

所以,从dr/dt等角速度到陀螺仪读到的角速度gx等的转换关系推导过程如下:

 

 

进一步,再把这里的状态③理解为状态n,则根据状态n时刻读到的陀螺仪数据,反解dy/dt等角速度数据,即可更新得到状态n+1的姿态。反解就是求逆矩阵,即:

 

 

6姿态融合  

由上面的分析可知,加速度计在静止时刻,根据感受到的重力加速度,可以计算出roll和pitch角,并且角度计算只与当前姿态有关。而陀螺仪是对时间间隔内的角速度积分,得到每一次的角度变换量,累加到上一次的姿态角上,得到新的姿态角,陀螺仪可以计算roll、pitch、yaw三个角。

实际上,加速度仅在静止时刻可以得到较准确的姿态,而陀螺仪仅对转动时的姿态变化敏感,且陀螺仪若本身存在误差,则经过连续的时间积分,误差会不断增大。需要结合两者计算的姿态,进行互补融合。当然,这里只能对roll和pitch融合,因为加速度计没有得到yaw。

 

 

K为比例系数,需要根据实际来调整,如选用0.4。

 

7MATLAB公式推导  

上面的一些推导计算过程,可用MATLAB来辅助计算,防止手工计算出错:

先定义3个旋转矩阵Y


% 旋转顺序:Z,Y,X(从大地坐标系到IMU坐标系)% 定义一些符号 r=row p=pitch y=yawsyms r p y% 3个旋转矩阵(坐标系旋转,注意负号的位置!)M_x = [ 1, 0, 0; 0, cos(r), sin(r); 0, -sin(r), cos(r)]; M_y = [cos(p), 0, -sin(p); 0, 1, 0; sin(p), 0, cos(p)];M_z = [ cos(y), sin(y), 0; -sin(y), cos(y), 0; 0, 0, 1];

推导陀螺仪的变换矩阵


%% 推导陀螺仪的变换矩阵%定义一些符号 drdt dpdt dydt 指的是分别对 roll pitch yaw求导,也就是角速度syms drdt dpdt dydt% 绕x轴转动 row 的角速度dr_t = [drdt; 0; 0]; % 绕y轴转动 pitch 的角速度dp_t = [ 0; dpdt; 0]; % 绕z轴转动 yaw 的角速度dy_t = [ 0; 0; dydt];% [矩阵X*矩阵Y*yaw角速度(绕Z)] + [矩阵X*pitch角速度(绕Y)] + [roll角速度(绕X)]% IMU_gyro实际就是IMU测得的3个陀螺仪数据IMU_gyro = M_x*M_y*dy_t + M_x*dp_t + dr_t;fprintf('M_x*M_y*dy_t + M_x*dp_t + dr_t=')disp(IMU_gyro)% roll pitch yaw角速度组成的列向量,这个实际是要求的大地坐标系的3个角速度rpy_t = [drdt; dpdt; dydt];%手动分解IMU_gyro为矩阵M_gyro与列向量rpy_t相乘的形式%根据IMU_gyro写出M_gyro,该矩阵将大地坐标系的角速度转换为IMU坐标系M_gyro = [ 1, 0, -sin(p); 0, cos(r),cos(p)*sin(r); 0,-sin(r),cos(p)*cos(r)];%验证一下if M_gyro * rpy_t==IMU_gyro fprintf('M_gyro is true');else fprintf('M_gyro is false');endfprintf('M_gyro=')disp(M_gyro)% 对M_gyro求逆矩阵,用于将IMU坐标系的陀螺仪角速度值转换到大地坐标系M_gyro_inv = inv(M_gyro);fprintf('M_gyro_inv=')disp(M_gyro_inv)  % matlab求解的逆矩阵需要在再手工化简M_gyro_inv_ =[ 1, (sin(p)*sin(r))/cos(p), (cos(r)*sin(p))/cos(p); 0, cos(r), -sin(r); 0, sin(r)/cos(p), cos(r)/cos(p)]; % 验证一下,M_gyro_inv_ * M_gyro_inv应该是单位矩阵fprintf('M_gyro_inv_ * M_gyro=')disp(M_gyro_inv_ * M_gyro)fprintf('M_gyro_inv_ =')disp(M_gyro_inv_)

运行后的输出结果:


M_x*M_y*dy_t + M_x*dp_t + dr_t= drdt - dydt*sin(p) dpdt*cos(r) + dydt*cos(p)*sin(r) dydt*cos(p)*cos(r) - dpdt*sin(r) M_gyro is trueM_gyro=[ 1, 0, -sin(p)][ 0, cos(r), cos(p)*sin(r)][ 0, -sin(r), cos(p)*cos(r)] M_gyro_inv=[ 1, (sin(p)*sin(r))/(cos(p)*cos(r)^2 + cos(p)*sin(r)^2), (cos(r)*sin(p))/(cos(p)*cos(r)^2 + cos(p)*sin(r)^2)][ 0, cos(r)/(cos(r)^2 + sin(r)^2), -sin(r)/(cos(r)^2 + sin(r)^2)][ 0, sin(r)/(cos(p)*cos(r)^2 + cos(p)*sin(r)^2), cos(r)/(cos(p)*cos(r)^2 + cos(p)*sin(r)^2)] M_gyro_inv_ * M_gyro=[ 1, 0, cos(r)^2*sin(p) - sin(p) + sin(p)*sin(r)^2][ 0, cos(r)^2 + sin(r)^2, 0][ 0, 0, cos(r)^2 + sin(r)^2] M_gyro_inv_ =[ 1, (sin(p)*sin(r))/cos(p), (cos(r)*sin(p))/cos(p)][ 0, cos(r), -sin(r)][ 0, sin(r)/cos(p), cos(r)/ 

相关资料


猜您喜欢


分流器作为重要的无源器件,应用于信号分配和功率分配系统中。RALEC(旺诠)作为知名的分流器品牌,高品质的产品性能和可靠的品牌信誉,赢得了众多客户的青睐。本文将...
2016-04-26 02:17:30
在FPGA系统设计中,按键是最常见的人机交互接口部件。在没有微控制器参与的情况下,FPGA系统中按键的功能相对较弱,通常可以将按键抖动和按键处理结合起来统一考虑...
2020-07-20 17:13:00
随着电子产品的不断普及和技术的快速发展,贴片保险丝作为电路保护的重要元件,其性能和材料选择显得尤为关键。本文将全面介绍贴片保险丝材料的相关知识,帮助读者了解不同...
2025-11-11 23:00:38
电解电容器是重要的电子元器件。应用于各种电路中。电解液是电解电容器的关键部分。本文将介绍电解电容器用电解液配方。电解液的基本成分电解液通常由溶剂和电解质组成。溶...
2025-04-12 09:00:06
想要提升电脑性能,体验更流畅的游戏和更快的应用程序响应速度?那么升级到支持 DDR5 内存的新主板绝对是你的最佳选择!DDR5 作为新一代内存技术,相比 DDR...
2023-12-28 00:00:00
2023年9月13日,SENSOR CHINA中国(上海)国际传感器技术与应用展览会在上海跨国采购中心开幕,美泰公司携多款MEMS传感器参展,在同期举办的中国传...
2023-09-15 09:43:00
贴片电阻上的4704并不是阻值本身,而是一种代码,需要进行解码才能得到实际阻值。 4704采用的是EIA标准的4位数字表示法。前三位数字470代表有效数字,最后...
2024-11-29 10:25:56
一、光纤传感器光纤传感器是一种将被测对象的状态转变为可测的光信号的传感器。光纤传感器的工作原理是将光源入射的光束经由光纤送入调制器,在调制器内与外界被测参数的相...
2023-09-12 08:08:00
升功率电阻作为重要的基础元件,应用于电路的限流、分压和功率消耗等环节。Viking(光颉)作为国内知名的升功率电阻品牌,其产品因性能稳定、规格齐全而受到工程师青...
2017-04-28 08:24:30
牛皮纸胶带是常见的包装和封箱材料,其参数决定了其适用性和性能。牛皮纸胶带的宽度通常在1.5厘米到10厘米之间,用户可以根据实际需求选择合适的宽度。胶带的厚度一般...
2008-06-13 00:00:00