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;
}
@Iqbal Hossain, 👍1
Обсуждение1 ответ
Лучший ответ:
Расчет скорости в большинстве систем 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 секунд (например) и использовать это как среднюю скорость за этот период времени, что сгладит такие пики и спады.
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Как извлечь широту и долготу из GPS
- Не получение данных от GPS
- NEO GPS 6M подключение к Lilypad Arduino
- Как найти правильный курс навигации по GPS-навигации с помощью Arduino?
- Arduino Mega не получает данные от Neo-6M
- Регистрация данных о скорости с помощью arduino и GPS-модуля
Нужно проверить ваш код, возможно, вам нужно что-то там исправить..., @flik
вот мой код https://pastebin.com/Rzc1qXTF, @Iqbal Hossain
**Отредактируйте** свой вопрос, вставьте в него код. Выделите его и нажмите Ctrl+K, чтобы отформатировать его как код., @Nick Gammon
Ссылка ERR_CONNECTION_TIMED_OUT не открывается.., @flik