MPU6050软件姿态解算

我是勤劳的搬运工。

转自 http://blog.sina.com.cn/s/blog_c5a00db10102wd7d.html

         http://mini.eastday.com/mobile/180306210610472.html

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。

我们先来看看如何用欧拉角描述一次平面旋转(坐标变换):

MPU6050的四元数解算姿态方法

 

设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。

MPU6050的四元数解算姿态方法

转换成矩阵形式表示为:

MPU6050的四元数解算姿态方法

整理一下:

MPU6050的四元数解算姿态方法

所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次:

MPU6050的四元数解算姿态方法
上面得到了一个表示旋转的方向余弦矩阵。

不过要想用欧拉角解算姿态,其实我们套用欧拉角微分方程就行了:

MPU6050的四元数解算姿态方法

上式中左侧,是本次更新后的欧拉角,对应row、pit、yaw。右侧,是上个周期测算出来的角度,三个角速度由直接安装在四轴飞行器的三轴陀螺仪在这个周期转动的角度,单位为弧度,计算间隔时T陀螺角速度,比如0.02秒0.01弧度/秒=0.0002弧度。间因此求解这个微分方程就能解算出当前的欧拉角。

前面介绍了什么是欧拉角,而且欧拉角微分方程解算姿态关系简单明了,概念直观容易理解,那么我们为什么不用欧拉角来表示旋转而要引入四元数呢?

一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时解算带来了一定的困难。而且当俯仰角为90度时方程式会出现神奇的“GimbalLock”。所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。

四元数法只求解四个未知量的线性微分方程组,计算量小,易于操作,是比较实用的工程方法。

我们知道在平面(x,y)中的旋转可以用复数来表示,同样的三维中的旋转可以用单位四元数来描述。我们来定义一个四元数:

MPU6050的四元数解算姿态方法

我们可以把它写成,其中,。那么是矢量,表示三维空间中的旋转轴。w是标量,表示旋转角度。那么就是绕轴旋转w度,所以一个四元数可以表示一个完整的旋转。只有单位四元数才可以表示旋转,至于为什么,因为这就是四元数表示旋转的约束条件。

而刚才用欧拉角描述的方向余弦矩阵用四元数描述则为:

MPU6050的四元数解算姿态方法

所以在软件解算中,我们要首先把加速度计采集到的值(三维向量)转化为单位向量,即向量除以模,传入参数是陀螺仪x、y、z值和加速度计x、y、z值:

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) 

