İHA ve Aviyonik··8 dk okuma
GPS, RTK ve EKF: Konum Doğruluğunu Anlamak
Loiter'da duran araç neden yavaşça kayar, 'EKF variance' uyarısı tam olarak neyi söyler ve RTK bunu çözer mi? Konum zincirini uydudan failsafe'e kadar takip ediyoruz.
Sahada ilk fark ettiğimiz şey şuydu: aracı Loiter moduna alıp kumandayı bıraktığımızda araç sabit durmuyordu. Birkaç metrelik bir daire çiziyor, bazen bir yöne doğru yavaşça sürükleniyordu. Yer istasyonundaki konum ise gayet sabit görünüyordu — yani araç kaymıyordu, aracın kendisi hakkında bildiği şey kayıyordu.
Bunun bir görev karşılığı var. Yükü yaklaşık 20 m’den bırakıyoruz; aracın konum tahmini 3 m kaymışsa yük de 3 m yanlış yere düşer. Kamera ne kadar iyi olursa olsun, tespit ettiğiniz hedefin koordinatını aracın kendi konumundan türetiyorsanız hata doğrudan aktarılır.
Bu yazıda konum zincirinin tamamını takip ediyoruz: uydudan gelen sinyalin hangi noktalarda bozulduğu, RTK’nın bunu nasıl santimetre mertebesine indirdiği ve EKF’in (Extended Kalman Filter — genişletilmiş Kalman filtresi) bütün bu gürültülü ölçümleri neden tek bir sensöre güvenmeden birleştirdiği.
GNSS: dört takımyıldız, tek çözüm
GPS aslında bir marka adı. Genel kavram GNSS (Global Navigation Satellite System): ABD’nin GPS’i, Rusya’nın GLONASS’ı, Avrupa’nın Galileo’su ve Çin’in BeiDou’su. Modern bir alıcı bunların birkaçını aynı anda dinler.
Alıcı her uydudan gelen sinyalin yolculuk süresini ölçer, ışık hızıyla çarpar ve o uyduya olan mesafeyi bulur. Üç mesafe konumu, dördüncüsü alıcının saat hatasını çözer — yani minimum dört uydu gerekir. Daha fazla takımyıldız dinlemek görüş alanındaki uydu sayısını artırır; bu da özellikle ağaç ve bina gibi engellerin gökyüzünü kestiği sahalarda çözümü ayakta tutar.
Uydu sayısı tek başına yeterli değil. Uyduların gökyüzündeki dağılımı da önemlidir ve bu HDOP (Horizontal Dilution of Precision — yatay hassasiyet seyrelmesi) ile ifade edilir. Uydular gökyüzüne yayılmışsa HDOP düşük, hepsi tek bir bölgede kümelenmişse yüksektir.
Hata bütçesi: konum neden kayar
| Hata kaynağı | Ne yapar | Sahada ne görürsünüz | Azaltma yolu |
|---|---|---|---|
| İyonosfer / troposfer gecikmesi | Sinyalin yolculuk süresini uzatır | Dakikalar boyunca yavaş sürüklenme | Çift frekanslı alıcı, SBAS, RTK |
| Çoklu yol (multipath) | Sinyal binadan/araçtan yansıyıp geç ulaşır | Ani birkaç metrelik sıçrama | Anteni gövdeden yükseltin, yer düzlemi (ground plane) kullanın |
| Uydu geometrisi (yüksek HDOP) | Aynı ölçüm hatasını büyütür | Dar/kapalı sahada bozulan konum | Açık gökyüzü, çok takımyıldızlı alıcı |
| Uydu saat/yörünge hatası | Mesafe ölçümünü kaydırır | Yavaş, sistematik sapma | RTK / DGPS düzeltmesi |
| Alıcı gürültüsü | Ölçümü titretir | Yüksek frekanslı jitter | Filtreleme (EKF bunu yapar) |
Yatay hatayı kabaca tahmin etmek için standart yaklaşım şudur:
σ_yatay ≈ HDOP × UERE
UERE = User Equivalent Range Error (tek uydu için toplam mesafe hatası, metre)
Örnek: sahada UERE’yi 2,0 m varsayalım (tipik bir tek frekanslı alıcı için makul bir büyüklük mertebesi; kesin değer alıcıya ve atmosfere göre değişir, üreticinin veri sayfasına bakın).
HDOP = 1,2 → σ ≈ 1,2 × 2,0 = 2,4 m
HDOP = 2,5 → σ ≈ 2,5 × 2,0 = 5,0 m
Uydu sayısı ikisinde de aynı olabilir. Değişen tek şey geometridir — ve hata iki katına çıkar. ArduPilot bunu bir arm öncesi kontrole bağlar: GPS_HDOP_GOOD parametresi varsayılan olarak 140’tır ve bu değer HDOP×100 anlamına gelir, yani eşik 1,4’tür (aralık 100–900). Log analizinde ArduPilot dokümantasyonu GPS.HDop için 1,5 altını iyi, 2,0 üstünü sorunlu; GPS.NSats için 12’nin altına düşmeyi problem işareti olarak veriyor.
RTK: düzeltmeyi sabit bir noktadan almak
Yukarıdaki hataların büyük kısmı (atmosfer, uydu saati, yörünge) bölgeseldir: birbirine yakın iki alıcı aynı hatayı görür. RTK (Real Time Kinematics) tam olarak bunu kullanır.
Konumu kesin olarak bilinen sabit bir baz istasyonu kurulur. Baz istasyonu uydulardan ölçtüğü mesafeler ile bilinen konumundan hesapladığı mesafeler arasındaki farkı çıkarır ve bu farkı RTCM formatında düzeltme mesajı olarak yayınlar. Araçtaki alıcı (rover) bu düzeltmeyi kendi ölçümüne uygular. Ortak hatalar iptal olur.
Baz istasyonu kendi konumunu survey-in ile bulur: bir süre sabit durup çok sayıda ölçümün ortalamasını alır ve belirlenen doğruluk eşiğine ulaşana kadar devam eder. ArduPilot tipik bir başlangıç olarak birkaç metre eşik / 60 saniye süre veriyor; hassas iş için eşiği daraltıp süreyi uzatmak gerekir.
Düzeltme araca üç yoldan ulaşabilir:
| Yöntem | Nasıl çalışır | Ne zaman tercih edilir |
|---|---|---|
| Yerel baz + yer istasyonu | USB’den bağlı baz, Mission Planner/QGC üzerinden MAVLink ile aracın telemetrisine düzeltme basar | Sahada internet yok, en kısa baz mesafesi. Yarışma sahası için varsayılan seçimimiz |
| NTRIP (internet servisi) | Yer istasyonu bir NTRIP sunucusuna bağlanır, düzeltmeyi araca iletir | Sahada mobil internet var ve yakında bir referans istasyonu bulunuyor |
| Doğrudan telsiz linki | Baz, düzeltmeyi kendi telsiziyle aracın ikinci UART’ına yollar | Yer istasyonunu döngüden çıkarmak istediğinizde |
NTRIP’te mesafe önemlidir: ArduPilot dokümantasyonu düzeltme kaynağından uzaklaştıkça doğruluğun yaklaşık 10 km başına 1–1,5 cm bozulduğunu belirtiyor. Aynı ilişki alıcı veri sayfalarında da görünür; u-blox ZED-F9P için RTK doğruluğu 0,01 m + 1 ppm CEP ve yakınsama süresi 10 saniyeden kısa olarak veriliyor (2026 itibarıyla veri sayfasındaki değer).
σ_RTK ≈ 10 mm + 1 ppm × baz_uzunluğu
Örnek: baz 20 km uzakta
1 ppm × 20 km = 20 mm
σ_RTK ≈ 10 mm + 20 mm = 30 mm (yaklaşık 3 cm)
Örnek: baz sahada, 200 m uzakta
1 ppm × 200 m = 0,2 mm → σ_RTK ≈ 10 mm
Sonuçta iki çözüm tipi görürsünüz. RTK Float: düzeltme geliyor ama tam sayı faz belirsizliği henüz çözülmedi, doğruluk desimetre mertebesinde. RTK Fixed: belirsizlik çözüldü, santimetre mertebesi. MAVLink GPS_RAW_INT mesajındaki fix_type alanı bunu doğrudan söyler:
0 = GPS yok 3 = 3D fix 6 = RTK Fixed
1 = fix yok 4 = DGPS
2 = 2D fix 5 = RTK Float
Kritik manevralardan önce fix tipini kodda kontrol edin — companion computer ve MAVLink yazımızdaki pymavlink kalıbıyla:
msg = master.recv_match(type='GPS_RAW_INT', blocking=True)
if msg.fix_type < 6:
print(f"RTK Fixed degil (fix_type={msg.fix_type}) - hassas birakma iptal")
| Çözüm | Tipik yatay doğruluk | Ne zaman yeterli |
|---|---|---|
| Standart GNSS | 3–5 m | Waypoint uçuşu, geniş arama deseni |
| SBAS ile | ~1 m | Genel otonom görev |
| RTK Float | desimetre mertebesi | Geçiş durumu; Fixed’i bekleyin |
| RTK Fixed | santimetre mertebesi | Hassas iniş, dar hedefe bırakma, harita üretimi |
Rakamlar ArduPilot RTK dokümantasyonundan. Bizim görevimizde ~20 m’den bırakma yapıyoruz ve hedef hatasının büyük kısmı bırakma dinamiğinden geliyor; RTK burada konum belirsizliğini denklemden çıkarır, ama rüzgâr ve serbest düşüş dağılımını çıkarmaz. RTK’yı “hata sıfırlanır” diye değil, “bir hata kalemini kapatır” diye düşünün.
EKF: tek bir sensöre güvenmemek
En iyi GPS bile 5–10 Hz’de veri üretir, tünel/köprü altında kesilir, ani sıçrama yapabilir. Buna karşılık IMU (atalet ölçüm birimi) kilohertz mertebesinde veri verir ama entegrasyon hatası zamanla birikir. Barometre irtifayı hızlı ölçer, rüzgârdan ve kabin basıncından etkilenir. Pusula yön verir, akım taşıyan kablodan etkilenir.
EKF bunları birleştirir. ArduPilot’un tanımıyla filtre; jiroskop, ivmeölçer, pusula, GPS, hava hızı ve barometrik basınç ölçümlerinden konum, hız ve açısal yönelimi kestirir. Kazanç sadece “ortalama almak” değil: filtre her ölçüm için bir beklenti üretir, gelen ölçümle farkını (innovation) hesaplar ve fazla sapan ölçümü reddeder. Yani belirgin hatalı ölçümleri eleme yeteneği vardır.
EKF3’te hangi büyüklüğün hangi sensörden geleceği açıkça parametrelenir:
AHRS_EKF_TYPE = 3 EKF3 kullan
EK3_SRC1_POSXY = 3 yatay konum: GPS
EK3_SRC1_VELXY = 3 yatay hız: GPS
EK3_SRC1_POSZ = 1 dikey konum: barometre (varsayılan)
EK3_SRC1_VELZ = 3 dikey hız: GPS
EK3_SRC1_YAW = 1 yön: pusula
Üç ayrı kaynak seti (SRC1/SRC2/SRC3) tanımlanabilir ve aralarında RC yardımcı anahtarı veya MAVLink komutuyla geçiş yapılabilir — GPS’li/GPS’siz ortam geçişleri için tasarlanmış bir mekanizma. Ayrıca birden fazla IMU varsa EKF paralel “lane”lerde çalışır; her core farklı bir IMU’yu işler ve tutarlılığa göre en sağlıklı olan çıkışa verilir.

