MPU |
您所在的位置:网站首页 › mpu6050原理图库网盘资源 › MPU |
一、四元数1.复数相乘 我们知道,复数的代数表示为
但是,这只是向量在二维平面的旋转。如果对于三维向量是否能用乘以一个单位向量来表示旋转,这就引出了四元数。 2.四元数四元数是由哈密顿在1843年爱尔兰发现的。当时他正研究扩展复数到更高的维次(复数可视为平面上的点)。他不能做到三维空间的例子,但四维则造出四元数。[1] 单位四元数可以充当三维向量旋转时相乘的作用因子。 四元数的表示方法 代数式 实矩阵形式 给定一个用于旋转的单位四元数
欧拉角是用来唯一地确定定点转动刚体位置的三个一组独立角参量,由章动角θ、进动角ψ和自转角φ组成,为L.欧拉首先提出,故得名。 静态定义:对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。 动态定义:我们也可以给予欧拉角两种不同的动态定义。一种是绕着固定于刚体的坐标轴的三个旋转的复合;另外一种是绕着实验室参考轴的三个旋转的复合。[4] 欧拉角旋转序列(Euler Angle Rotational Sequence)一共有18种顺规,6种绕三条轴的旋转(Tait-Bryan Angle,XYZ,XZY,YXZ,YZX,ZXY,ZYX),另外12种只绕两条轴的旋转(Proper Euler Angle,XYX,YXY,XZX,ZXZ,YZY,ZYZ,XY,YX,XZ,ZX,YZ,ZY)。一共有18种基础旋转的组合顺序,它们可以旋转出三维的所有旋转状态。所以一共是18种旋转顺规(可以表示所有三维旋转的集合)。[5] 我们可以用旋转矩阵来表示三维向量的旋转过程。这里先自定义一下每次的旋转名称和符号: 绕Z轴旋转:航向角yaw(y)绕Y轴旋转:俯仰角pitch(p)绕X轴旋转:横滚角roll(r)
我们以ZYX顺规为例,则ZYX顺规的欧拉角旋转矩阵为
那么对于三维向量
(左乘是相对固定坐标系,右乘是相对当前坐标系)。[6] 三、四元数与欧拉角1.四元数转旋转矩阵利用罗德里格旋转公式(Rodrigues公式)可以由四元数求得旋转矩阵[7] 四元数转化欧拉角可以先将四元数转换为旋转矩阵,同时欧拉角也可以用旋转矩阵来表示(旋转矩阵在四元数转欧拉角中起到了重要作用,相当于转换的“桥梁”。) 对于同一三维旋转过程,用欧拉角旋转矩阵来表示和四元数旋转矩阵来表示是等价的,即
对比可得
类比欧拉角顺规方式(以ZYX顺规为例),我们将旋转四元数
至于为何要这样表示,我想前面提到的图片和公式可以告诉你答案(这里请聪明的你自己意会)
把
其中 再与实矩阵形式
其实我们主要是想通过MPU6050得到欧拉角和四元数(可以用算法实现,但是比较复杂)。要通过MPU6050得到四元数和欧拉角,这个过程有两种方法,一种是用原始数据(三轴加速度,三轴角速度),通过一些(卡尔曼滤波、积分运算、减少误差零点漂移等)姿态融合算法转化即可。另一种直接用MPU6050内部的自带的数字运动处理器(即DMP)。DMP就是对三轴加速度计和三轴陀螺仪的ADC数据进行融合计算,得出四元数,再利用四元数计算姿态角。想要实现DMP一般有2种方式:硬件DMP和软件DMP。 1.硬件DMP我们要用这个DMP功能的话,就要实现加载固件。 那么DMP怎么拿呢,Invensense公司有提供了一个MPU6050的嵌入式运动驱动库,进而我们可以通过这个库移植很方便得出欧拉角。不过Invensense公司提供的MPU6050运动驱动库是基于MSP430芯片的,需要将其移植到其他芯片上,(比如STM32F1系列),当然就要移植修改代码了。[8] 2.软件DMP在此之前,我们先来看前面的欧拉角旋转矩阵
不过要想用欧拉角解算姿态,我们还需要结合欧拉角微分方程[9](mpu6050输出的是六轴数据,除了三轴加速度,还有三轴角速度,这六个数据是都要用上) 上式中左侧,是本次更新后的欧拉角,对应roll、pitch、yaw。右侧,是上个周期测算出来的角度,三个角速度为mpu6050输出的在这个周期内的角速度,因此求解这个微分方程就能解算出当前的欧拉角。前面介绍了什么是欧拉角,而且欧拉角微分方程解算姿态关系简单明了,概念直观容易理解,那么我们为什么不用欧拉角来表示旋转而要引入四元数呢? 一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时解算带来了一定的困难。而且当俯仰角为90度时方程式会出现GimbalLock(万向锁)现象。所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态的姿态确定。四元数法只求解四个未知量的线性微分方程组,计算量小,易于操作,是比较实用的工程方法。 在软件解算中,我们要首先把加速度计采集到的值(三维向量)转化为单位向量,即向量除以模,传入参数是陀螺仪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(axax + ayay + azaz); ax = ax / norm; ay = ay / norm; az = az / norm;下面把四元数换算成方向余弦中的第三行的三个元素。刚好vx、vy、vz 。其实就是上一次的欧拉角(四元数)的机体坐标参考系换算出来的重力的单位向量。 vx = 2(q1q3 - q0q2); vy = 2*(q0q1 + q2q3); vz = q0q0 - q1q1 - q2q2 + q3q3;axyz是机体坐标参照系上,加速度计测出来的重力向量,也就是实际测出来的重力向量。axyz是测量得到的重力向量,vxyz是陀螺积分后的姿态来推算出的重力向量,它们都是机体坐标参照系上的重力向量。那它们之间的误差向量,就是陀螺积分后的姿态和加计测出来的姿态之间的误差。向量间的误差,可以用向量叉积(也叫向量外积、叉乘)来表示,exyz就是两个重力向量的叉积。这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。(你可以自己拿东西想象一下)由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。 ex=(ayvz-azvy); ey=(azvx-axvz); ez=(axvy-ayvx);用叉积误差来做PI修正陀螺零偏 exInt = exInt + exKi; eyInt = eyInt + eyKi; ezInt = ezInt + ezKi; // adjusted gyroscope measurements gx = gx + Kpex + exInt; gy = gy + Kpey + eyInt; gz = gz + Kpez + ezInt;四元数微分方程,其中T为测量周期,为陀螺仪角速度,以下都是已知量,这里使用了一阶龙格库塔法[10]求解四元数微分方程: q0 = q0 + (-q1gx - q2gy - q3gz)halfT; q1 = q1 + (q0gx + q2gz - q3gy)halfT; q2 = q2 + (q0gy - q1gz + q3gx)halfT; q3 = q3 + (q0gz + q1gy - q2gx)halfT;最后根据四元数方向余弦阵和欧拉角的转换关系,把四元数转换成欧拉角;即利用前面的公式 所以有: ANGLE.Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2q2 - 2 * q3q3 + 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完整程序 //变量定义 #define Kp1 00.0f//比例增益支配率收敛到加速度计/磁强计 #define Ki 0.002f//积分增益支配率的陀螺仪偏见的衔接 #define halfT 0.001f//采样周期的一半 float q0=1,q1=0,q2=0,q3=0;//四元数的元素,代表估计方向 float exInt=0,eyInt=0,ezInt=0;//按比例缩小积分误差 float Yaw,Pitch,Roll;//偏航角,俯仰角,翻滚角 voidIMUupdate(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=2*(q1*q3-q0*q2); vy=2*(q0*q1+q2*q3); vz=q0*q0-q1*q1-q2*q2+q3*q3; //错误的领域和方向传感器测量参考方向之间的交叉乘积的总和 ex=(ay*vz-az*vy); ey=(az*vx-ax*vz); ez=(ax*vy-ay*vx); //积分误差比例积分增益 exInt=exInt+ex*Ki; eyInt=eyInt+ey*Ki; ezInt=ezInt+ez*Ki; //调整后的陀螺仪测量 gx=gx+Kp*ex+exInt; gy=gy+Kp*ey+eyInt; gz=gz+Kp*ez+ezInt; //整合四元数率和正常化 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; //正常化四元 norm=sqrt(q0*q0+q1*q1+q2*q2+q3*q3); q0=q0/norm; q1=q1/norm; q2=q2/norm; q3=q3/norm; Pitch=asin(-2*q1*q3+2*q0*q2)*57.3;//pitch,转换为度数 Roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3;//rollv Yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57.3;//Yaw }封面[11] 注:图片来源和没有详细推导的地方请查看对应的参考链接(呜呜呜嘿嘿嘿,神志不清+麻了.jpg)。 参考^https://baike.baidu.com/item/%E5%9B%9B%E5%85%83%E6%95%B0/5795379?fr=aladdin^https://zhuanlan.zhihu.com/p/45404840^https://www.zhihu.com/question/532400814/answer/2482525902^https://baike.baidu.com/item/%E6%AC%A7%E6%8B%89%E8%A7%92/1626212?fr=aladdin^https://zhuanlan.zhihu.com/p/45404840^https://www.zhihu.com/question/407150749/answer/1342043076^https://blog.csdn.net/lql0716/article/details/72597719^https://blog.csdn.net/qq_43460068/article/details/123490067^https://zhuanlan.zhihu.com/p/104820868^https://blog.csdn.net/AASDSADAD/article/details/73080832^https://baijiahao.baidu.com/s?id=1705722954735345671&wfr=spider&for=pc |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |