<

GPS Verisi Yalan Söyler: Kalman Filtresiyle Rota Düzeltme

Müşteri destek hattına gelen kayıt aynen şöyleydi: "Aracımız cumartesi günü kontak kapalı, anahtar bende, park halinde. Sizin sistem 4,2 kilometre yol yapmış gösteriyor. Şoförüme iftira atmayın." Haritayı açtık; araç gerçekten de kapalı otoparkın çatısı altında dururken nokta bulutu halinde sağa sola sıçramış, sistem bu sıçramaları toplayıp 4,2 kilometrelik hayali bir mesafe çıkarmıştı. Şoför haklıydı. GPS yalan söylemişti ve biz o yalanı faturaya yazmıştık.

2019 baharında filo platformumuzdaki en utandırıcı hata sınıfı buydu: durağan araçların "yürümesi". Ama işin kökenine inince mesele tek bir hatadan çok, GPS'in doğasını yanlış anlamamız çıktı.

Nokta Değil, Olasılık Bulutu

GPS alıcısı size bir koordinat verdiğinde aslında şunu diyor: "Gerçek konum, bu noktanın etrafındaki bir belirsizlik elipsinin içinde bir yerde." Açık gökyüzü altında bu elips 3-5 metre yarıçapında; ama kapalı otopark, yüksek binalar arası, ağaçlık yol veya kamyon kasasının dibine monte edilmiş anten söz konusuysa 30-50 metreye şişebiliyor. Sinyal binadan sekip alıcıya dolaylı yoldan ulaştığında (multipath) alıcı mesafeyi uzun ölçüyor ve nokta bir anda caddenin karşısına atlıyor.

Alıcı bu belirsizliği aslında itiraf ediyor da: NMEA cümlelerinin içinde HDOP diye bir alan var — uydu geometrisinin yatay doğruluğa etkisinin katsayısı. HDOP 1'in altındaysa geometri çok iyi, 5'in üstündeyse o koordinata güvenmeyin demek. Bizim ilk nesil kodumuz HDOP alanını parse edip veritabanına yazıyor ama hiçbir kararda kullanmıyordu. Yıllarca elimizde "bu ölçüm çöp" etiketi varmış, okumamışız.

İlk Yanlış Cevap: Eşik Üstüne Eşik

İlk refleksimiz kural yığmak oldu. HDOP > 4 ise noktayı at. İki nokta arası hız 160 km/s'yi aşıyorsa at. Kontak kapalıyken gelen noktaları tamamen yok say. Üç haftada if-else'ten oluşan bir "nokta gümrüğü" yazdık ve kısa vadede şikâyetler azaldı.

Sonra yan etkiler başladı. Kontak kapalı noktalarını yok saydığımız için çekiciyle taşınan (yani kontağı kapalıyken gerçekten yer değiştiren) bir aracın hırsızlık güzergâhını kaçırdık — müşteri açısından affedilmez. Hız eşiği, tünelden çıkan araçların ilk geçerli noktasını da eliyordu çünkü tünel boyunca nokta gelmeyince iki ölçüm arası mesafe büyüyor, hesaplanan "hız" fiziksel olmayan değerlere fırlıyordu. Her yeni kural iki eski kuralla çelişiyordu. Eşik yaklaşımının temel kusuru şu: her nokta için bağımsız karar veriyor, oysa aracın nerede olabileceği hakkında geçmişten gelen koskoca bir bilgi birikimi var.

Filtreye Fizik Öğretmek

Literatüre dönmeden önce bir ara çözüm daha denedik: hareketli ortalama. Son beş noktanın ortalamasını almak sıçramaları yumuşatıyordu ama virajlarda rotayı köşe kırparak binaların içinden geçiriyor, ani duruşlarda aracı 40-50 metre ileride "kaydırarak" durduruyordu. Ortalama, geçmişe eşit ağırlık verir; oysa bizim ihtiyacımız güvene göre değişen ağırlıktı. Bu cümleyi kurduğumuz an aslında Kalman filtresini yeniden icat etmeye başlamıştık, farkında değildik.

Kalman filtresi tam olarak bu birikimi kullanıyor. Fikir, dışarıdan göründüğü kadar korkutucu değil: elinizde aracın durumuna dair bir tahmin var (konum + hız), her yeni ölçüm geldiğinde iki şeyi tartıyorsunuz. Tahminime ne kadar güveniyorum, ölçüme ne kadar güveniyorum? Yeni durum, bu iki bilginin güven ağırlıklı ortalaması. Ölçüm gürültülüyse (HDOP yüksek, uydu sayısı az) filtre ölçümü az dinliyor; tahmin uzun süredir güncellenmemişse (tünel çıkışı) ölçüme daha çok kulak veriyor. O meşhur Kalman kazancı dediğleri katsayı, bu pazarlığın matematiksel hali.

