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

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

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

    // condition for valid response
    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", "OK", 1000);
    }
}
uint8_t sendATCommand(char* ATcommand, const char *expectedResponse, unsigned long timeout)
{
    uint8_t x = 0, answer = 0;

    memset(AT_Buffer, '\0', AT_BufferLength);    // Initialice the string
    delay(100);
    while (Serial1.available() > 0) Serial1.read();    // Clean the input buffer
    if (ATcommand[0] != '\0')
    {
        Serial1.println(ATcommand);    // Send the AT command
    }

    unsigned long previous = millis();

    // this loop waits for the answer
    do {

        if (Serial1.available() != 0) {    // if there are data in the UART input buffer, reads it and checks for the asnwer
            AT_Buffer[x] = Serial1.read();
            //Serial.print(AT_Buffer[x]);
            x++;
            if (strstr(AT_Buffer, expectedResponse) != NULL)    // check if the desired answer (OK) is in the response of the module
            {
                answer = 1;
                break;
            }

        }
    } while ((millis() - previous < timeout));    // Waits for the asnwer with time out

    return answer;
}
1 голос | спросил Iqbal Hossain 11 AMpWed, 11 Apr 2018 09:22:30 +030022Wednesday 2018, 09:22:30

1 ответ


1

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

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

Чтобы визуализировать его в 1-мерном виде, вы можете представить себе простую последовательность чисел 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 секунд (например) и использовать их как среднюю скорость за этот период времени, что сглаживает такие пики и впадины.

ответил Majenko 11 PMpWed, 11 Apr 2018 14:07:02 +030007Wednesday 2018, 14:07:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132