精华内容
下载资源
问答
  • MPU6050姿态解算STM32源码(卡尔曼滤波MPU6050姿态解算STM32源码(卡尔曼滤波MPU6050姿态解算STM32源码(卡尔曼滤波MPU6050姿态解算STM32源码(卡尔曼滤波
  • 本人亲测好用的MPU6050姿态解算STM32源码(卡尔曼滤波)算法,希望帮助大家
  • Arduino提高篇17—MPU6050姿态解算

    千次阅读 热门讨论 2020-03-17 09:28:26
    MPU6050姿态解算

    Photo by Mitch Nielsen on Unsplash

    对于大多数MPU6050的应用来说,获取到的原始数据并没有多大用处,我们需要对原始数据进行姿态融合解算,最终得到姿态数据,也就是三个欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。

    MPU6050内部自带数字运动处理器(DMP)硬件加速引擎,配合运动驱动库直接输出四元数,进而很方便的计算出欧拉角,大大降低了主控MCU的负担。本篇使用MPU6050的驱动库来获取姿态数据。

    1. MPU6050驱动库安装

    MPU6050的驱动库有很多,我们可以在IDE中单击「项目」—「加载库」—「管理库」,在搜索栏输入"6050",可以看到不同的驱动库。

    多种驱动库

    本篇我们使用的由国外大牛Jeff Rowberg开发的库并没有在列表中,需要下载后导入到Arduino。点击跳转到Github下载。

    下载库文件

    下载到的库文件其实是多种设备的IIC驱动库,我们这里只需要两个文件夹下的文件。解压后,进入"Arduino"文件夹,里面的"I2Cdev"和"MPU6050"就是我们需要的文件。

    选择库文件

    找到Arduino的libraries文件路径,Windows下路径为"C:\Users\Tony\Documents\Arduino\libraries",修改“Tony”为你的电脑用户名。我们拷贝这两个文件夹到该路径下,至此库文件安装完成。

    拷贝库文件

    2. 实验材料

    • Uno R3开发板
    • 配套USB数据线
    • 面包板及配套连接线
    • MPU6050传感器模块

    3. 实验步骤

    1. 根据原理图搭建电路图。

    MPU6050传感器模块的VCC、GND分别连接开发板的3.3V、GND,传感器的SDA、SCL引脚连接开发板A4、A5引脚。

    实验原理图如下图所示:

    实验原理图

    实物连接图如下图所示:

    实物连接图

    2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

    /*
       DMP
       MPU6050姿态解算
    */
    
    #include "I2Cdev.h"
    #include "MPU6050_6Axis_MotionApps20.h"
    
    MPU6050 mpu;
    uint8_t fifoBuffer[64];
    Quaternion q;
    VectorFloat gravity;
    float ypr[3];
    
    void setup()
    {
      Serial.begin(115200);
      mpu.initialize();
      mpu.dmpInitialize();
      mpu.CalibrateAccel(6);
      mpu.CalibrateGyro(6);
      mpu.PrintActiveOffsets();
      mpu.setDMPEnabled(true);
    }
    
    void loop()
    {
      if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer))
      {
        mpu.dmpGetQuaternion(&q, fifoBuffer);
        mpu.dmpGetGravity(&gravity, &q);
        mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
        Serial.print("ypr\t");
        Serial.print(ypr[0] * 180 / M_PI);
        Serial.print("\t");
        Serial.print(ypr[1] * 180 / M_PI);
        Serial.print("\t");
        Serial.println(ypr[2] * 180 / M_PI);
      }
    }
    

    3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    程序下载

    4. 实验现象

    打开串口监视器,波特率设置成与程序中相一致的115200。监视器中输出三个欧拉角数据,移动MPU6050,数据发生变化。

    实验现象


    关注公众号「TonyCode」,后台回复“提高”,获取文中代码。
    TonyCode

    展开全文
  • MPU6050姿态解算STM32源码(DMP),非常好用,支持keil。
  • MPU6050姿态解算STM32源码(互补滤波),MPU6050六轴传感器实验例子,学习MPU6050 六轴传感器(三轴加速度+三轴陀螺仪)的使用.
  • 本人亲测非常好用的MPU6050姿态解算STM32源码(互补滤波)算法,希望帮助大家
  • MPU6050姿态解算2-欧拉角&旋转矩阵

    千次阅读 多人点赞 2020-08-23 19:10:40
    之前的文章MPU6050姿态解算1-DMP方式已将对MPU6050这款IMU作了简单的介绍,并通过其内部的DMP处理单元直接得到姿态解算的四元数结果。本篇将通过软件解算的方式,利用欧拉角与旋转矩阵来对陀螺仪与加速度计的原始...

    IMU姿态解算

    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的实际含义如下图:

    在这里插入图片描述

    旋转矩阵

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

    欧拉角旋转

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

    加速度计解算姿态角

    加速度计测量的是其感受到的加速度,在静止的时候,其本身是没有加速运动的,但因为重力加速度的作用,根据相对运动理论,其感受的加速度与重力加速度正好相反,即读到的数据是竖直向上的。加速度计的英文简写为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次旋转过程的分解过程如下图:

    陀螺仪解算姿态角

    陀螺仪测量的绕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的姿态。反解就是求逆矩阵,即:

    姿态融合

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

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

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

    MATLAB公式推导

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

    先定义3个旋转矩阵Y

    % 旋转顺序:Z,Y,X(从大地坐标系到IMU坐标系)
    
    % 定义一些符号 r=row p=pitch y=yaw
    syms 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=\r\n')
    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\r\n');
    else
        fprintf('M_gyro is false\r\n');
    end
    fprintf('M_gyro=\r\n')
    disp(M_gyro)
    
    % 对M_gyro求逆矩阵,用于将IMU坐标系的陀螺仪角速度值转换到大地坐标系
    M_gyro_inv = inv(M_gyro);
    fprintf('M_gyro_inv=\r\n')
    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=\r\n')
    disp(M_gyro_inv_ * M_gyro)
    fprintf('M_gyro_inv_ =\r\n')
    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 true
    
    M_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)/cos(p)]
    

    程序先计算出了M_x*M_y*dy_t + M_x*dp_t + dr_t,然后手工分解为M_gyrorpy_t相乘的形式,最后求得M_gyro的逆矩阵M_gyro_inv_,即得到用于将IMU坐标系的陀螺仪角速度值转换到大地坐标系的旋转矩阵。

    推导加速度计的变换矩阵

    %% 推导加速度计的变换矩阵
    
    M_acc=M_x*M_y*M_z;
    fprintf('M_acc=\r\n')
    disp(M_acc)
    
    %重力向量
    syms g
    acc = [0;
           0;
           g]; 
    IMU_acc=M_acc*acc;
    fprintf('IMU_acc=\r\n')
    disp(IMU_acc)
    
    

    运行后的输出结果:

    M_acc=
    
    [                        cos(p)*cos(y),                        cos(p)*sin(y),       -sin(p)]
    [ cos(y)*sin(p)*sin(r) - cos(r)*sin(y), cos(r)*cos(y) + sin(p)*sin(r)*sin(y), cos(p)*sin(r)]
    [ sin(r)*sin(y) + cos(r)*cos(y)*sin(p), cos(r)*sin(p)*sin(y) - cos(y)*sin(r), cos(p)*cos(r)]
     
    IMU_acc=
    
           -g*sin(p)
     g*cos(p)*sin(r)
     g*cos(p)*cos(r)
    

    计算得到的IMU_acc即是加速度计感受到的重力加速度向量在IMU最终姿态所在坐标系中的坐标。

    展开全文
  • STM32互补滤波源码,MPU6050姿态解算。详细中文注释
  • 描述关于MPU6050姿态解算原理mpu6050常用作提供飞控运行时的姿态测量和计算,在在姿态结算中有几个重要的概念,欧拉角、四元数等。欧拉角:用来表征三维空间中运动物体绕着坐标轴旋转的情况。即物体的每时每秒的姿态...

    描述

    关于MPU6050姿态解算原理

    mpu6050常用作提供飞控运行时的姿态测量和计算,在在姿态结算中有几个重要的概念,欧拉角、四元数等。

    欧拉角:用来表征三维空间中运动物体绕着坐标轴旋转的情况。即物体的每时每秒的姿态可以由欧拉角表出。

    四元数:超复数,q=(q0,q1,q2,q3),q0位实数,q1,q2,q3为虚部的实数。简单的可以理解为四维空间,就是原有的三维空间加入一个旋转角。而四元数可以表征欧拉角,并且计算方便,故采用四元数来计算。在此还要提到加速度和磁力计补偿原理,可以参照http://blog.csdn.net/nemol1990/article/details/21870197?utm_source=tuicool&utm_medium=referral博客中提到的原理与基本概念。在此再啰嗦一下:补偿的目的是使两个坐标系世界坐标系和刚体坐标系能够完全重合,在此基础上,计算补偿值来修正旋转矩阵,即四元数矩阵。最终的结果是解算出四元数的姿态,就是四元数矩阵的各个元素的值。按照上述博客中的程序解算四元数的时候,用到了Kp和Ki两个参数,两个参数的作用是用来控制矫正刚体坐标系速度的。即调节加速度和磁力计补偿的速度(调节误差的生成速度,进而调节刚体坐标系和世界坐标系的重合度)

    加速计补偿的理解:

    由于重力加速度的原因,加速计只能补偿X-Y轴的偏差,即经过解算后的坐标中世界坐标XOY和刚体坐标XOY能够重合,但是无法补偿航向角。

    在此基础上,利用磁力计进行补偿,因为当地磁场是一个椭圆,所以我们把世界坐标系的X-AIXS轴对准真实世界的北方,这样,磁场园只能在XOZ的平面圆里面,所以磁力计在世界坐标系中的分量是[I,0,k],即在Y轴没有分量,因为90度的夹角余弦为0.但此时i和k的值并不确定是多少。在刚体坐标系中磁力计的输出为[a,b,c,],旋转到和世界坐标系中,计算出i和k,然后,在经过旋转把其旋转到刚体坐标系中,然后计算误差修正旋转矩阵,此时得到精确的旋转矩阵。

    2c0b354c551ae8dcc2ee2a327d4627e6.png

    mpu6050姿态解算程序

    08.MPU6050\Hardware\ioi2c.c

    08.MPU6050\Hardware\ioi2c.h

    08.MPU6050\Hardware\mpu6050.c

    08.MPU6050\Hardware\mpu6050.h

    08.MPU6050\Hardware\nrf24l01.c

    08.MPU6050\Hardware\nrf24l01.h

    08.MPU6050\Hardware\spi.c

    08.MPU6050\Hardware\spi.h

    08.MPU6050\Libraries\CMSIS\CMSISENDUSERLICENCEAGREEMENT.pdf

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f4xx.s

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc_ride7\startup_stm32f4xx.s

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\startup_stm32f4xx.s

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\TASKING\cstart_thumb2.asm

    08.MPU6050\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\TrueSTUDIO\startup_stm32f4xx.s

    08.MPU6050\Libraries\CMSIS\Documentation\CMSIS-SVD_Schema_1_0.xsd

    08.MPU6050\Libraries\CMSIS\Documentation\CMSIS_Logo_Final.jpg

    08.MPU6050\Libraries\CMSIS\Include\arm_common_tables.h

    08.MPU6050\Libraries\CMSIS\Include\arm_math.h

    08.MPU6050\Libraries\CMSIS\Include\core_cm0.h

    08.MPU6050\Libraries\CMSIS\Include\core_cm3.h

    08.MPU6050\Libraries\CMSIS\Include\core_cm4.h

    08.MPU6050\Libraries\CMSIS\Include\core_cm4_simd.h

    08.MPU6050\Libraries\CMSIS\Include\core_cmFunc.h

    08.MPU6050\Libraries\CMSIS\Include\core_cmInstr.h

    08.MPU6050\Libraries\CMSIS\README.txt

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\misc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_adc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_can.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_crc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_cryp.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_dac.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_dbgmcu.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_dcmi.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_dma.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_exti.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_flash.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_fsmc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_gpio.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_hash.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_i2c.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_iwdg.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_pwr.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rcc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rng.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rtc.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_sdio.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_spi.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_syscfg.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_tim.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_usart.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_wwdg.h

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\misc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c

    08.MPU6050\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c

    08.MPU6050\Output\Obj\STM32F4-TEST.hex

    08.MPU6050\Project\JLinkSettings.ini

    08.MPU6050\Project\STM32F4-TEST.uvgui.XiaoWei

    08.MPU6050\Project\STM32F4-TEST.uvopt

    08.MPU6050\Project\STM32F4-TEST.uvproj

    08.MPU6050\System\delay.c

    08.MPU6050\System\delay.h

    08.MPU6050\System\led.c

    08.MPU6050\System\led.h

    08.MPU6050\System\sys.c

    08.MPU6050\System\sys.h

    08.MPU6050\System\timer2.c

    08.MPU6050\System\timer2.h

    08.MPU6050\System\uart.c

    08.MPU6050\System\uart.h

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • MPU6050自带运动解算芯片DMP的移植STM32源码,详细中文注释。
  • MPU6050数据处理方法,文档,手册,提供四轴的理论基础
  • K60 mpu6050 姿态解算

    2019-03-18 20:17:29
    mpu6050 基于K60适合做恩智浦智能车大赛的同学使用 基于野火
  • STM32读取到MPU6050姿态角后,把姿态角数据显示在液晶屏上。然后传输给PWM函数,以俯仰角和滚转角作为参数来分别控制舵机的转动。
  • MPU6050姿态解算1-DMP方式

    千次阅读 2020-07-29 23:18:52
    MPU6050姿态解算方法有多种,包括硬件方式的DMP解算,软件方式的欧拉角与旋转矩阵解算,软件方式的轴角法与四元数解算。本篇先介绍最易操作的DMP方式。 MPU6050基本功能 3轴陀螺仪 陀螺仪,测量的是绕xyz轴转动...

    MPU6050的姿态解算方法有多种,包括硬件方式的DMP解算,软件方式的欧拉角与旋转矩阵解算,软件方式的轴角法与四元数解算。本篇先介绍最易操作的DMP方式。

    MPU6050基本功能

    • 3轴陀螺仪

      陀螺仪,测量的是绕xyz轴转动的角速度,对角速度积分可以得到角度。

    • 3轴加速度计

      加速度计,测量的是xyz方向受到的加速度。在静止时,测量到的是重力加速度,因此当物体倾斜时,根据重力的分力可以粗略的计算角度。在运动时,除了重力加速度,还叠加了由于运动产生的加速度。
      在这里插入图片描述

    DMP简介

    DMP就是MPU6050内部的运动引擎,全称Digital Motion Processor,直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。Motion Driver是Invensense针对其运动传感器的软件包,并非全部开源,核心的算法部分是针对ARM处理器和MSP430处理器编译成了静态链接库,适用于MPU6050、MPU6500、MPU9150、MPU9250等传感器。

    四元数转欧拉角

    四元数可以方便的表示3维空间的旋转,但其概念不太好理解,可以先类比复数,复数表示的其实是2维平面中的旋转。

    四元数的基本表示形式为:q0+q1*i+q2*j+q3*k,即1个实部3个虚部,具体细节本篇先不做展开介绍。

    四元数虽然方便表示旋转,但其形式不太直观,旋转转换成pitch、roll、yaw的表示形式,方便观察姿态。

    转换公式为:
    在这里插入图片描述

    程序表示为:

    pitch = asin(-2 * q1 * q3 + 2 * q0* q2)
    roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)
    yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)
    

    已在STM32F407以及FreeRTOS上进行测试,视频效果如下:
    波形:
    在这里插入图片描述
    姿态:
    在这里插入图片描述
    视频地址:https://www.bilibili.com/video/BV18A411v7Du/

    展开全文
  • 文章目录1,理论分析1.1 MPU60501.2 Mahony算法原理2,代码实现1.1 MPU6050初始化及数据读取1.2 Mahony算法c语言实现1.3 将代码移植到你的工程3,补充 1,理论分析 1.1 MPU6050 MPU6050是一个集成了陀螺仪和加速度计...
  • MPU6050姿态解算——Mahony互补滤波

    千次阅读 多人点赞 2020-07-18 11:37:43
    不需要了解姿态解算知识,直接调用库函数,操作简单 需要掌握一定的姿态解算知识 解算速度慢,最大只能到200Hz 速度快,而且随着单片机主频提高会更快 真实性差 真实性较好 从上面的曲线图结合我实际的干扰,...
  • mpu6050姿态解算原理

    千次阅读 多人点赞 2017-03-09 21:57:17
    姿态解算原理 http://wenku.baidu.com/linkurl=m5PL1Em4sFdsEcjsaUDwJrXLAY8705TMpIXYPP6dDCo0FcJBIdI3QJLNlvfPg25wiKK94Pq7lwO5BzVQPCHTb3sKi5SLC9PmkHjA4PQSCoW四元数法...
  • 关于MPU6050一阶互补滤波...)在MPU6050传感器中一般读到的原始数据为三轴加速度和三轴角速度,那么如何利用这六个数据进行姿态解算便成为了一个首要的问题。可以利用官方的dmp来解算姿态,但是代码移植是个问题,我用
  • 众所周知 mpu6050姿态解算方法一般有DMP 复式绿波 卡尔曼绿波三中方法 楼主用的是卡尔曼绿波 卡尔曼绿波解算时有几个参数要调 通过调参解算出实时角度 那怎么判断调出来的角度变化曲线是合格的呢 用什么办法来判断...
  • MCU用的是STM32F103C8T6芯片,USB HID程序。具体功能为获取MPU6050然后得到姿态角,再通过蓝牙串口发送。
  • mpu6050姿态解算与卡尔曼滤波(1)数学

    万次阅读 多人点赞 2017-03-01 20:38:20
    mpu6050芯片上定义载体坐标系b系。那么b系的姿态就是指n系与b系相对的旋转关系,即如何由n系旋转到b系。 描述这种旋转关系通常使用欧拉角(ψ,θ,γ)T(\psi, \theta,\gamma)^T,姿态矩阵T(3x3),四元数Q=(q0,q1,...
  • 关于MPU6050姿态解算的理解与认识

    万次阅读 2016-03-24 17:05:14
     mpu6050常用作提供飞控运行时的姿态测量和计算,在在姿态结算中有几个重要的概念,欧拉角、四元数等。 欧拉角:用来表征三维空间中运动物体绕着坐标轴旋转的情况。即物体的每时每秒的姿态可以由欧拉角表出。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 686
精华内容 274
关键字:

mpu6050姿态解算