四轴飞行器6050六轴传感器软件姿态解算

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

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

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

转换成矩阵形式表示为:

整理一下:

所以从旋转到可以写成

上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次:

上面得到了一个表示旋转的方向余弦矩阵。

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

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

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

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

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

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

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

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

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

<code>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 其实就是上一次的欧拉角(四元数)的机体坐标参考系换算出来的重力的单位向量。

<code>// 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就是两个重力向量的叉积。

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

<code>// integral error scaled integral gain exInt = exInt + ex*Ki; eyInt = eyInt + ey*Ki; ezInt = ezInt + ez*Ki; 

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

<code>// 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为测量周期,为陀螺仪角速度,以下都是已知量,这里使用了一阶龙哥库塔求解四元数微分方程:

<code>// 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;   

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

所以有:

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

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

Q_ANGLE.X = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
时间: 2025-01-13 11:27:39

四轴飞行器6050六轴传感器软件姿态解算的相关文章

软件姿态解算

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法. 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有. 转换成矩阵形式表示为: 整理一下: 所以从旋转到可以写成 上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: 上面得到了一个表示旋转的方向余弦矩阵. 不过要想用欧拉角解算姿态,其实我们套用欧拉

四轴飞行器1.4 姿态解算和Matlab实时姿态显示

原创文章,欢迎转载,转载请注明出处 MPU6050数据读取出来后,经过一个星期的努力,姿态解算和在matlab上的实时显示姿态终于完成了. 1:完成matlab的串口,并且实时通过波形显示数据 2:添加RTT查看CPU使用率的扩展功能,MPU6050读取数据的优化 3:四元素表示的坐标变化,四元素与欧拉角的关系和Madgwick的IMUupdate算法 4:飞控数据采集线程和数据处理线程的安排,类似于生产者与消费者的关系. 先放个效果视频... 如果看不了视频,请打开视屏网址:http://v.

Arduino101学习笔记(十三)&mdash;&mdash; 101六轴传感器

一.相关API 1.begin:需要在其他CUIREIMU前调用 //********************************************************************************************* //函数名称:CurieImu.begin() //输入参数:无 //函数返回:无 //函数功能:开六轴传感器,必须第一个调用 //*******************************************************

卡尔曼(Kalman)滤波(六)--卡尔曼滤波的应用: 四元数卡尔曼滤波(QKF)的C代码实现姿态解算

0 引言 在捷联惯导工程实践[6]中,我们希望陀螺仪能够非常精确的获取信息,或者说希望陀螺仪能非常准确的地反映观测量(加速度,磁场等)[6,7]的真实值,但是这个过程或多或少是受到噪声干扰的,导致测量的不准确:为了能够让陀螺仪在状态更新时做到准确,必须对状态变量和观测量进行数据融合和滤波,从而尽最大限度的降低噪声的干扰. 最常用也最有效的方法非卡尔曼滤波莫属,其在处理高斯模型的系统上效果颇佳:随着计算机技术的发展,Kalman滤波的计算要求和复杂性已不再成为其应用中的阻碍,并且越来越受到人们的青

[UVA]Pixhawk之姿态解算篇(2)

一.开篇 还是没能进入到源码部分研究,对姿态解算过程太过于模糊,所以主要开始研究一下关于姿态解算的过程和实现,本篇博文主要是以mahony的算法为基础理解姿态解算的过程,主要参考的论文就是William Premerlani and Paul Bizard的关于DCM的一篇经典论文<Direction Cosine Matrix IMU_Theory>,一定要搞透这偏论文,没看过它都不敢称自己研究过飞控算法:然后接下来还有madgwick和mahony的论文需要研究,看英文的比较费时间,但是还

[UVA]Pixhawk之姿态解算篇(3)_源码姿态解算算法分析

一.开篇 终于到ardupilot源代码的姿态解算了,有了前期关于mahony姿态解算算法的基础以后,理解源代码的姿态解算算法就快多了,所有的东西都在脑海中初步有了一个框架:首先要做什么,然后再做什么,再然后捏~~~反正容易上手的. 2016.04.04日晚,别人都在嗨,而我却在实验室苦逼的工作着,今晚最大的收获就是发现了"新大陆"-----"北航可靠飞行控制研究组",其喜悦之情绝不亚于哥伦布发现新大陆.他们才是专业的啊,看看他们毕业生的去向,不是研究所就是出国深造

[UVA]Pixhawk之姿态解算篇(4)_补充篇

一.开篇 大家期待已久的第四篇来了,但是本篇可能比较水啊~~~见谅~~~ 首先,上一周没有什么收获,虽然看了不少的论文,但是却没有什么质的飞越~~~~ 看的论文都是关于姿态解算的,用的算法大部分也都是基于mahony算法的扩展,就当是深入理解一下姿态解算过程吧,稍微写写上周总结的一丁点的知识. 昨天开了一整天的会议,最终决定姿态解算部分还是需要用EKF做,慢慢搞吧,但是我还是先把姿态控制部分解决了,感觉这个部分也相当重要. 二.版权声明 博主:summer 声明:喝水不忘挖井人,转载请注明出处.

Pixhawk之姿态解算篇(1)_入门篇(DCM Nomalize)

一.开篇 慢慢的.慢慢的.慢慢的就快要到飞控的主要部分了,飞控飞控就是所谓的飞行控制呗,一个是姿态解算一个是姿态控制,解算是解算,控制是控制,各自负责各自的任务.我也不懂.还在学习中~~~~ 近期看姿态预计部分看的太累了,明显发现基础知识太薄弱,什么欧拉角.DCM.四元数.gyro误差.矫正.正交化等各个概念.然后就是各种转换公式.接下来结合代码介绍一些主要的东西.太深入的还不了解~~~ 一定要多看论文啊,英文版的论文(也没有中文的.国人的悲哀啊).尽管看着头疼,看是看完了以后就会发现很多不了解

Arduino 与 MPU6050 姿态解算+ PROCESSING

买的MPU6050自带姿态解算大大减轻了上层处理器所做的工作. 通过熟悉了一下processing之后做了一个小例子更是感觉这个传感器的奇妙. Arduino部分 主要是读取MPU6050数据并将采集到的欧拉角通过串口打印到上位机,采集数据很简单,MPU6050接到arduino mega2560的serial1上便可接收数据,然后通过serial传输到电脑上.MPU6050自带了卡尔曼滤波,所以上层更是直接使用了数据,观测得误差确实很少,很实用的传感器. 注: MPU6050使用的是串口模式,