如何将原始xyz磁强计数据转换为标题?

时间:2016-02-24 11:14:19

标签: c++ embedded compass magnetometer

我正在使用带有简单3轴磁力计的嵌入式设备。我现在在微特斯拉显示X Y Z值但是如何将它们转换为罗盘标题?我曾尝试在谷歌上查找,但我发现的一切似乎都非常复杂/解释不清楚。

如果可能的话,我想知道如何进行倾斜补偿以及无需补偿倾斜。

我目前在X,Y,Z的平面上获得的值分别为70,0.8和34.1,以防某些方面有所帮助。

P.S如果它有帮助,这里是我用于磁力计的代码片段:

mSensor.enable();

while(true){
    wait(1);
    mSensor.getAxis(mData);
    lcd.cls();
    lcd.locate(0,3);
    lcd.printf("X=%4.1f micro-Tesla\n\rY=%4.1f micro-Tesla\n\rZ=%4.1f micro-Tesla", mData.x, mData.y, mData.z);

2 个答案:

答案 0 :(得分:5)

如果不对倾斜进行补偿,它就不会太复杂:

angle = atan2(Y, X);

这实际上与将笛卡尔坐标[X,Y]中的矢量转换为极坐标[长度,角度]中的矢量相同,而不需要长度。

对于倾斜补偿版本,您需要先将3D矢量[X,Y,Z]投影到平面[X2,Y2]上,然后使用与之前相同的公式。但要做到这一点,你需要一个加速度计来了解倾斜量。

答案 1 :(得分:1)

您首先需要进行校准(可以使用设备校准方法,也可以通过将其旋转一个完整的圆圈来确定整个场强)。

然后,您可以使用X,Y和Z读数来计算“北”相对于您指向的位置的位置(请注意,“北”的变化幅度最大为30度,具体取决于您在地球上的哪个位置是(称为偏角-参见http://www.magnetic-declination.com/),并且也不与地面成水平(令人困惑的称为“倾斜”-参见https://physics.stackexchange.com/questions/283761/if-you-hold-a-compass-needle-vertical-does-it-point-down-or-up-differently-on-wh/283782

如果将X,Y和Z读数表示为“在一个假想的圆上是磁力的方向-那些3个圆在3个不同的平面上,则您可以计算指向磁的矢量的逻辑位置向北3个维度。

坏消息-没有一种简单的方法可以准确地完成您想要的事情,而且绝对没有一种方法不对所有3个读数都进行精确的数学运算(您不能仅使用X和/或Y)。

好消息-您可能真的不需要知道实际的“标题”-与您已经知道的东西相比,大多数应用程序只需要一些本地相对方向即可。

请注意,很强的磁铁(例如所有现代电动机中的磁铁)会严重干扰很长一段距离(甚至10英尺或更多)的读数,请从您的手机商店中获取一个显示手机磁力计读数的应用,然后挥动磁铁周围容易看到这一点!