ITcoDe.Uz ← Maqolalar

GPS

GPS yolg'on koordinata beryapti: fix sifatini filtrlash

Xaritada avtomobil goh joyida, goh qirq kilometr narida ko'rinardi. Modul ishlayapti, koordinata kelyapti — muammo shundaki, u koordinata ishonchsiz edi.

Bakhrullo Nasrulloyev2026-08-14~6 daqiqa

Muammoning ko'rinishi

NBcaR ishga tushgach, xaritada avtomobil sakrab yurardi. Bir necha soniyada bir necha o'n kilometr "yurib" qaytardi. Avtomobil esa garajda turgan bo'lardi.

Birinchi taxmin — modul buzuq. Aslida modul to'g'ri ishlayotgan edi. Muammo mening kodimda: men har qanday koordinatani to'g'ri deb qabul qilayotgan edim.

GPS moduli nima qaytaradi

GPS qabul qilgichlari NMEA formatidagi matn qatorlarini uzatadi. Ulardan biri — $GPGGA — koordinata bilan birga uning sifatini ham bildiradi.

$GPGGA,123519,4807.038,N,01131.000,E,1,03,8.9,545.4,M,...
                                     │  │   │
                                     │  │   └─ HDOP
                                     │  └───── sun'iy yo'ldosh soni
                                     └──────── fix turi

Uchta muhim ko'rsatkich:

HDOP nima anglatadi

HDOP — yo'ldoshlarning osmondagi joylashuvi qanchalik qulay ekanini ko'rsatadi. Agar ular osmon bo'ylab keng tarqalgan bo'lsa, kesishma nuqta aniq chiqadi. Agar hammasi bir tomonda to'planib qolsa, kesishma cho'zilib ketadi va xato oshadi.

HDOPSifatAmalda
< 2Zo'rNavigatsiya uchun yetarli
2–5YaxshiKuzatuv uchun to'g'ri keladi
5–10O'rtachaXato o'nlab metr
> 10YomonIshonib bo'lmaydi

Mening sakrab yuruvchi nuqtalarim aynan HDOP 12–20 oralig'idagi o'lchovlar edi. Modul ularni to'g'ri belgilagan, men esa belgini o'qimagan edim.

Filtr

Yechim oddiy — koordinatani qabul qilishdan oldin uchta shartni tekshirish:

const uint8_t MIN_SATS = 4;
const float   MAX_HDOP = 5.0;

bool fixIsGood() {
  if (!gps.location.isValid())         return false;
  if (gps.satellites.value() < MIN_SATS) return false;
  if (gps.hdop.hdop() > MAX_HDOP)      return false;
  if (gps.location.age() > 2000)        return false;
  return true;
}

To'rtinchi shart — age() — kam eslanadi, lekin muhim. TinyGPS++ oxirgi ma'lum koordinatani saqlab turadi. Agar modul signalni yo'qotsa, kutubxona eski qiymatni qaytaraverdi va siz uni yangi deb o'ylaysiz. Ikki soniyadan eski ma'lumotni tashlab yuborish kerak.

Nima uchun kamida 4 ta yo'ldosh: uchtasi bilan faqat kenglik va uzunlik hisoblanadi, to'rtinchisi vaqt xatosini tuzatish uchun kerak. Uchta yo'ldosh bilan olingan koordinata rasmiy jihatdan to'g'ri, amalda esa ishonchsiz.

Natija. Filtr qo'yilgandan keyin sakrash butunlay to'xtadi. Koordinata biroz kamroq tez-tez yangilanadigan bo'ldi, lekin har bir nuqta ishonchli.

Eski nuqtani ko'rsatish

Filtr o'tmaganda nima qilish kerak? Ikki variant bor va tanlov vazifaga bog'liq.

Avtomobil kuzatuvi uchun men oxirgi yaxshi nuqtani saqlab turishni tanladim. Foydalanuvchiga "avtomobil shu yerda edi" deb ko'rsatish, "joylashuv noma'lum" deyishdan foydaliroq. Lekin vaqt belgisi bilan birga:

{
  "lat": 38.2733,
  "lon": 67.8942,
  "sats": 7,
  "hdop": 1.8,
  "fresh": false,
  "agoSec": 142
}

Ilovada esa eski nuqta boshqa rangda va "2 daqiqa oldin" yozuvi bilan ko'rsatiladi. Foydalanuvchi ma'lumot qanchalik yangi ekanini biladi va o'zi qaror qabul qiladi.

Sovuq start

Yana bir kutilmagan narsa: modul birinchi marta yoqilganda koordinata topishga 30 soniyadan bir necha daqiqagacha vaqt ketadi. Bu normal — u yo'ldoshlar jadvalini yuklab olishi kerak.

Agar qurilma tez-tez o'chib-yonsa, har safar shu kutish takrorlanadi. Yechim — GPS modulini doimiy quvvatda saqlash yoki batareya bilan ta'minlangan modul ishlatish, u holda jadval saqlanib qoladi va start bir necha soniyaga qisqaradi.

Antenna joylashuvi

Kod qanchalik to'g'ri bo'lmasin, antenna noto'g'ri joylashsa natija yomon bo'ladi. Amaliy kuzatuvlarim:

Oxirgi punkt menda bir kun vaqt oldi: GSM xabar yuborilgan har safar GPS aniqligi keskin tushardi. Ikki antennani 15 santimetr uzoqlashtirish muammoni hal qildi.

Xulosa

GPS moduli sizga koordinata bilan birga uning sifati haqida ham xabar beradi. Bu ma'lumotni e'tiborsiz qoldirish — xaritada sakrab yuruvchi nuqtalar demakdir.

Ikkita raqamni tekshiring: yo'ldosh soni va HDOP. Bu ikki qator kod tizimning ishonchliligini butunlay o'zgartiradi.

GPSNMEATinyGPS++ESP32HDOP