我一直在用arduino制作一个使用两个gps模块的设备。因此,一个发送gps线,另一个接收并将其当前位置与发送器的位置进行比较,一旦接收器距离发送器几米,指示灯就会亮起,指示发送器就在附近,如果你要离开发送器,指示灯会熄灭。所以我的问题是我不知道如何比较电线的接收值和当前值以准确工作。这就是我一直在努力工作的地方,我不知道我是否会用错误的方式完成这项工作。我不知道你是否可以做一些半径并使用它。如果有人能帮我解决这个问题,我将不胜感激。从发送者Lat:12.76433041 Lon:54.74539143从接收者Lat:12.76443854 Lon:547.4539435收到的示例数据。
int destLat;
int currLat;
int destLon;
int currLng;
currLat = gps.location.lat();
destLat = Lat;
currLng = gps.location.lng();
destLon = Lon;
bool AreSame(float currLat, float destLat)
if fabs(currLat - destLat) < EPSILON;
{
if fabs(currLng - destLon) < EPSILON;
digitalWrite (4, HIGH);
}
您要查找的是两个地理坐标之间的"距离"。
这不是一项简单的任务。有几个公式可以近似这一点,但我认为你不会找到误差小于1米的公式。
此外,正如Jim所提到的,GPS测量本身的误差在大多数情况下都会高于几米。一些GPS接收机将在运行时提供估计的水平误差。我想你用的是便宜的。你应该考虑到精度也取决于接收器的质量,所以不要期望有好的结果。
你需要使用的确切公式超出了我的知识范围,我只能给出一些关键词作为参考,你可能想研究"haversine"one_answers"great circle distance"。
尽管如此,你还是可以"作弊"一点。假设设备的所有使用都将在同一个局部区域进行,您可以通过实验确定"epsilon"的值。
开始你的arduino,向北走X米,记录纬度的差异,这就是你的E1。回到起点,向东走X米,记录经度差,这是E2。
然后,一个超级粗略的公式来测试一个设备是否比第二个设备相距X米以上:
sqrt(ΔLat**2 + ΔLong**2) < sqrt(E1**2 + E2**2).
这当然是假设接收器的误差不是太高。
这:
if fabs(currLat - destLat) < EPSILON;
{
if fabs(currLng - destLon) < EPSILON;
digitalWrite (4, HIGH);
}
应该更像:
if (fabs(currLat - destLat) < EPSILON) /* no semicolon needed here */
{
if (fabs(currLng - destLon) < EPSILON) /* or here */
digitalWrite (4, HIGH); /* runs when both conditions are true */
}
在Python中,使用pyproj模块很容易。
from pyproj import Geod # sudo pip3 install pyproj
geoid = Geod(ellps='WGS84') # See pyproj documentation for other fun options
def odometer(start, end):
"""Calculate bearings and distance between two longitude/latitude tuples.
Arguments:
start (tuple of float): longitude and latitude of start position e.g., (-146.241122, -15.560615) Apataki Carenage
end (tuple of float): longitude and latitude of end position, e.g., (150.142778,-30.290556) Mt. Kaputar
Returns:
float: True North bearing start -> end
float: True North bearing end -> start
float: distance start <-> end
Raises:
some error, I know not what.
"""
try:
bearing_to, bearing_fro, distance = geoid.inv(*start + end)
except Exception as error: # try to be more specific here!
print("Can't calculate bearing or distance because:", error)
return None
bearing_to %= 360
bearing_fro %= 360
return bearing_to, bearing_fro, distance
需要记住的一点是,赤道处的0.000001
度经度约为10厘米。虽然你的gps设备可以返回这种精度(或更高)的外观,但这种精度的可能性并不存在。