Github

对MPU9250地磁计的校准和使用都记录在Github上的一个项目中,项目还会随着学习的深入进行更新
项目URL:https://github.com/HITLIVING/-RT-Thread-.git
读者可以通过Pull下来整个项目进一步了解
需要格外关注<br />
gyroscope_app.c
gyroscope_app.h

基本原理

image.png

  • 想要实现电子罗盘的功能只需MPU9250芯片水平放置时的X轴和Y轴霍尔元件返回磁场大小值

    原始数据

  • 就像速度计的零点漂移一样,地磁计的每个轴同样存在着由于芯片自身带来的零点漂移

  • 即返回的磁场大小值不是以0为中心
  • 同样X轴与Y轴测量的磁场的量程也不同
  • 为了观察到这种零点误差,有一种椭圆轨迹的方法
  • 同时测量各个轴的原始磁场强度值,旋转MPU9250采集各个方位的信息,这里只关注X轴和Y轴
  • 将这些数值在一张图上绘制
  • 可以得到如图

image.png

  • 理想情况下,用此方法绘制的轨迹,应该为圆心为原点的圆
  • 而实际情况为中心不在原点的椭圆轨迹
  • 因此我们需要对原始数据进行处理,使其轨迹为圆心为原点的圆

椭圆拟合

  • 要想处理原始数据,需要知道理想数据与原始数据之间的关系
  • 那么就需要知道这个椭圆轨迹的椭圆方程
  • 从而需要空间二次曲面数据拟合算法
  • 椭圆方程

image.png

  • 其中X和Y即为原始数据偏移原点的数值
  • A和B的比率即为X轴和Y轴的量程差别
  • 空间二次曲面数据拟合算法通过Matlab实现,公式推导与Matlab源程序见文末参考链接

  • 经matlab计算后的X为-12.45,Y为35.37,A为115.54,B为124.37

  • 依据此对原始数据处理
  • 即对X轴磁场强度减去X
  • 对Y轴的磁场强度减去Y
  • 然后对Y轴磁场强度除以B乘以A
  • 经此处理后的轨迹图为

image.png

  • 仅此处理后的X轴和Y轴的磁场强度才可用来计算角度值
  • 将偏移值作为宏定义写入单片机程序中
    1. //Data from Matlab
    2. #define offset_mx -12.447578 //地磁计X轴零点
    3. #define offset_my 35.371766 //地磁计Y轴零点
    4. #define offset_mr 115.544546/124.374368 //地磁计圆化比率x/y

注意:每更换一个芯片,或更改芯片的安装位置都需要重新校准,重复上述过程,偏移量的大小与芯片是否水平密切相关

角度计算

由X轴和Y轴的磁场强度计算角度
【全局定位】MPU9250地磁计校准与使用 - 图5
但是这个角度的取值范围为±【全局定位】MPU9250地磁计校准与使用 - 图6,需要结合象限值进一步计算角度值,根据不同的象限不同处理
处理方法可以直接在图上分情况分析即可

  1. /**
  2. * @brief 得到地磁计方位角度
  3. * @note 弧度制
  4. * @param Angle:原始角度
  5. ori_mx:X轴磁强值
  6. ori_my:Y轴磁强值
  7. * @retval AbsAngle:处理后的角度(0~2PI°顺时针)
  8. */
  9. double mag_AbsAngle_deal(double Angle,rt_int16_t ori_mx,rt_int16_t ori_my)
  10. {
  11. double AbsAngle = 0.0;
  12. if(ori_mx>0 && ori_my>0)
  13. {
  14. AbsAngle = 2*PI - Angle;
  15. }
  16. else if(ori_mx<0 && ori_my>0)
  17. {
  18. AbsAngle = PI - Angle;
  19. }
  20. else if(ori_mx<0 && ori_my<0)
  21. {
  22. AbsAngle = PI - Angle;
  23. }
  24. else if(ori_mx>0 && ori_my<0)
  25. {
  26. AbsAngle = - Angle;
  27. }
  28. else if(ori_mx==0 && ori_my>0)
  29. {
  30. AbsAngle = PI/2.0*3.0;
  31. }
  32. else if(ori_mx==0 && ori_my<0)
  33. {
  34. AbsAngle = PI/2.0;
  35. }
  36. else if(ori_mx<0 && ori_my==0)
  37. {
  38. AbsAngle = PI;
  39. }
  40. return AbsAngle;
  41. }
  • 由此得到的角度范围为0~2【全局定位】MPU9250地磁计校准与使用 - 图7

    数据滤波

  • 从前面原始数据的分析中,可以看到测量到的磁场强度同样存在着噪声

  • 带着噪声计算的角度也会数据波动较大,得不到较为准确稳定的角度值
  • 此时的滤波有两种选择
    • 原始数据滤波,即分别对X轴Y轴的磁场强度滤波
    • 对计算所得的夹角滤波
  • 这里应当采用第一种滤波方案,如果采用第二种,会将2【全局定位】MPU9250地磁计校准与使用 - 图8到0的突变同样滤掉,得到异常的角度值,而磁场强度值是连续的,不会存在这样的问题
  • 因此,在得到原始数据后对磁场强度做滤波处理,在进行角度的转换等操作
  • 滤波器仍采用一维卡尔曼滤波器,滤波效果较好

    相对角度

  • 通过上述方法即可以得到地磁计的绝对角度,即MPU9250模块正向与北极之间的角度

  • 但是我们用在全局定位上的是相对角度,即默认初始角度是0,我们只关心它变化了多少度
  • 因此添加了采样环节,在开始的一段时间内采样取平均求出初始角度
  • 在后面计算的过程中,所得的角度减去初始角度,即为变化的角度
  • 这里仍然有一个问题,因为我们所得的角度是0~2【全局定位】MPU9250地磁计校准与使用 - 图9,算得的变化的角度也应当是0~2【全局定位】MPU9250地磁计校准与使用 - 图10
  • 当后面得到的角度小于初始角度,作差得到的是一个负角,因此需要再进行一次角度的变换 ```c if(Angle_mz < offset_Angle_mz) {
    1. Angle_mz =2*PI - (offset_Angle_mz - Angle_mz);
    } else {
    1. Angle_mz = Angle_mz - offset_Angle_mz;
    }

```

  • 综上即可实现通过电子罗盘获取角度

参考链接

空间二次曲面数据拟合算法推导及仿真分析