电子罗盘——HMC5883L——三轴磁场传感器

2019-07-20 16:20发布

(一) ATan,ATan2区别
 相比较ATan,ATan2究竟有什么不同?本篇介绍一下ATan2的用法及使用条件。 对于tan(θ) = y / x: θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]。 θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。
  • 当 (xy) 在第一象限, 0 < θ < PI/2.
  • 当 (xy) 在第二象限 PI/2 < θPI.
  • 当 (xy) 在第三象限, -PI < θ < -PI/2.
  • 当 (xy) 在第四象限, -PI/2 < θ < 0.
当点(xy)在象限的边界也就是坐标轴上时:
  • 当 y 是 0,x 为非负值, θ = 0.
  • 当 y 是 0, x 是 负值, θ = PI.
  • 当 y 是 正值, x 是 0, θ = PI/2.
  • 当 y 是 负值, x 是 0, θ = -PI/2.
由此可知,一般情况下用ATan即可,当对所求出角度的取值范围有特殊要求时,应使用ATan2

(二) 什么是磁偏角和方位公式

磁偏角

磁偏角,即现实中指北针指向的磁极(地磁极)和我们地图上标注的传统意义的磁极是不重合的,有一个夹角。 你看地球仪上的地球也不是歪脖子转动么,就是这个意思。

下面是几何时间,如何定义方位。这里采用了反正切角的表达方式。

Atan2, 反正切角

公式

为了做这个电子罗盘,反正切角(Atan2)这种不知哪个星球来的东西都学习了。
π是180度,2π是360度,1/2π是90度... 其实这个反正切角就是射线(x,y)和x轴正向间的夹角。没什么好神秘的。如果y<0,射线在x轴下方,那么角度从x轴正向顺时针旋转,而且是负值;如果y>0,角度从x轴正向逆时针旋转。大量图示和公式来自基维百科。

几个特殊点的取值。
(0,0)夹角为0
(0, 1)对于的复平面夹角为π/2,
(?1, 0)对于复平面的夹角为π,
(0, ?1)对于复平面的夹角为3π/2,

下面看下atan2和我们一般atan的区别。三维图,找到x,y轴就省事了。其实只是个计量方法的不同,不晓得为什么要弄得这么复杂的样子。

atan2, 按照y>0 和 y < 0分别从逆时针和顺时针计算

tan,就是我们一般的正切

****
看完了这些基础知识,我们来分析honeywell的HMC5883三轴数位罗盘对角度的计算公式。

angle= atan2(y,x) * (180 / 3.14159265) + 180; 

其实就是这样的:
角度 = atan2(y,x) * (180 / π) + 180,这里角度用0~360°表示

因为atan2(y,x) 算出来的会是多少π,所以后面用了个 180/π来换算成度数(0~360°)。但是,但是后面那个 +180是干嘛?

如果是60°的角,+180就变成了240°,从A点变成了B点变成了下面这个图。

+180°引起的效果 

仔细想想公式,因为这种反正切角的范围是从-π到π (-180°~180°), 而我们通常读出的指南针角度是0°~360°,所以需要把这个范围进行平移180°,到指南针的角度。但是这样一来,原来60°的角度变成了240°,也就是,整个象限沿着虚线被"镜像"了一下。


下图x轴要变成"南“的位置,好吧,这样就正常了。

p8880518.jpg

于是我们得到了下面这个方位判断:

    if((angle < 22.5) || (angle > 337.5 ))
        Serial.print("South");
    if((angle > 22.5) && (angle < 67.5 ))
        Serial.print("South-West");
    if((angle > 67.5) && (angle < 112.5 ))
        Serial.print("West");
    if((angle > 112.5) && (angle < 157.5 ))
        Serial.print("North-West");
    if((angle > 157.5) && (angle < 202.5 ))
        Serial.print("North");
    if((angle > 202.5) && (angle < 247.5 ))
        Serial.print("NorthEast");
    if((angle > 247.5) && (angle < 292.5 ))
        Serial.print("East");
    if((angle > 292.5) && (angle < 337.5 ))
        Serial.print("SouthEast");

假设我们是60°角,也就是指北针正北顺时针转60度位置,应该在NE(东北)位置,套用上面的公式,60 + 180 = 240°,然后套用上面的条件判断:angle > 202.5° 并且angle < 247.5°,处于NorthEast (东北)位置,正确。 

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
mengfahai123
1楼-- · 2019-07-22 01:13
非常好!!!谢谢分享
hello_galaxy
2楼-- · 2019-07-22 01:53
 精彩回答 2  元偷偷看……
genglei1003
3楼-- · 2019-07-22 07:30
MARK!
chenghuayou
4楼-- · 2019-07-22 09:45
 精彩回答 2  元偷偷看……
leonardo_liu
5楼-- · 2019-07-22 13:35
MARK !

一周热门 更多>