Biz sabit hızlı (constant velocity) model kurduk: durum vektörü enlem, boylam ve iki hız bileşeni. Ölçüm gürültüsü matrisini sabit almak yerine HDOP'tan türettik — HDOP 1 iken ölçüm standart sapmasını 5 metre, HDOP 4 iken 20 metre kabul ettik. Böylece yıllardır çöpe attığımız o alan, filtrenin en değerli girdisi oldu. Süreç gürültüsünü (aracın manevra kabiliyeti) şehir içi ve şehirlerarası profiller için ayrı ayarladık; tek profille ya virajları kırpıyorduk ya da park halindeki titremeyi geçiriyorduk.

Park problemi için filtrenin üstüne bir katman daha koyduk; literatürde ZUPT (zero velocity update) deniyor. Kontak kapalı ve son 10 ölçümün tamamı 25 metrelik dairenin içindeyse aracı "demirli" ilan ediyoruz: konumu o kümenin ağırlık merkezine sabitliyor, mesafe sayacını donduruyoruz. Demirden çıkış için tek sıçrama yetmiyor; art arda üç ölçümün tutarlı bir yönde ilerlemesi gerekiyor. Böylece hem otopark titremesi mesafe üretmiyor hem de çekiciyle taşınan araç üç nokta sonra yakalanıyor.

Rakamların Söyledikleri

Değişikliği önce gölge modda çalıştırdık: iki hafta boyunca eski ve yeni boru hattı aynı ham veriyi işledi, sadece yenisinin çıktısını kaydettik. Kıyas için 12 araçlık bir test filosuna takograf ve manuel kilometre okuması koyduk. Eski sistemin günlük mesafe hatası ortalama yüzde 5,8'di (en kötü araçta yüzde 11 — anteni torpidonun altına monte edilmişti). Yeni boru hattında ortalama hata yüzde 1,3'e indi. Durağan araç yanlış hareket alarmı ayda 340 adetten 9'a düştü; kalan 9'un yedisi gerçekten çekiciyle taşınan araçlardı, yani alarm doğruydu. Harita üzerindeki rota çizgilerinin binaların içinden geçme oranı gözle görülür şekilde azaldı — bunu ölçmedik ama satış ekibi demo sırasında fark edilir dedi, onlara inanıyorum.

Filtrenin maliyeti de merak edilir: durum vektörü dört elemanlı olunca matris işlemleri iki kere ikilik bloklarla dönüyor, araç başına ölçüm güncellemesi mikrosaniyeler mertebesinde. 3.000 araçlık akışta filtre katmanının toplam CPU payını ölçtük; tek çekirdeğin yüzde 2'si bile değildi. Yani "Kalman pahalıdır" efsanesi, en azından bu boyutta, koca bir hiç. Pahalı olan filtrenin kendisi değil, parametrelerini yanlış ayarlayıp haftalarca kaynağını bulamadığınız tuhaflıklar.

Bir sürpriz de yaşadık: filtre bazı kısa gerçek hareketleri 2-3 saniye gecikmeyle gösteriyordu, çünkü tahmine güveni tazeydi. Canlı takip ekranında bu gecikme fark edilmiyor ama geofence (bölge ihlali) alarmlarında sınırda gezen araçlar için tetiklenme anını kaydırabiliyordu. Alarm motorunu ham değil filtrelenmiş veriyle ama histerezisli çalışacak şekilde güncelledik: bölgeye giriş için 30 metre içeri, çıkış için 30 metre dışarı şartı koyduk. Sınır üstünde ping-pong yapan alarmlar da böylece bitti.

Bir de dürüst olmak gerek: filtre her derde deva değil. Anteni metal kabin içine gömülmüş bir araçta ham veri o kadar kötüydü ki filtre çıkışı da güvenilmez kaldı; matematik, fiziği ancak bir yere kadar telafi ediyor. O müşteride çözüm yazılım değil, 15 dakikalık anten montaj değişikliği oldu. Yazılımcı refleksiyle her sorunu kodda çözmeye çalışmadan önce donanıma bakmak — bunu da pahalı öğrendik.

Bu yazıdan tek cümle kalacaksa şu kalsın: GPS noktası bir gerçek değil, bir iddiadır; iddiaları sorgulamadan toplayan her sistem eninde sonunda müşterisine iftira atar. Konum verinizde buna benzer hayalet hareketler, şişen kilometreler görüyorsanız bir mesaj atın — hangi filtre parametresinin neyi bozduğunu tartışmak, bu işin en zevkli kısmı.

📅 Yayınlanma:  ·  Yakup Zengin