找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4569|回复: 1
收起左侧

MPU6050卡尔曼滤波Arduino代码

[复制链接]
ID:164146 发表于 2019-4-17 09:50 | 显示全部楼层 |阅读模式
Arduino源程序:(MPU6050芯片卡尔曼滤波)
  1. #include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050.h"

  4. MPU6050 accelgyro;

  5. unsigned long now, lastTime = 0;
  6. float dt;                                   //微分时间

  7. int16_t ax, ay, az, gx, gy, gz;             //加速度计陀螺仪原始数据
  8. float aax=0, aay=0, agx=0, agy=0, agz=0;    //角度变量
  9. long axo = 0, ayo = 0, azo = 0;             //加速度计偏移量
  10. long gxo = 0, gyo = 0, gzo = 0;             //陀螺仪偏移量

  11. float pi = 3.1415926;
  12. float AcceRatio = 16384.0;                  //加速度计比例系数
  13. float GyroRatio = 131.0;                    //陀螺仪比例系数

  14. uint8_t n_sample = 8;                       //加速度计滤波算法采样个数
  15. float aaxs[8] = {0}, aays[8] = {0};         //x,y轴采样队列
  16. long aax_sum, aay_sum;                      //x,y轴采样和

  17. float a_x[10]={0}, a_y[10]={0} ,g_x[10]={0} ,g_y[10]={0}; //加速度计协方差计算队列
  18. float Px=1, Rx, Kx, Sx, Vx, Qx;             //x轴卡尔曼变量
  19. float Py=1, Ry, Ky, Sy, Vy, Qy;             //y轴卡尔曼变量

  20. void setup() {
  21.   Wire.begin();
  22.   Serial.begin(9600);

  23.   accelgyro.initialize();                 //初始化

  24.   unsigned short times = 200;             //采样次数
  25.   for(int i=0;i<times;i++){
  26.     accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值
  27.     axo += ax; ayo += ay; azo += az;      //采样和
  28.     gxo += gx; gyo += gy; gzo += gz;
  29.   }
  30.   axo /= times; ayo /= times; azo /= times; //计算加速度计偏移
  31.   gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
  32. }

  33. void loop(){
  34.   unsigned long now = millis();             //当前时间(ms)
  35.   dt = (now - lastTime) / 1000.0;           //微分时间(s)
  36.   lastTime = now;                           //上一次采样时间(ms)

  37.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //读取六轴原始数值

  38.   float accx = ax / AcceRatio;              //x轴加速度
  39.   float accy = ay / AcceRatio;              //y轴加速度
  40.   float accz = az / AcceRatio;              //z轴加速度

  41.   aax = atan(accy / accz) * (-180) / pi;    //x轴对于水平面的夹角
  42.   aay = atan(accx / accz) * 180 / pi;       //y轴对于水平面的夹角

  43.   aax_sum = 0;                              // 对于加速度计原始数据的滑动加权滤波算法
  44.   aay_sum = 0;
  45.   for(int i=1;i<n_sample;i++){
  46.     aaxs[i-1] = aaxs[i];
  47.     aax_sum += aaxs[i] * i;
  48.     aays[i-1] = aays[i];
  49.     aay_sum += aays[i] * i;
  50.   }
  51.   aaxs[n_sample-1] = aax;
  52.   aax_sum += aax * n_sample;
  53.   aax = (aax_sum / (11*n_sample/2.0)) * 9 / 7.0; //角度调幅至0-90°
  54.   aays[n_sample-1] = aay;                        //此处应用实验法取得合适的系数
  55.   aay_sum += aay * n_sample;                     //本例系数为9/7
  56.   aay = (aay_sum / (11*n_sample/2.0)) * 9 / 7.0;

  57.   float gyrox = - (gx-gxo) / GyroRatio * dt; //x轴角速度
  58.   float gyroy = - (gy-gyo) / GyroRatio * dt; //y轴角速度
  59.   agx += gyrox;                             //x轴角速度积分
  60.   agy += gyroy;                             //x轴角速度积分

  61.   /* kalmen start */
  62.   Sx = 0; Rx = 0;
  63.   Sy = 0; Ry = 0;
  64.   for(int i=1;i<10;i++){                 //测量值平均值运算
  65.     a_x[i-1] = a_x[i];                      //即加速度平均值
  66.     Sx += a_x[i];
  67.     a_y[i-1] = a_y[i];
  68.     Sy += a_y[i];
  69.   }
  70.   a_x[9] = aax;
  71.   Sx += aax;
  72.   Sx /= 10;                                 //x轴加速度平均值
  73.   a_y[9] = aay;
  74.   Sy += aay;
  75.   Sy /= 10;                                 //y轴加速度平均值

  76.   for(int i=0;i<10;i++){
  77.     Rx += sq(a_x[i] - Sx);
  78.     Ry += sq(a_y[i] - Sy);
  79.   }
  80.   Rx = Rx / 9;                              //得到方差
  81.   Ry = Ry / 9;                        

  82.   Px = Px + 0.0025;                         // 0.0025在下面有说明...
  83.   Kx = Px / (Px + Rx);                      //计算卡尔曼增益
  84.   agx = agx + Kx * (aax - agx);             //陀螺仪角度与加速度计速度叠加
  85.   Px = (1 - Kx) * Px;                       //更新p值

  86.   Py = Py + 0.0025;
  87.   Ky = Py / (Py + Ry);
  88.   agy = agy + Ky * (aay - agy);
  89.   Py = (1 - Ky) * Py;

  90.   /* kalmen end */

  91.   Serial.print(agx);Serial.print(",");
  92.   Serial.print(agy);Serial.println();
  93. }
复制代码
0.png
全部资料51hei下载地址:
MPU6050卡尔曼滤波代码.zip (1.74 KB, 下载次数: 57)
回复

使用道具 举报

ID:1 发表于 2019-4-17 14:43 | 显示全部楼层
本帖需要重新编辑补全头文件 电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表