目录
前言
博主从来没有研究过磁力计,拿到一块HMC5883L就开始怼,记录瞎整磁力计的知识。也是对自己的理解的一种梳理。
地磁场和航向角
地球的磁场像一个条形磁体一样由磁南极指向磁北极。在磁极点处磁场和当地的水平面垂直,在赤道磁场和当地的水平面平行,所以在北半球磁场方向倾斜指向地面。用来衡量磁感应强度大小的单位是Tesla或者Gauss(1Tesla=10000Gauss)。随着地理位置的不同,通常地磁场的强度是0.4-0.6Gauss。需要注意的是,磁北极和地理上的北极并不重合,通常他们之间有11度左右的夹角。
地磁场是一个矢量,对于一个固定的地点来说,这个矢量可以被分解为两个与当地水平面平行的分量和一个与当地水平面垂直的分量。如果保持电子罗盘和当地的水平面平行,那么罗盘中磁力计就和这三个分量对应起来了。
实际上对水平方向的两个分量来说,他们的矢量和总是指向磁北的。罗盘中的航向角就是方向与磁北的夹角,当罗盘水平旋转的时候,航向角在0°~360°之间变化。
**博主记:**我们知道在实际的磁罗盘的应用中,磁力计的安装是固定的,也就是我们可以知道,某一点的磁场强度方向可以说是固定的,这时候如果我们旋转磁力计,会得出此磁场的X,Y,Z分量,这时候这三个分量对应的是磁力计上所标注的三个X,Y,Z方向(理论上可以称之为机体坐标系),而实际如果我们要测量偏航角,我们需要对应到地面坐标系,也就是有一个机体坐标系到地面坐标系的转换过程。
磁场干扰
- 硬磁干扰
"Hard iron" error caused by materials fixed to the vehicle body that produce static magnetic fields.
硬磁干扰是指固定在磁力计所在机体的表面物质产生的固定方向的干扰。硬磁干扰会导致磁力计所采集的数据形成的圆球偏离球心。 - 软磁干扰
"Soft iron" error caused by materials fixed to the vehicle body that distort magnetic fields.
软磁干扰是指固定在磁力计所在机体的表面物质所产生的混乱地磁场的干扰,也就是磁场干扰的方向不是固定的。软磁干扰会导致磁力计所采集的数据形成的圆球变成椭球。
磁场校准
因为磁场干扰的原因,实际中我们测量的磁力计数据是不准确的,需要进行校准才可以使用。这篇被转载烂了的文章:磁力计的基本工作原理中讲述了磁力计校准的一些方法和原理。博主因为工作的原因,需要校准的好一些,所以使用椭球拟合算法进行校准。以下在APM中对校准过程的一些介绍:
`
- This is done by taking a set of samples that are assumed to be the product
- of rotation in earth’s magnetic field and fitting an offset ellipsoid to
- them, determining the correction to be applied to adjust the samples into an
- origin-centered sphere.
`
通过获得磁力计在地磁场中旋转的一系列数据,来拟合出一个有偏移的椭球。然后把椭球通过校准得到一个球心的原点的球体,以此来进行校准。
椭球拟合算法
博主纠结了几天,在网上没有找到合适的椭球拟合现成的代码。后面有大神帮忙,找到pixhawk中的关于椭球校准的代码。
注意:博主在什么都不知道的情况下,想尝试移植APM中的椭球拟合代码,只能说mmp!还是参考pixhawk中的代码比较合理!
注意:在磁力计校准中,我们可以在校准之前用如下方法判断磁力计当前的状态是否正确:
1.磁力计的X轴指向正北时,磁力计的寄存器X轴此时应该输出最大值;磁力计的X轴指向正南时,X轴应该有最小值。
2. 磁力计的Y轴指向正北时,磁力计的寄存器Y轴此时应该输出最小值;磁力计的X轴指向正南时,Y轴应该有最大值。
HMC5883L三轴数字罗盘
详细的参考《HMC5883L中文规格书.pdf》,主要的特点:
- 自测:为了检测
HMC5883L是否正常运行,传感器内部可产生标准磁场而进行自测试。 - 控制该装置可以通过IIC总线来实现。
寄存器简介
- 配置寄存器A(地址:0x00)
配置寄存器是用来配置该装置设置的数据输出速率和测量配置。 - 配置寄存器B(地址:0x01)
配置寄存器B设置装置的增益。 - 模式寄存器(地址:0x02)
模式寄存器用来设定装置的操作模式 - 数据输出X寄存器A(地址:0x03)和B(地址:0x04)
数据输出X寄存器A和B都是8位寄存器。其中,数据输出X寄存器A中存储测量结果中的MSB(高位数据),数据输出X寄存器B存储测量结果的LSB(低位数据)。存储在这两个寄存器中的值是一个16位的二进制补码形式数据,范围是0xF800~0x07FF。 - 数据输出Y寄存器A(地址:0x07)和B(地址:0x08)
数据输出Y寄存器A和B都是8位寄存器。其中,数据输出Y寄存器A中存储测量结果中的MSB(高位数据),数据输出Y寄存器B存储测量结果的LSB(低位数据)。存储在这两个寄存器中的值是一个16位的二进制补码形式数据,范围是0xF800~0x07FF。 - 数据输出Z寄存器A(地址:0x05)和B(地址:0x06)
数据输出Z寄存器A和B都是8位寄存器。其中,数据输出Z寄存器A中存储测量结果中的MSB(高位数据),数据输出Z寄存器B存储测量结果的LSB(低位数据)。存储在这两个寄存器中的值是一个16位的二进制补码形式数据,范围是0xF800~0x07FF。
博主记:特别要注意数据输出Y寄存器(0x07和0x08)和数据输出Z寄存器(0x05和0x06)的地址。博主就是在这个地方坑了,一直计算的校准的偏航角不对,一度怀疑是椭球拟合的代码的问题。其实,最绝望的就是编译通过后,结果不对,完全不知道问题出在哪里!一度怀疑狗(程序员)生!!!
总结
以上是博主磨了几天以后的一些理解,可能还是不完全正确,如果有不正确的地方,不吝赐教!谢谢!