{ float norm; 

float vx, vy, vz; float ex, ey, ez;           

norm = sqrt(ax*ax + ay*ay + az*az);       

ax = ax / norm; 

ay = ay / norm; 

az = az / norm;  

下面把四元数换算成方向余弦中的第三行的三个元素。刚好vx、vy、vz 。其实就是上一次的欧拉角(四元数)的机体坐标参考系换算出来的重力的单位向量。

estimated direction of gravity vx = 2*(q1*q3 - q0*q2);

vy = 2*(q0*q1 + q2*q3); 

vz = q0*q0 - q1*q1 - q2*q2 + q3*q3; 

axyz是机体坐标参照系上,加速度计测出来的重力向量,也就是实际测出来的重力向量。

axyz是测量得到的重力向量,vxyz是陀螺积分后的姿态来推算出的重力向量,它们都是机体坐标参照系上的重力向量。

那它们之间的误差向量,就是陀螺积分后的姿态和加计测出来的姿态之间的误差。

向量间的误差,可以用向量叉积(也叫向量外积、叉乘)来表示,exyz就是两个重力向量的叉积。

这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。(你可以自己拿东西想象一下)由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。

integral error scaled integral gain exInt = exInt + ex*Ki;

eyInt = eyInt + ey*Ki; 

ezInt = ezInt + ez*Ki; 

用叉积误差来做PI修正陀螺零偏

integral error scaled integral gain exInt = exInt + ex*Ki; 

eyInt = eyInt + ey*Ki; 

ezInt = ezInt + ez*Ki;  // adjusted gyroscope measurements 

gx = gx + Kp*ex + exInt; 

gy = gy + Kp*ey + eyInt; 

gz = gz + Kp*ez + ezInt; 

四元数微分方程,其中T为测量周期,为陀螺仪角速度,以下都是已知量,这里使用了一阶龙哥库塔求解四元数微分方程:

integrate quaternion rate and normalise 

q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT; 

q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT; 

q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT; 

q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;   

最后根据四元数方向余弦阵和欧拉角的转换关系,把四元数转换成欧拉角:

MPU6050的四元数解算姿态方法 

所以有:

ANGLE.Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw 

ANGLE.Y= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch 

ANGLE.X= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll

 

下面补充一下四元数与欧拉角之间的转换:

规定:

1、航空次序欧拉角:

Z轴(航偏角,yaw,Ψ)

Y轴(俯仰角,pitch,θ)

X轴(滚转角,roll,Φ)

2、导航坐标系(N系)为O-ENU坐标系,即东北天坐标系。且机体坐标系初始状态与导航坐标系重合。即有: 导航坐标系X轴指向正东方向,机头也朝向正东方向;

导航坐标系Y轴指向正北方向,机左翼指向正北方向;

导航坐标系Z轴垂直地表指向天空,垂直机体指向天空。

3、每个轴都以逆时针旋转的角度为正角度。

第一步:求姿态矩阵

1、旋转Z轴

旋转前坐标:(x0, y0, z0), 旋转后坐标:(x1, y1, z1)

2、旋转Y轴

旋转前坐标:(x1, y1, z1), 旋转后坐标:(x2, y2, z2)

3、旋转X轴

旋转前坐标:(x2, y2, z2), 旋转后坐标:(x3, y3, z3)

4、设导航坐标系(N系)坐标为(x0, y0, z0),

载体坐标系(B系)坐标为(x3, y3, z3)

则:

二、四元数旋转矩阵

设旋转前坐标:(x0, y0, z0), 旋转后坐标:(x3, y3, z3)

三、四元数转换欧拉角

以上矩阵一一对应。

四、欧拉角转四元数

按照旋转顺序:ZYX

则(设旋转前坐标:(x0, y0, z0), 旋转后坐标:(x3, y3, z3)):

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MPU6050是一款常用的六轴惯性测量单元,可以用来测量三维空间中的加速度和角速度。软件姿态解算是指通过处理MPU6050的原始数据,计算出物体在空间中的姿态角度。 软件姿态解算源码是指用于计算姿态角度的程序代码。通常,这种源码主要包含以下几个步骤: 1. 数据采集:通过MPU6050读取加速度和角速度的原始数据,以一定的采样频率进行数据采集。 2. 数据预处理:对采集到的原始数据进行预处理,消除噪声和偏差。常见的方法包括滤波、校准和陀螺仪零位修正等。 3. 姿态解算算法:根据采集到的预处理数据,采用不同的姿态解算算法进行计算。常见的算法包括互补滤波、卡尔曼滤波、四元数等。 4. 姿态稳定:根据算法计算得到的姿态角度,可以用来实现姿态稳定控制。例如,通过应用PID控制算法,使得物体保持平衡或者根据需求进行动作。 最后,软件姿态解算源码通常是通过编程语言(例如C、C++或者Python)实现的。在实际应用中,可以根据自己的需求和硬件平台选择合适的源码,并进行适当的修改和优化。 ### 回答2: MPU6050是一种常用的多功能运动传感器,能同时测量加速度计和陀螺仪的数据。软件姿态解算是指利用传感器提供的数据来计算物体的姿态(即姿势或方向)。 在MPU6050软件姿态解算源码中,通常会包含以下几个关键部分: 1. 数据读取:源码会通过接口与MPU6050进行通信,并读取加速度计和陀螺仪的原始数据。这些数据包括加速度计在三个轴上的加速度值和陀螺仪在三个轴上的角速度值。 2. 数据处理:源码会对原始数据进行一些处理,例如校准、滤波和单位转换。校准是为了消除传感器的误差,滤波则可以去除噪音和抖动,单位转换可将数据转换为合适的物理量(例如角度)。 3. 姿态解算算法:源码会使用某种姿态解算算法来计算物体的姿态。常见的算法包括互补滤波、卡尔曼滤波和四元数等。这些算法会将加速度计和陀螺仪的数据进行融合,得出准确的姿态信息。 4. 姿态输出:源码会将计算得到的姿态信息输出到用户界面或控制系统。输出可以是欧拉角(即俯仰、横滚和偏航角),也可以是四元数或旋转矩阵等形式。 MPU6050软件姿态解算源码的实现需要对传感器的数据特性和姿态解算算法有一定的了解和实现经验。在实际应用中,还可以根据具体需求进行优化和改进,以提高解算的准确性和效率。 ### 回答3: mpu6050是一款常用的惯性测量单元(IMU),它包含一个三轴加速度计和一个三轴陀螺仪。软件姿态解算是指通过对这些传感器的数据进行处理,来估计物体的姿态信息。 mpu6050软件姿态解算源码是一段程序代码,用于通过读取mpu6050传感器的数据并进行分析,计算出物体的姿态信息。通常,这段源码会包含一些矩阵运算、卡尔曼滤波等算法,以提高解算的准确性和稳定性。 在源码中,首先会使用合适的通信协议(如I2C)与mpu6050进行通信,读取传感器的原始数据。然后,通过一些数学计算,将加速度计和陀螺仪的数据转化为俯仰、滚转和偏航角等姿态参数。 源码中可能会使用到各种数学库和算法,例如旋转矩阵、四元数等,来进行姿态解算的计算。这些算法会根据传感器数据的更新频率和准确性,结合一些滤波和校准方法,来减少误差和漂移,提高姿态解算的精确度。 总的来说,mpu6050软件姿态解算源码是通过对传感器数据进行处理和计算,来获取物体的姿态信息的程序代码。它在无人机、机器人、虚拟现实等领域有着广泛的应用,能够辅助控制和定位系统的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值