Arduino上的Haversine公式实现

use*_*992 6 haversine arduino-ide

我正在使用GPS和Arduino创建地理围栏.我想实现Ha​​versine公式以找到两点之间的距离,以便用半径计算它.问题是我发现很难在Arduino IDE上实现Haversine Formula,我在Arduino上比较初学.

a = sin²(??/2) + cos(?1).cos(?2).sin²(??/2)
c = 2.atan2(?a, ?(1?a))
d = R.c
Run Code Online (Sandbox Code Playgroud)

如何在Arduino IDE上实现上述公式?

dav*_*han 2

要使用半正矢或 余弦球面定律,您需要 atan2() 或 acos() 函数,这些函数在 Arduino 中似乎不可用。

\n\n

Pythagoras\xe2\x80\x99 定理可用于等距柱状投影来计算距离。这比半正弦或余弦球面定理简单,但仍然允许向极点收敛,并使用 Arduino 中提供的三角函数。

\n\n

理论

\n\n

地球赤道周长 = 40,076 公里。赤道分为 360 度经度,因此赤道上的每一度大约代表 111.32 公里。远离赤道向极点移动,该距离在极点处减小到零。

\n\n
1 degrees aproximates to 111.32 km at equator.\n96.41km at 30 degrees N/S\n78.71 km at 45 degrees N/S\n55.66 km at 60 degrees N/S\n28.82 km at 75 degrees N/S\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用

\n\n

在伪代码中,因为我不知道 Arduino

\n\n
R = 6371;km\nlat/lng in radians\n\nvar x = (lng2-lng1) * cos((lat1+lat2)/2);\nvar y = (lat2-lat1);\nvar dist = sqrt(x*x + y*y) * R;\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
coordinates = (0,0) to (1,0) Haversine 157.293809 km Equirectangular 157.294807 km\ncoordinates = (10,0) to (11,0) Haversine 155.985273 km Equirectangular 155.986379 km\ncoordinates = (20,0) to (21,0) Haversine 152.397156 km Equirectangular 152.39855 km\ncoordinates = (30,0) to (31,0) Haversine 146.81715 km Equirectangular 146.818975 km\ncoordinates = (40,0) to (41,0) Haversine 139.728101 km Equirectangular 139.730447 km\ncoordinates = (50,0) to (51,0) Haversine 131.817706 km Equirectangular 131.820603 km\ncoordinates = (60,0) to (61,0) Haversine 123.976838 km Equirectangular 123.980256 km\ncoordinates = (70,0) to (71,0) Haversine 117.255674 km Equirectangular 117.259525 km\ncoordinates = (80,0) to (81,0) Haversine 112.726966 km Equirectangular 112.731106 km\n
Run Code Online (Sandbox Code Playgroud)\n