Github
对MPU9250地磁计的校准和使用都记录在Github上的一个项目中,项目还会随着学习的深入进行更新
项目URL:https://github.com/HITLIVING/-RT-Thread-.git
读者可以通过Pull下来整个项目进一步了解
需要格外关注<br />
gyroscope_app.c
gyroscope_app.h
基本原理
想要实现电子罗盘的功能只需MPU9250芯片水平放置时的X轴和Y轴霍尔元件返回磁场大小值
原始数据
就像速度计的零点漂移一样,地磁计的每个轴同样存在着由于芯片自身带来的零点漂移
- 即返回的磁场大小值不是以0为中心
- 同样X轴与Y轴测量的磁场的量程也不同
- 为了观察到这种零点误差,有一种椭圆轨迹的方法
- 同时测量各个轴的原始磁场强度值,旋转MPU9250采集各个方位的信息,这里只关注X轴和Y轴
- 将这些数值在一张图上绘制
- 可以得到如图
- 理想情况下,用此方法绘制的轨迹,应该为圆心为原点的圆
- 而实际情况为中心不在原点的椭圆轨迹
- 因此我们需要对原始数据进行处理,使其轨迹为圆心为原点的圆
椭圆拟合
- 要想处理原始数据,需要知道理想数据与原始数据之间的关系
- 那么就需要知道这个椭圆轨迹的椭圆方程
- 从而需要空间二次曲面数据拟合算法
- 椭圆方程
- 其中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
- 经此处理后的轨迹图为
- 仅此处理后的X轴和Y轴的磁场强度才可用来计算角度值
- 将偏移值作为宏定义写入单片机程序中
//Data from Matlab
#define offset_mx -12.447578 //地磁计X轴零点
#define offset_my 35.371766 //地磁计Y轴零点
#define offset_mr 115.544546/124.374368 //地磁计圆化比率x/y
注意:每更换一个芯片,或更改芯片的安装位置都需要重新校准,重复上述过程,偏移量的大小与芯片是否水平密切相关
角度计算
由X轴和Y轴的磁场强度计算角度
但是这个角度的取值范围为±,需要结合象限值进一步计算角度值,根据不同的象限不同处理
处理方法可以直接在图上分情况分析即可
/**
* @brief 得到地磁计方位角度
* @note 弧度制
* @param Angle:原始角度
ori_mx:X轴磁强值
ori_my:Y轴磁强值
* @retval AbsAngle:处理后的角度(0~2PI°顺时针)
*/
double mag_AbsAngle_deal(double Angle,rt_int16_t ori_mx,rt_int16_t ori_my)
{
double AbsAngle = 0.0;
if(ori_mx>0 && ori_my>0)
{
AbsAngle = 2*PI - Angle;
}
else if(ori_mx<0 && ori_my>0)
{
AbsAngle = PI - Angle;
}
else if(ori_mx<0 && ori_my<0)
{
AbsAngle = PI - Angle;
}
else if(ori_mx>0 && ori_my<0)
{
AbsAngle = - Angle;
}
else if(ori_mx==0 && ori_my>0)
{
AbsAngle = PI/2.0*3.0;
}
else if(ori_mx==0 && ori_my<0)
{
AbsAngle = PI/2.0;
}
else if(ori_mx<0 && ori_my==0)
{
AbsAngle = PI;
}
return AbsAngle;
}
-
数据滤波
从前面原始数据的分析中,可以看到测量到的磁场强度同样存在着噪声
- 带着噪声计算的角度也会数据波动较大,得不到较为准确稳定的角度值
- 此时的滤波有两种选择
- 原始数据滤波,即分别对X轴Y轴的磁场强度滤波
- 对计算所得的夹角滤波
- 这里应当采用第一种滤波方案,如果采用第二种,会将2
到0的突变同样滤掉,得到异常的角度值,而磁场强度值是连续的,不会存在这样的问题
- 因此,在得到原始数据后对磁场强度做滤波处理,在进行角度的转换等操作
-
相对角度
通过上述方法即可以得到地磁计的绝对角度,即MPU9250模块正向与北极之间的角度
- 但是我们用在全局定位上的是相对角度,即默认初始角度是0,我们只关心它变化了多少度
- 因此添加了采样环节,在开始的一段时间内采样取平均求出初始角度
- 在后面计算的过程中,所得的角度减去初始角度,即为变化的角度
- 这里仍然有一个问题,因为我们所得的角度是0~2
,算得的变化的角度也应当是0~2
- 当后面得到的角度小于初始角度,作差得到的是一个负角,因此需要再进行一次角度的变换
```c
if(Angle_mz < offset_Angle_mz)
{
} else {Angle_mz =2*PI - (offset_Angle_mz - Angle_mz);
}Angle_mz = Angle_mz - offset_Angle_mz;
```
- 综上即可实现通过电子罗盘获取角度