极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21791|回复: 6

MPU6050四元数解算求助

[复制链接]
发表于 2014-10-23 16:53:57 | 显示全部楼层 |阅读模式
我最近在学习MPU6050姿态解算,原始数据通过四元数解算后的数据一直在正常值上下震荡,成正弦波动。我对程序中的Kp,Ki值进行调整,不管怎么调,一直是震荡的。请教大家,这是什么原因造成的?郁闷的很。

  1. #include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050.h"

  4. MPU6050 accelgyro;

  5. int16_t ax, ay, az;
  6. int16_t gx, gy, gz;
  7. float accx,accy,accz;
  8. float gyrox,gyroy,gyroz;
  9. float axo=0,ayo=0,azo=0;  //加速度计偏移量
  10. float gxo=0,gyo=0,gzo=0;  //陀螺仪偏移量
  11. float pi=3.1415926;
  12. float AcceRatio=16384.0;
  13. float GyroRatio=131.0;
  14. float Rad=180.0/pi;

  15. //
  16. //
  17. #define Kp 0.025f//10.0f
  18. #define Ki 0.0f//0.008f
  19. #define halfT 0.001f

  20. float q0=1,q1=0,q2=0,q3=0;
  21. float exInt=0,eyInt=0,ezInt=0;

  22. float Angle_roll,Angle_pitch,Angle_yaw;

  23. void AngleUpdate(float ax,float ay,float az,float gx,float gy,float gz)
  24. {
  25.     float norm;
  26.     float vx,vy,vz;
  27.     float ex,ey,ez;
  28.    
  29.     if (ax*ay*az==0)
  30.         return;
  31.    
  32.     norm=sqrt(ax*ax+ay*ay+az*az);
  33.     ax=ax/norm;
  34.     ay=ay/norm;
  35.     az=az/norm;
  36.    
  37.     vx=2*(q1*q3-q0*q2);
  38.     vy=2*(q0*q1-q3*q2);
  39.     vz=q0*q0-q1*q1-q2*q2+q3*q3;
  40.    
  41.     ex=ay*vz-az*vy;
  42.     ey=az*vx-ax*vz;
  43.     ez=ax*vy-ay*vx;
  44.    
  45.     exInt=exInt+ex*Ki;
  46.     eyInt=eyInt+ey*Ki;
  47.     ezInt=ezInt+ez*Ki;
  48.    
  49.     gx=gx+Kp*ex+exInt;
  50.     gy=gy+Kp*ey+eyInt;
  51.     gz=gz+Kp*ez+ezInt;
  52.    
  53.     q0=q0+(-q1*gx-q2*gy-q3*gz)*halfT;
  54.     q1=q1+(q0*gx+q2*gz-q3*gy)*halfT;
  55.     q2=q2+(q0*gy-q1*gz+q3*gx)*halfT;
  56.     q3=q3+(q0*gz+q1*gy-q2*gx)*halfT;
  57.    
  58.     norm=sqrt(q0*q0+q1*q1+q2*q2+q3*q3);
  59.     q0=q0/norm;
  60.     q1=q1/norm;
  61.     q2=q2/norm;
  62.     q3=q3/norm;
  63.    
  64.     Angle_roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*Rad;
  65.     Angle_pitch=asin(-2*q1*q3+2*q0*q2)*Rad;
  66.     Angle_yaw=atan2(2*q1*q2+2*q0*q3,-2*q2*q2-2*q3*q3+1)*Rad;
  67. }

  68. void setup()
  69. {
  70.     Wire.begin();
  71.     Serial.begin(9600);
  72.    
  73.     accelgyro.initialize();
  74.    
  75.     unsigned short times=400;
  76.     for(int i=0;i<times;i++)
  77.     {
  78.         accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
  79.         axo += ax; ayo += ay; azo += az;      //采样和
  80.         gxo += gx; gyo += gy; gzo += gz;
  81.     }
  82.     axo /= times; ayo /= times; azo /= times; //计算加速度计偏移
  83.     gxo /= times; gyo /= times; gzo /= times; //计算陀螺仪偏移
  84.    
  85.    Serial.println("Angle_roll   ,   Angle_pitch   ,   Angle_yaw");
  86.    Serial.print(axo);Serial.print("  ,   ");Serial.print(gxo);
  87. }

  88. void loop()
  89. {
  90.     accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
  91.     accx=(ax-axo)/AcceRatio;
  92.     accy=(ay-ayo)/AcceRatio;
  93.     accz=(az-azo)/AcceRatio;
  94.     gyrox=(ax-gxo)/GyroRatio;
  95.     gyroy=(ay-gyo)/GyroRatio;
  96.     gyroz=(az-gzo)/GyroRatio;
  97.     //Serial.print(accx);Serial.print(",");Serial.print(accy);Serial.print(",");Serial.println(accz);
  98.     AngleUpdate(accx,accy,accz,gyrox,gyroy,gyroz);
  99.     //Kalman_Filter(Angle_roll,gyrox);
  100.     Serial.print(Angle_roll);Serial.print(",");Serial.print(Angle_pitch);Serial.print(",");Serial.println(Angle_yaw);
  101.     delay(100);
  102. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-10-25 11:29:57 | 显示全部楼层
数学算法这块一直啃不下来。帮顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 21:25:20 来自手机 | 显示全部楼层
一起学习,等高手帮我指导一下来自: Android客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-29 15:15:55 | 显示全部楼层
LZ解决了么,第44行那里我看了网上好多都是+,LZ那里用的是减号,我改了也没用。。。波动很有规律, 就是不能正常工作。
回复 支持 反对

使用道具 举报

发表于 2015-11-12 19:28:47 | 显示全部楼层
请问楼主问题解决了么
回复 支持 反对

使用道具 举报

发表于 2015-11-13 13:56:39 | 显示全部楼层
楼主 我知道你的程序哪里错了 那里应该是GX-GX偏移量

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 10:48:59 | 显示全部楼层
詹波波 发表于 2015-11-13 13:56
楼主 我知道你的程序哪里错了 那里应该是GX-GX偏移量

竟然没发现。。。谢谢你,你调出来了吗,我放下好久,今天才又拿起来玩玩,参数不好调
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 12:38 , Processed in 0.051098 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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