EKF sağlık uyarıları ve failsafe
EKF kendi güvenini 0 (güvenilir) ile 1,0 (güvenilmez) arasında bir variance değeriyle raporlar. ArduPilot Copter’da pusula, konum ve hız variance’larından herhangi ikisi FS_EKF_THRESH değerini 1 saniye boyunca aşarsa EKF failsafe tetiklenir.
| Parametre | Anlamı | Notlar |
|---|---|---|
FS_EKF_THRESH |
Failsafe eşiği | 0,8–1,0 yönünde artırmak yanlış tetiklemeyi azaltır ama sapmanın büyümesine izin verir; 0,6 yönünde azaltmak daha erken tetikler. 0 failsafe’i kapatır |
FS_EKF_ACTION |
Tetiklenince ne yapılır | 0 = sadece bildir, 1 = Land (varsayılan), 2 = AltHold, 3 = Stabilize’da bile Land |
EK3_GLITCH_RAD |
GPS ile filtre tahmini arasındaki azami yarıçap | Aşılırsa konum/hız durumları GPS’e sıfırlanır. Büyütmek daha büyük glitch’leri yok sayar, ama IMU/pusula hatalarının daha çok birikmesine izin verir |
Tetiklendiğinde Mission Planner HUD’unda “EKF variance” yazısı belirir, kartın LED’i kırmızı-sarı veya mavi-sarı yanıp söner ve sesli uyarı verir. Log’da ERR mesajlarını filtreleyin: kod 16 EKF Check (Bad Variance), kod 17 EKF Failsafe.
Güvenlik notu: FS_EKF_THRESH’i yanlış alarmdan kurtulmak için körlemesine yükseltmek ya da 0 yapmak, konum tahmini bozulmuş bir aracın otonom modda uçmaya devam etmesi demektir — kaçış (flyaway) riski budur. Önce nedeni bulun. Ayrıca failsafe davranışını sahada değil, önce SITL/Gazebo ortamında deneyin.
Sık düşülen tuzaklar
Pusulayı güç kablosunun yanına koymak. ESC’lere giden kablolar onlarca amper taşır ve akımla orantılı bir manyetik alan üretir. Gaz verdikçe yön kayarsa suçlu budur. Kaldırılabilir çözüm: pusulayı GPS modülüyle birlikte direğe alın, güç kablolarını birbirine burarak (twisted pair) çekin ve pusuladan uzak tutun. Log’da tlog mag_field değerini gaz komutuna karşı çizin: ArduPilot dokümantasyonu tipik aralığı 120–550 (çoğunlukla ~330) veriyor; %30 altı dalgalanma kabul edilebilir, %60 üstü sıçrama ciddi girişimdir.
Kalibrasyonu metal masada yapmak. Pusula kalibrasyonu sırasında bilgisayar, telefon, metal tezgâh ve güç kaynağı yakında olmamalı; ceplerinizdeki elektronik dahil. Kalibrasyon tutmuyorsa COMPASS_OFFS_MAX (varsayılan 850) 2000–3000’e yükseltilebilir, ama bu genellikle asıl sorunu gizler.
Uçuş öncesi HDOP’a hiç bakmamak. Arm kontrolü geçti diye konum iyi demek değil. Kalkıştan önce uydu sayısı ve HDOP’un oturmasını bekleyin; ilk 30-60 saniyede değerler düzelmeye devam eder.
RTK Float’ı Fixed sanmak. Yer istasyonunda “RTK” yazması yetmez; fix_type 6 olmalı. Float ile hassas bırakma planlamayın.
Titreşimi konum sorunu sanmamak. Yüksek titreşim ivmeölçeri doyurur, EKF dikey hız/konum tahmini bozulur ve “EKF variance” alırsınız — GPS kusursuzken bile. Glitch avına çıkmadan önce log’daki VIBE değerlerine bakın.
Tek GPS’e mahkûm kalmak. İki alıcı varsa GPS_AUTO_SWITCH=1 (kendi doğruluğunu daha iyi raporlayanı seç) veya =2 (ikisini harmanla) kullanılabilir. Pusula girişimi kronikse hareketli baz (moving baseline) ile GPS’ten yön üretmek mümkün: iki anten arasında en az 30 cm mesafe, GPS_AUTO_CONFIG uygun değere ve EK3_SRC1_YAW=2 (GPS) ya da 3 (pusula yedekli GPS).
Pratik özet
- Uçuştan önce üç sayıya bakın: uydu sayısı, HDOP (
GPS_HDOP_GOODvarsayılanı 1,4) vefix_type. Üçü oturmadan otonom moda geçmeyin. - Anteni yükseltin, pusulayı akımdan uzaklaştırın. Konum doğruluğunda en ucuz kazanç montaj geometrisinden gelir; RTK’dan önce bunu yapın.
- RTK’yı hedefe göre seçin. Waypoint uçuşu standart GNSS ile döner; santimetre gerektiren iş (hassas iniş, dar hedefe bırakma) için RTK Fixed bekleyin ve baz mesafesini kısa tutun.
- EKF kaynaklarını bilinçli ayarlayın.
EK3_SRC1_*setini görev senaryonuza göre kurun;AHRS_EKF_TYPE=3olduğundan emin olun. - Failsafe’i kapatmayın, sebebini bulun. “EKF variance” uyarısı çoğunlukla titreşim, pusula girişimi veya multipath’i işaret eder. Eşiği yükseltmek semptomu susturur, riski büyütür.
- gps
- rtk
- ekf
- ardupilot
- sensor-fuzyonu