GPS показывает неверную скорость

Я использую Arduino ATmega 2560. Когда я использую команду «AT+CGNSINF» для получения значения GPS, иногда она показывает неправильную скорость. Правильная скорость должна быть (50-60) км/ч, но иногда она показывает (200-300) км/ч. Как я могу решить проблему или избежать/игнорировать неожиданную скорость. вот мой код

void get_GPS()
{
    sendATCommand("AT+CGNSINF","OK", 1000);

    // условие валидного ответа
    while (strstr(AT_Buffer, "+CGNSINF: 1,1") != NULL)
    {
        delay(3000);
        strtok(AT_Buffer, ",");
        strtok(NULL, ",");
        strtok(NULL, ",");
        strtok(NULL, ",");
        strtok(NULL, ",");
        strtok(NULL, ",");
        Serial.println("\n");
        Serial.println(strtok(NULL, ","));

        //sendATCommand("AT+CGNSINF", "ОК", 1000);
    }
}
uint8_t sendATCommand(char* ATcommand, const char *expectedResponse, unsigned long timeout)
{
    uint8_t x = 0, answer = 0;

    memset(AT_Buffer, '\0', AT_BufferLength);    // Инициализируем строку
    delay(100);
    while (Serial1.available() > 0) Serial1.read();    // Очищаем входной буфер
    if (ATcommand[0] != '\0')
    {
        Serial1.println(ATcommand);    // Отправляем АТ-команду
    }

    unsigned long previous = millis();

    // этот цикл ждет ответа
    do {

        if (Serial1.available() != 0) {    // если во входном буфере UART есть данные, считывает их и проверяет ответ
            AT_Buffer[x] = Serial1.read();
            //Serial.print(AT_Buffer[x]);
            x++;
            if (strstr(AT_Buffer, expectedResponse) != NULL)    // проверяем, есть ли в ответе модуля желаемый ответ (ОК)
            {
                answer = 1;
                break;
            }

        }
    } while ((millis() - previous < timeout));    // Ожидает ответа с тайм-аутом

    return answer;
}

, 👍1

Обсуждение

Нужно проверить ваш код, возможно, вам нужно что-то там исправить..., @flik

вот мой код https://pastebin.com/Rzc1qXTF, @Iqbal Hossain

**Отредактируйте** свой вопрос, вставьте в него код. Выделите его и нажмите Ctrl+K, чтобы отформатировать его как код., @Nick Gammon

Ссылка ERR_CONNECTION_TIMED_OUT не открывается.., @flik


1 ответ


Лучший ответ:

2

Расчет скорости в большинстве систем GPS очень грубый. Он состоит просто из «Где я был тогда? Где я сейчас?». Многие также добавят «Сколько времени прошло между тогда и сейчас?», но многие этого не делают — они предполагают фиксированное время между точками (например, 1 секунда). Он не знает, что должен двигаться, все, что он знает, — это координаты, которые у него есть в данный момент.

В последнем случае, если вы не получаете показаний в течение нескольких секунд (например, из-за зданий), положение может внезапно сильно подскочить. Вы можете увидеть эффект в GPS вашего телефона в застроенных районах — ваше положение может подскочить на большие расстояния, а затем немного замереть.

Чтобы визуализировать это в одномерном виде, вы можете представить себе простую последовательность чисел от 0 до 9 и разницу между каждым значением:

Value:        0 1 2 3 4 5 6 7 8 9 
Difference:     1 1 1 1 1 1 1 1 1

Разница соответствует «скорости» последовательности.

Теперь, если числа не обновляются плавно, а все сразу в конце, вы получите что-то вроде:

Value:        0 1 2 2 2 2 2 7 8 9
Difference:     1 1 0 0 0 0 5 1 1

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

Вы должны отфильтровывать такие аномалии. Достаточно просто сказать: «5 — это слишком много, проигнорируйте». Вы также можете усреднить данные за последние 10 секунд (например) и использовать это как среднюю скорость за этот период времени, что сгладит такие пики и спады.

,