(一) ATan,ATan2区别
相比较ATan,ATan2究竟有什么不同?本篇介绍一下ATan2的用法及使用条件。
对于tan(θ) = y / x:
θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]。
θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。
-
当 (x, y) 在第一象限, 0 < θ < PI/2.
-
当 (x, y) 在第二象限 PI/2 < θ≤PI.
-
当 (x, y) 在第三象限, -PI < θ < -PI/2.
-
当 (x, y) 在第四象限, -PI/2 < θ < 0.
当点(x, y)在象限的边界也就是坐标轴上时:
-
当 y 是 0,x 为非负值, θ = 0.
-
当 y 是 0, x 是 负值, θ = PI.
-
当 y 是 正值, x 是 0, θ = PI/2.
-
当 y 是 负值, x 是 0, θ = -PI/2.
由此可知,一般情况下用ATan即可,当对所求出角度的取值范围有特殊要求时,应使用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轴就省事了。其实只是个计量方法的不同,不晓得为什么要弄得这么复杂的样子。
****
看完了这些基础知识,我们来分析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°), 而我们通常读出的指南针角度是0°~360°,所以需要把这个范围进行平移180°,到指南针的角度。但是这样一来,原来60°的角度变成了240°,也就是,整个象限沿着虚线被"镜像"了一下。
下图x轴要变成"南“的位置,好吧,这样就正常了。
于是我们得到了下面这个方位判断:
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 (东北)位置,正确。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>