MPU6050六轴陀螺仪

作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品。

本例程输出XYZ的角度,正负90度。

运用卡尔曼滤波算法解算姿态,感觉算是比较稳定,但好像有点偏移。大家好好学习参考,再改进吧。

输出效果

首先看看本例程XYZ轴的输出效果图:

(时间曲线的体现是:静止姿态→摆动→恢复原静止姿态→拍动桌子→静止姿态)

Bom表

Arduino Uno               *1

mpu6050 陀螺仪模块 *1

跳线                            若干

MPU6050 引脚说明

VCC             3.3-5V(内部有稳压芯片)

GND             地线
SCL              MPU6050作为从机时IIC时钟线

SDA              MPU6050作为从机时IIC数据线

XCL               MPU6050作为主机时IIC时钟线

XDA              MPU6050作为主机时IIC数据线
AD0              地址管脚,该管脚决定了IIC地址的最低一位

INT                中断引脚

接线

Arduino uno+MPU6050接线方式如下

程序实现

首先要更新I2C库

在GITHUB找到的I2C库

(程序来源: https://github.com/jrowberg/i2cdevlib)

打开,把Arduino文件夹里的I2Cdev,MPU6050文件夹复制到Arduino IDE的库文件夹里

(默认的路径是这个 C:\Program Files (x86)\Arduino\libraries)

在GITHUB找到的卡尔曼滤波程序(程序来源: https://github.com/wjjun/MPU6050_Kalman)

把程序上传到板子上,打开串口监视器,就可以看到一堆堆的数据了

(往后再说说怎么整理处理这些数据)

程序和库文件打包下载:https://u16460183.ctfile.com/fs/16460183-295242093

压缩包文件夹说明:
I2Cdev  -- i2c库(都是需要放置在Arduino的库目录里面)
MPU6050 -- mpu6050陀螺仪库
LS_MPU6050  -- 主程序文件

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"MPU6050 accelgyro;unsigned long now, lastTime = 0;
float dt;                                   //微分时间int16_t ax, ay, az, gx, gy, gz;             //加速度计陀螺仪原始数据
float aax=0, aay=0,aaz=0, agx=0, agy=0, agz=0;    //角度变量
long axo = 0, ayo = 0, azo = 0;             //加速度计偏移量
long gxo = 0, gyo = 0, gzo = 0;             //陀螺仪偏移量float pi = 3.1415926;
float AcceRatio = 16384.0;                  //加速度计比例系数
float GyroRatio = 131.0;                    //陀螺仪比例系数uint8_t n_sample = 8;                       //加速度计滤波算法采样个数
float aaxs[8] = {0}, aays[8] = {0}, aazs[8] = {0};         //x,y轴采样队列
long aax_sum, aay_sum,aaz_sum;                      //x,y轴采样和float a_x[10]={0}, a_y[10]={0},a_z[10]={0} ,g_x[10]={0} ,g_y[10]={0},g_z[10]={0}; //加速度计协方差计算队列
float Px=1, Rx, Kx, Sx, Vx, Qx;             //x轴卡尔曼变量
float Py=1, Ry, Ky, Sy, Vy, Qy;             //y轴卡尔曼变量
float Pz=1, Rz, Kz, Sz, Vz, Qz;             //z轴卡尔曼变量void setup()
{Wire.begin();Serial.begin(115200);accelgyro.initialize();                 //初始化unsigned short times = 200;             //采样次数for(int i=0;i<times;i++){accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值axo += ax; ayo += ay; azo += az;      //采样和gxo += gx; gyo += gy; gzo += gz;}axo /= times; ayo /= times; azo /= times; //计算加速度计偏移gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
}void loop()
{unsigned long now = millis();             //当前时间(ms)dt = (now - lastTime) / 1000.0;           //微分时间(s)lastTime = now;                           //上一次采样时间(ms)accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值float accx = ax / AcceRatio;              //x轴加速度float accy = ay / AcceRatio;              //y轴加速度float accz = az / AcceRatio;              //z轴加速度aax = atan(accy / accz) * (-180) / pi;    //y轴对于z轴的夹角aay = atan(accx / accz) * 180 / pi;       //x轴对于z轴的夹角aaz = atan(accz / accy) * 180 / pi;       //z轴对于y轴的夹角aax_sum = 0;                              // 对于加速度计原始数据的滑动加权滤波算法aay_sum = 0;aaz_sum = 0;for(int i=1;i<n_sample;i++){aaxs[i-1] = aaxs[i];aax_sum += aaxs[i] * i;aays[i-1] = aays[i];aay_sum += aays[i] * i;aazs[i-1] = aazs[i];aaz_sum += aazs[i] * i;}aaxs[n_sample-1] = aax;aax_sum += aax * n_sample;aax = (aax_sum / (11*n_sample/2.0)) * 9 / 7.0; //角度调幅至0-90°aays[n_sample-1] = aay;                        //此处应用实验法取得合适的系数aay_sum += aay * n_sample;                     //本例系数为9/7aay = (aay_sum / (11*n_sample/2.0)) * 9 / 7.0;aazs[n_sample-1] = aaz; aaz_sum += aaz * n_sample;aaz = (aaz_sum / (11*n_sample/2.0)) * 9 / 7.0;float gyrox = - (gx-gxo) / GyroRatio * dt; //x轴角速度float gyroy = - (gy-gyo) / GyroRatio * dt; //y轴角速度float gyroz = - (gz-gzo) / GyroRatio * dt; //z轴角速度agx += gyrox;                             //x轴角速度积分agy += gyroy;                             //x轴角速度积分agz += gyroz;/* kalman start */Sx = 0; Rx = 0;Sy = 0; Ry = 0;Sz = 0; Rz = 0;for(int i=1;i<10;i++){                 //测量值平均值运算a_x[i-1] = a_x[i];                      //即加速度平均值Sx += a_x[i];a_y[i-1] = a_y[i];Sy += a_y[i];a_z[i-1] = a_z[i];Sz += a_z[i];}a_x[9] = aax;Sx += aax;Sx /= 10;                                 //x轴加速度平均值a_y[9] = aay;Sy += aay;Sy /= 10;                                 //y轴加速度平均值a_z[9] = aaz;Sz += aaz;Sz /= 10;for(int i=0;i<10;i++){Rx += sq(a_x[i] - Sx);Ry += sq(a_y[i] - Sy);Rz += sq(a_z[i] - Sz);}Rx = Rx / 9;                              //得到方差Ry = Ry / 9;                        Rz = Rz / 9;Px = Px + 0.0025;                         // 0.0025在下面有说明...Kx = Px / (Px + Rx);                      //计算卡尔曼增益agx = agx + Kx * (aax - agx);             //陀螺仪角度与加速度计速度叠加Px = (1 - Kx) * Px;                       //更新p值Py = Py + 0.0025;Ky = Py / (Py + Ry);agy = agy + Ky * (aay - agy); Py = (1 - Ky) * Py;Pz = Pz + 0.0025;Kz = Pz / (Pz + Rz);agz = agz + Kz * (aaz - agz); Pz = (1 - Kz) * Pz;/* kalman end */Serial.print(agx);Serial.print(",");Serial.print(agy);Serial.print(",");Serial.print(agz);Serial.println();}

Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验相关推荐

  1. android 陀螺仪滤波_Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验

    Arduino MPU6050陀螺仪运用卡尔曼滤波姿态解算实验 版权声明:本文为博主原创文章,未经博主允许不得转载. 2019年3月20日 发布 实例效果 输出效果: 首先看看本例程XYZ轴的输出效果 ...

  2. android 陀螺仪滤波_Arduino+mpu6050陀螺仪运用卡尔曼滤波姿态解算实验

    MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算 ...

  3. 卡尔曼滤波五个公式_基于ROS的卡尔曼滤波姿态解算

    前段时间由于项目关系需要实现基于卡尔曼滤波的姿态解算,也就是说融合加速度计.陀螺仪及磁罗盘进行AHRS姿态解算,得到机器人的姿态角. 本文的学习需要有一定的卡尔曼滤波器基础,可以参考白巧克力亦唯心的卡 ...

  4. ESP-12F驱动MPU6050使用DMP库姿态解算

    一.准备工作 主芯片采用是安信可科技的ESF-12F模组(内置ESP8266芯片),使用GPIO模拟I2C驱动MPU6050,i2c驱动部分可直接参考官方例程中的i2c_master.c文件,(附件提 ...

  5. stm32 MPU6050 姿态解算 Mahony互补滤波算法

    文章目录 0.介绍 1,理论分析 1.1 MPU6050 1.2 Mahony算法原理 2,代码实现 1.1 MPU6050初始化及数据读取 1.2 Mahony算法c语言实现 1.3 将代码移植到你 ...

  6. 四旋翼无人机飞控系统设计(姿态解算)

    姿态解算   姿态传感器读出加速度和角速度,而对一个系统的自动控制往往需要更加上层和贴近应用的的一个属性:角度.所以需要通过加速度和角速度进行数据融合转化得到姿态角度.   以MPU6050为例,姿态 ...

  7. Arduino 与 MPU6050 姿态解算+ PROCESSING

    2019独角兽企业重金招聘Python工程师标准>>> 买的MPU6050自带姿态解算大大减轻了上层处理器所做的工作. 通过熟悉了一下processing之后做了一个小例子更是感觉这 ...

  8. 【毕业设计】MPU6050姿态解算 姿态估计 - 物联网 单片机 stm32

    文章目录 1 简介 2 MPU6050 3 工作原理 4 单片机与MPU6050通信 4.1 mpu6050 数据格式 4.2 倾角计算方法 5 实现代码 6 最后 1 简介 Hi,大家好,这里是丹成 ...

  9. ADIS16465姿态解算+卡尔曼滤波代码

    工程介绍 工程使用stm32f407开发,imu单元为ADIS16465-1 BMLZ,通过spi通信读取imu的输出寄存器,对读取到的三轴加速度值和三轴陀螺仪值利用四元数进行姿态解算,最后得到pit ...

最新文章

  1. 皮一皮:钢铁直女?鉴定了,钢的不能再钢!
  2. OS / Linux / pthread_join() 和 pthread_detach() 函数区别
  3. Java学习笔记13--比较器(Comparable、Comparator)
  4. [ZJOI2008]泡泡堂
  5. EJB3.0技术体系---学习笔记
  6. 使用寄存器点亮LED——编程实战
  7. C/C++ 常见误区
  8. DB2 开发系列 从入门开始--概述
  9. c++、C#互调用之c# 调用 vc6 COM
  10. cam全称_在ADU高级参数(parameter)中,术语CAM全称是什么?
  11. Springboot毕设项目公共机房的值班管理系统wyz7b(java+VUE+Mybatis+Maven+Mysql)
  12. vFORUM 2018,开启多云未来
  13. 人工神经网络评价法案例_人工神经网络评价法
  14. 全国计算机考试照片传不上去,成人高考报名照片传不上去怎么办
  15. 易语言新手入门教程第十五课 - QQ自动登录器第三部分
  16. hadoop官网下载地址:
  17. 最近网络上很多都在聊自动阅读,今天我们好好说说自动阅读到底怎么样
  18. VS2010常用插件介绍之Javascript插件(一)
  19. Windows下搭建ant+jenkins+jmeter自动化接口测试框架
  20. Latex 图片及表格排列代码

热门文章

  1. 一篇网络创始人赵宏民出任耳朵财经合伙人 负责全国节点建设
  2. 梳理“自监督算法”(一)
  3. 蓝桥杯练习题 <42点问题> 枚举法
  4. Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46
  5. ORA-00257: oracle报archiver error的解决方法
  6. 第二次作业—红芯事件
  7. 23 - JavaScript 通过style对象设置行内样式
  8. Mysql关键字执行顺序-深入解析
  9. 程序猿之--基本素质
  10. tp886n设置虚拟服务器,TP-Link TL-WR886N V5wifi端口映射怎么设置 | tplogin.cn