сравнение координат GPS с определенным запасом в c

Я привязывал, чтобы сделать устройство с ардуино, которое будет использовать два модуля gps. Таким образом, один отправляет шнуры GPS, а другой получает и сравнивает свое текущее местоположение с местоположением отправителя, и как только получатель окажется на расстоянии нескольких метров от отправителя, загорится светодиодный индикатор, указывающий, что отправитель находится поблизости, и если вы уйдете от отправитель светодиод выключится. Итак, моя проблема в том, что я не могу понять, как сравнить полученные и текущие значения шнуров для точной работы. Это то, что я пытался заставить работать, я не знаю, буду ли я завершать неправильный путь с этим, я не знаю, можете ли вы сделать какой-то радиус и использовать его, если бы кто-то мог помочь мне решить эту проблему, я был бы очень признателен. Пример данных, полученных от отправителя Lat: 12.76433041 Lon: -54.74539143 от Lat получателя: 12.76433854 Lon: -54.74539435.

 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);
    }

person Ismar Perez    schedule 02.05.2015    source источник
comment
Вы не описали фактическое поведение, которое вы наблюдаете. Кроме того, я не думаю, что ваш GPS-приемник может определить несколько метров от отправителя с большой надежностью.   -  person Jim Garrison    schedule 02.05.2015
comment
Я видел, как работает GPS в нескольких метрах от отправителя. Данные, которые я получаю, имеют точность 8 десятичных знаков, так что, скажем, например, широта отправителя: 12.76433041, долгота: -54.74539143, широта получателя: 12.76433854, долгота: -54.74539435   -  person Ismar Perez    schedule 02.05.2015


Ответы (3)


Вам нужно найти «расстояние» между двумя географическими координатами.

Это непростая задача. Есть несколько формул, которые могут приблизиться к этому, но я думаю, вы не найдете ничего, что могло бы дать вам ошибку меньше 1 метра.

Кроме того, как упомянул Джим, ошибка самого измерения GPS в большинстве случаев будет выше нескольких метров. Некоторые приемники GPS выдают расчетную ошибку по горизонтали во время работы. Я предполагаю, что вы используете дешевый. Следует учитывать, что точность зависит также от качества приемника, поэтому не ждите хороших результатов.

Точная формула, которую вам нужно использовать, мне неизвестна, я могу привести только некоторые ключевые слова в качестве ссылок, вы можете исследовать «гаверсинус» и «расстояние по большому кругу».

Тем не менее, вы можете немного «схитрить». Предполагая, что все использования устройства будут выполняться в одной и той же локальной области, вы можете экспериментально определить значение «эпсилон».

Запустите свой Arduino, идите на север. X метров запишите разницу в широтах, это ваш E1. Вернитесь в исходную точку, пройдите X метров на восток, запишите разницу в долготах, это E2.

Затем очень схематичная формула для проверки того, находится ли одно устройство на расстоянии более X метров от второго:

sqrt(ΔLat**2 + ΔLong**2) < sqrt(E1**2 + E2**2). 

Это, конечно, предполагает, что ошибка приемника не слишком велика.

person Artium    schedule 02.05.2015

Этот:

   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 */
    }
person Jim Lewis    schedule 02.05.2015
comment
Я не думаю, что мой подход к этому сработает, знаете ли вы о каких-либо функциях радиуса на c, которые я мог бы использовать для решения моей проблемы, большое вам спасибо. - person Ismar Perez; 02.05.2015
comment
@Ismar, пожалуйста, посмотрите ответы на вопрос, который я пометил как дублирующий. - person Jim Lewis; 03.05.2015

В 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 могут возвращать видимость этой точности (или большей), вероятность такой точности отсутствует.

person Nodak    schedule 03.05.2015