使用Arduino计算两点之间的GPS距离

使用Arduino计算两点之间的GPS距离,arduino,Arduino,我试图制作一个简单的车对车V2V换向系统,使用一个nRF24L01作为发射器,另一个作为连接到Arduino Uno的接收器。然后,我为每个Arduino板类型Adafruit Ultimate GPS突破版本3连接了2个GPS设备。是否有一个数学方程或简单代码可用于处理从两台设备获得的经度和纬度,以了解两辆车之间的距离,并根据发送器发送的更新值确定方向,例如,接近或离开的车 我试图计算nRF24L01提供的覆盖范围内的距离,该覆盖范围提供500米,例如,当第一辆车进入第二辆车的范围时,有两辆车

我试图制作一个简单的车对车V2V换向系统,使用一个nRF24L01作为发射器,另一个作为连接到Arduino Uno的接收器。然后,我为每个Arduino板类型Adafruit Ultimate GPS突破版本3连接了2个GPS设备。是否有一个数学方程或简单代码可用于处理从两台设备获得的经度和纬度,以了解两辆车之间的距离,并根据发送器发送的更新值确定方向,例如,接近或离开的车

我试图计算nRF24L01提供的覆盖范围内的距离,该覆盖范围提供500米,例如,当第一辆车进入第二辆车的范围时,有两辆车的直道。我可以利用两辆车中GPS的优势实时获得这些车之间的近似距离。实际上,我读过不同的方法,但我在寻找一些简单的方法,因为我尝试将其应用于我的简单建议场景中,并且我成功地将第二辆车的经度和纬度通过nRF24L01传输到第一辆车

下面是我将GPS连接到Arduino时得到的数据

要使用GPS坐标计算两点之间的距离,需要使用

下面的代码显示了如何做(在C++中,但是你应该能够很容易地用你想要的语言来适应它)。

#包括
使用名称空间std;
//将度转换为弧度的实用函数
长双环面(常数长双度)
{ 
长双一度=(M_-PI)/180;
返回(一度);
} 
长双倍距离(长双倍lat1、长双倍long1、,
长双板条2,长双板条2)
{ 
//将纬度和经度从度转换为弧度。
lat1=环面(lat1);
long1=托拉第安(long1);
lat2=环面(lat2);
long2=托拉第安(long2);
//哈弗森公式
长双dlong=long2-long1;
长双dlat=lat2-lat1;
长双ans=pow(sin(dlat/2),2)+cos(lat1)*cos(lat2)*pow(sin(dlong/2),2);
ans=2*asin(sqrt(ans));
//以公里为单位的地球半径,R=6371
//使用R=3956表示英里数
长双R=6371;
//计算结果
ans=ans*R;
返回ans;
}
//驱动程序代码
int main()
{ 
长双板条1=53.320556;
长双长1=-1.72972221;
长双板条2=53.318611111111;
长双长2=-1.69972223;
//调用距离函数

cout要使用GPS坐标计算两点之间的距离,需要使用

下面的代码显示了如何做(在C++中,但是你应该能够很容易地用你想要的语言来适应它)。

#包括
使用名称空间std;
//将度转换为弧度的实用函数
长双环面(常数长双度)
{ 
长双一度=(M_-PI)/180;
返回(一度);
} 
长双倍距离(长双倍lat1、长双倍long1、,
长双板条2,长双板条2)
{ 
//将纬度和经度从度转换为弧度。
lat1=环面(lat1);
long1=托拉第安(long1);
lat2=环面(lat2);
long2=托拉第安(long2);
//哈弗森公式
长双dlong=long2-long1;
长双dlat=lat2-lat1;
长双ans=pow(sin(dlat/2),2)+cos(lat1)*cos(lat2)*pow(sin(dlong/2),2);
ans=2*asin(sqrt(ans));
//以公里为单位的地球半径,R=6371
//使用R=3956表示英里数
长双R=6371;
//计算结果
ans=ans*R;
返回ans;
}
//驱动程序代码
int main()
{ 
长双板条1=53.320556;
长双长1=-1.72972221;
长双板条2=53.318611111111;
长双长2=-1.69972223;
//调用距离函数

cout根据Arduino标签:

如果是短距离的,不要太靠近两极,如果你喜欢驾驶直线而不是地球表面最短的拱门

…您可以使用欧几里德几何,采用恒定的纵横比和固定的
lon/dist_-WE比率,取决于cos(lat)

在通常的船舶上,尤其是当配备了32号Arduinos时,cos(lat)可以安全地每天计算一次,甚至仅在功率重置时计算

相反,在对dlat和dlon进行减法运算时,请确保不会丢失精度。 您的(32.0512N 44.4497E)似乎只四舍五入到10米左右的精度

海员海里的定义为60英里=1°纬度=1°经度@赤道

为了方便起见,我们返回km

const float kmpdeg = 111.195;  // km per degree
float coslat; // 1.000 @ 0° ,  0.500 @ 60°

typedef struct {float lat; float lon; } pos;  // S or W are negative
// eventually define something more accurate

pos p1 {32.0512, 44.4497};
pos p2 {32.0305, 44.4015}; // Kufa mosque, a few km southwest

float dist(const pos& a, const pos& b) {
  if (coslat == 0.0) {  // no need to calculate every time
   float lat = (a.lat + b.lat) / 2;
   coslat = cos(lat * PI / 180);
  } 
  
  float dlat = a.lat - b.lat;
  float dlon = (a.lon - b.lon) * coslat;

  return sqrt(dlat*dlat + dlon*dlon) * kmpdeg;
}

与精确的哈弗公式或在线计算器相比,如果是用于较小但仍然有效的GPS距离,您不会注意到显著差异。

根据Arduino标签:

如果是短距离的,不要太靠近两极,如果你喜欢驾驶直线而不是地球表面最短的拱门

…您可以使用欧几里德几何,采用恒定的纵横比和固定的
lon/dist_-WE比率,取决于cos(lat)

在通常的船舶上,尤其是当配备了32号Arduinos时,cos(lat)可以安全地每天计算一次,甚至仅在功率重置时计算

相反,在对dlat和dlon进行减法运算时,请确保不会丢失精度。 您的(32.0512N 44.4497E)似乎只四舍五入到10米左右的精度

水手海里的定义为60英里=1°纬度=1°经度@equa