分享

【学习心得】MPU6050数据处理实验一

 dwlinux_gs 2014-08-25
MPU6050模块买了都好几个月了,出来前些日子做一下简单的数据获取,再没做过新的实验,一直在看资料,从自横小车的姿态矫正到四轴飞行器的姿态矫正等给类帖子看了不少,昨天晚上终于动手做了一次实验,这次实验主要是想试一下用陀螺仪来输出传感器的三轴角度(相对于地平面)。
下面是实验的代码:
ARDUINO 代码
  1. #include <I2Cdev.h>
  2. #include <MPU6050.h>
  3. #include <Wire.h>//添加必须的库文件
  4. //====一下三个定义了陀螺仪的偏差===========
  5. #define Gx_offset -3.06
  6. #define Gy_offset 1.01
  7. #define Gz_offset -0.88
  8. //====================
  9. MPU6050 accelgyro;
  10. int16_t ax,ay,az;
  11. int16_t gx,gy,gz;//存储原始数据
  12. float aax,aay,aaz,ggx,ggy,ggz;//存储量化后的数据
  13. float Ax,Ay,Az;//单位 g(9.8m/s^2)
  14. float Gx,Gy,Gz;//单位 °/s
  15. float Angel_accX,Angel_accY,Angel_accZ;//存储加速度计算出的角度
  16. long LastTime,NowTime,TimeSpan;//用来对角速度积分的
  17. #define LED_PIN 13
  18. bool blinkState=false;
  19. void setup()//MPU6050的设置都采用了默认值,请参看库文件
  20. {
  21.   Wire.begin();
  22.   Serial.begin(9600);
  23.   Serial.println("Initializing I2C device.....");
  24.   accelgyro.initialize();
  25.   Serial.println("Testing device connections...");
  26.   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful":"MPU6050 connection failure");
  27.   pinMode(LED_PIN,OUTPUT);
  28. }
  29. void loop()
  30. {
  31.   accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);//获取三个轴的加速度和角速度
  32. //  Serial.print(ax/16384.00);
  33. //  Serial.print(",");
  34. //  Serial.print(ay/16384.00);
  35. //  Serial.print(",");
  36. //  Serial.print(az/16384.00);
  37. //  Serial.print(",");
  38. //  Serial.print(gx/131.00);
  39. //  Serial.print(",");
  40. //  Serial.print(gy/131.00);
  41. //  Serial.print(",");
  42. //  Serial.println(gz/131.00);
  43. //======一下三行是对加速度进行量化,得出单位为g的加速度值
  44.    Ax=ax/16384.00;
  45.    Ay=ay/16384.00;
  46.    Az=az/16384.00;
  47.    //==========以下三行是用加速度计算三个轴和水平面坐标系之间的夹角
  48. //请参考:[url]http://www./forum.php?mod=viewthread&tid=2328&page=1#pid27876[/url]
  49. //个人觉得原帖中case0算的不对,应该是z/sqrt(x*x+y*y),估计是江南楼主写错了
  50.    Angel_accX=atan(Ax/sqrt(Az*Az+Ay*Ay))*180/3.14;
  51.    Angel_accY=atan(Ay/sqrt(Ax*Ax+Az*Az))*180/3.14;
  52.    Angel_accZ=atan(Az/sqrt(Ax*Ax+Ay*Ay))*180/3.14;
  53.    //==========以下三行是对角速度做量化==========
  54.    ggx=gx/131.00;
  55.    ggy=gy/131.00;
  56.    ggz=gz/131.00;
  57.   //===============以下是对角度进行积分处理================
  58.   NowTime=millis();//获取当前程序运行的毫秒数
  59.   TimeSpan=NowTime-LastTime;//积分时间这样算不是很严谨
  60. //下面三行就是通过对角速度积分实现各个轴的角度测量,当然假设各轴的起始角度都是0
  61.   Gx=Gx+(ggx-Gx_offset)*TimeSpan/1000;
  62.   Gy=Gy+(ggy-Gy_offset)*TimeSpan/1000;
  63.   Gz=Gz+(ggz-Gz_offset)*TimeSpan/1000;
  64.   LastTime=NowTime;
  65.   //==============================
  66.   Serial.print(Angel_accX);
  67.   Serial.print(",");
  68.   Serial.print(Angel_accY);
  69.   Serial.print(",");
  70.   Serial.print(Angel_accZ);
  71.   Serial.print(",");
  72.   Serial.print(Gx);
  73.   Serial.print(",");
  74.   Serial.print(Gy);
  75.   Serial.print(",");
  76.   Serial.println(Gz);
  77. //  Serial.print(ggx-Gx_offset);
  78. //  Serial.print(",");
  79. //  Serial.print(ggy-Gy_offset);
  80. //  Serial.print(",");
  81. //  Serial.println(ggz-Gz_offset);
  82.   blinkState=!blinkState;
  83.   digitalWrite(LED_PIN,blinkState);
  84.   delay(100);//这个用来控制采样速度
  85. }



角速度传感器一定要矫正偏移,我采用的方法就是先读取若干数值,然后将数值导入到excel中,取平均值,该平均值就是传感器当前状态下的偏移,在后面的角度积分中一定要先用原始角速度值减掉对应的偏移,下面两个曲线就是进行偏移校正前后的效果:
未进行偏移量校正
下面的图片是进行了偏移量校正,可以发现三个轴的角速度基本都在0坐标轴附近上下波动:
进行偏移量校正后

下图是对角速度进行积分输出的三个轴的角度变化曲线,没做滤波处理,基本上能反应出传感器的姿态。
三个轴的角度变化

下图是对比角速度和加速度计算出的姿态之间的关系,图中柠檬绿是陀螺仪的x轴,蓝色是加速度的y轴,红色是加速度的z轴,第一段曲线实际上是一个yz平面绕x轴旋转的一个动作,大家可以想象一下,所以陀螺仪的yz输出都是零,而加速的yz是有输出的。
6轴姿态对比

下一步的实验是将加速度和陀螺仪的角度进行融合,同时研究一下低通滤波和高通滤波在加速度传感器中的使用。


=================下面是SerialChart的代码============================
ARDUINO 代码
  1. [_setup_]
  2. port=COM3   
  3. baudrate=9600
  4. width=1000
  5. height=200
  6. background_color = black
  7. grid_h_origin = 100
  8. grid_h_step = 50
  9. grid_h_color = #EEE
  10. grid_h_origin_color = #CCC
  11. grid_v_origin = 0
  12. grid_v_step = 200
  13. grid_v_color = #EEE
  14. grid_v_origin_color = transparent
  15. [_default_]
  16. min=-1
  17. max=1
  18. [ax]
  19. color=gold
  20. min=-90
  21. max=90
  22. [ay]
  23. color=blue
  24. min=-90
  25. max=90
  26. [az]
  27. color=red
  28. min=-90
  29. max=90
  30. [gx]
  31. color=lime
  32. min=-90
  33. max=90
  34. [gy]
  35. color=magenta
  36. min=-90
  37. max=90
  38. [gz]
  39. color=cyan
  40. min=-90
  41. max=90

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多