- Gerçek dünyadaki konum ve hız ölçümleri her zaman dalgalandığı için Kalman filtresi, birden fazla kusurlu bilgi kaynağını birleştirip daha güvenilir bir durum kestirimi üreten bir yöntem olarak anlaşılabilir
- Gemi konumu örneğinde, motorun 10m/s hız modeli rüzgar ve dalgalar nedeniyle sapar; GPS gibi sensörler de gürültü veya arızalar yüzünden her zaman doğru değildir
- Örnek kodda 1000 yolcunun her biri hız tabanlı bir kestirim ve sensör ölçümü üretir; ardından bu iki değer ağırlıklı ortalama ile birleştirilerek Kalman filtresinin sezgisi gösterilir
- Bilgi kaynaklarının güvenilirliği, ölçümlerin varyansı ile hesaplanır; daha çok değişen tarafa daha az güvenilirlik verilir, daha tutarlı olanı daha çok yansıtmak için
1/variance kullanılır
- Sensör normal çalışırken sensör değeri daha çok izlenir;
t=3 ve t=6 gibi dalgalı aralıklarda ise etkisi otomatik olarak azalır ve daha kararlı bir kestirim korunur
Kalman filtresinin gerekli olduğu durumlar
- Kalman filtresi, birden fazla gürültülü bilgi kaynağını tek ve daha doğru bir istatistiksel değere sıkıştıran bir huni gibi düşünülebilir
- Matematiksel olarak lineer cebir, olasılık ve kalkülüs ile ilişkilidir; ancak burada tam kuramdan çok sezgiye odaklanılır
- Bir geminin limandaki
x=0 noktasından çıkıp tek boyutta hareket ettiği ve motorunun sabit 10m/s hız sağladığı varsayılır
- İdeal bir dünyada 2 saniye sonraki konum
2 * 10 = 20m olurdu; fakat gerçek dünyada motor, rüzgar ve dalgalar nedeniyle hız ve konum tam olarak korunmaz
- Bu yüzden yalnızca konum formülüne bakarak geminin gerçek konumundan emin olmak zordur
Sensörler de kusursuz değildir
- GPS gibi bir sensör varsa belirli bir andaki konum doğrudan ölçülebilir, ancak sensör ölçümleri de her zaman doğru değildir
- GPS, 3. saniyede 29.998m veya 30.002m gibi gerçek konuma yakın değerler verebilir; çok nadiren de 100m gibi büyük sapmalar üretebilir
- Uydu kapsamasının olmadığı bölgelerde GPS sensörü fiilen çalışmayabilir
- Sensör hiç çevrimdışı olmasa ve istenen değeri keyfi bir hassasiyetle ölçebilseydi, Kalman filtresine gerek kalmazdı
- Kalman filtresi, hız tabanlı konum kestirimi, GPS kestirimi, radar ve sonar gibi birden fazla bilgi kaynağını birleştirerek konumu daha doğru tahmin edebilir
Kodla konum kestirimi
- Örnek, gemide 1000 yolcu bulunduğunu ve her yolcunun kendi GPS cihazına sahip olduğunu varsayar
- Her yolcu önce önceki konuma hız ve dış etkenlerdeki değişimi ekleyerek yeni konumu kestirir
from random import gauss
def new_position(last):
velocity = 10
wind = gauss(0, 2)
wave = gauss(0, 0.1)
return last + velocity + wind + wave
gauss, pozitif veya negatif rastgele değerler üretir; ikinci parametre ise değişimin büyüklüğünü gösterir
- Rüzgar ve dalga etkisini doğrudan ölçmek mümkün olmadığı için örnekte ortalaması 0, standart sapması
2 ve 0.1 olan rastgele sayılarla gürültü modellenir
- İkinci adımda sensör, gerçek konuma sensör gürültüsü ekleyip ölçüm döndürür
def sensor(t):
if t == 3:
# oops, passing through a thunderstorm. GPS fluctuating!
sensor_noise = gauss(5, 10)
elif t == 6:
# uh-oh, satellite unavailable!
sensor_noise = gauss(-5, 10)
else:
sensor_noise = gauss(0, 1)
return true_position[t] + sensor_noise
t=3 için gök gürültülü fırtına nedeniyle GPS'in dalgalandığı, t=6 için ise uydunun kullanılamadığı bir durum modellenir
- Aynı anda bile yolcuların sensör ölçümleri birbirinden farklı çıkabilir
Gerçek hareket yolu ve basit ortalama
- Geminin gerçek konumu şu listeyle verilir
true_position = [0, 9, 19.2, 28, 38.1, 48.5, 57.2, 66.2, 77.5, 85, 95.2]
- Gemi limandaki
x=0 noktasından çıkar, 1 saniye sonra 9m, 2 saniye sonra 19.2m konumundadır ve sonrasında listedeki değerler boyunca ilerler
- Yolcuların amacı, gürültülü ve güvenilmez ölçümlerle her saniyedeki konumu olabildiğince doğru tahmin etmektir
t=1 anında bir yolcunun hız tabanlı kestirimi 9.37, sensör ölçümü 8.98 ise basit ortalama 9.17 olur
- Gerçek konum 9m iken bu basit ortalama, hız kestiriminden daha az hatalıdır ama bu örnekteki sensör ölçümünden daha kötüdür
Ağırlıklı ortalama ve güvenilirlik
- Basit ortalamadan daha iyi bir yöntem olarak ağırlıklı ortalama kullanılır
def combine(A, B, trustA, trustB):
total_trust = trustA + trustB
return (A * trustA + B * trustB) / total_trust
combine(9.37, 8.98, 10, 1) hız kestirimine daha çok güvenildiği için sonucu 9.37ye daha yakın olan 9.33 yapar
combine(9.37, 8.98, 1, 10) sensör ölçümüne daha çok güvenildiği için sonuç 8.98e daha yakın olan 9.01 olur
- Bu güvenilirlik tabanlı ağırlıklı ortalama, Kalman filtresinin temel sezgisidir ve veriyi birleştirme gücünün merkezindedir
- Hangi bilgi kaynağına daha çok güvenileceği varyans ile belirlenir
- Sonucu çok dalgalanan kaynaklara daha az güvenilir
- Sonucu tutarlı olan kaynaklara daha çok güvenilir
- 10 radyo istasyonundan 4'ü yağmur, 6'sı açık hava diyorsa ve 10 web sitesinden 9'u yağmur diyorsa, web siteleri tarafının varyansı daha düşük olduğundan daha güvenilirdir
Güncelleme adımı
- Genel güncelleme, her yolcu için hız tabanlı kestirimler ve sensör ölçümleri üretildikten sonra bu iki ölçüm kümesinin varyansıyla güvenilirliğin hesaplanması şeklinde yapılır
from statistics import variance
def update(t, last):
velocity_updates = []
sensor_updates = []
for p in range(1000):
velocity_updates.append(new_position(last[p]))
sensor_updates.append(sensor(t))
fluctuation_velocity = variance(velocity_updates)
fluctuation_sensor = variance(sensor_updates)
trust_velocity = 1 / fluctuation_velocity
trust_sensor = 1 / fluctuation_sensor
combined = []
for p in range(1000):
combined.append(combine(
A=velocity_updates[p],
B=sensor_updates[p],
trustA=trust_velocity,
trustB=trust_sensor
))
return sensor_updates, velocity_updates, combined
- Varyans büyüdükçe güvenilirlik azaldığı için
1/variance kullanılır
- Her yolcu kendi konumunu ayrı ayrı günceller
- Tüm yolcuların konum güncellemeleri tamamlandıktan sonra, geminin gerçek konum kestirimi yolcu konumlarının ortalamasından çıkarılabilir
Sonuçlar nasıl okunur?
update_plot fonksiyonu, grafik çizmek için her andaki gerçek konumu, sensör kestirimini, hız kestirimini ve birleştirilmiş kestirimi saklar
- Ana döngü, yolcuların o andaki en iyi kestirimlerini kullanarak her anda konum tahminini güncellemeyi sürdürür
- Grafikte çizginin etrafındaki envelope, belirsizliği ifade eder; genişlik arttıkça ilgili değere dair belirsizlik de artar
- Sensörün normal çalıştığı
t=0.75 ile t=1 aralığında, birleştirilmiş konum kestirimi yalnızca hız kestirimi kullanmaktan daha iyidir; ancak yalnızca sensör ölçümü kullanmaktan daha kötü olabilir
- Sensörün bozulduğu
t=2 ile t=4 aralığında, birleştirilmiş kestirim yalnızca bozuk sensör ölçümünü kullanmaktan daha iyi sonuç verir
- Sensörün toparlandığı
t=4 ile t=5 aralığında, Kalman filtresi yeniden sensörü daha fazla tercih etmeye başlar
Ek: gauss ve varyans
normal distribution function olan gauss(0, 0.1) ve gauss(0, 2), çoğunlukla 0 civarında rastgele değerler üretir
- İkinci parametre olan standart sapma, ölçümlerin ne kadar dalgalanacağını kontrol eder
gauss(0, 0.1) büyük olasılıkla 0.06, -0.07, 0.02 gibi 0'a yakın küçük değerler üretir
gauss(0, 2) ise 1.05, -1.06, 1.29, -1.72 gibi daha geniş saçılmış değerler üretir
- Örnek kodda rüzgarın daha çok, dalgaların ise daha az değiştiği varsayılır
- Varyans, tutarlılığın ölçüsüdür; tutarlılık arttıkça varyans düşer, azaldıkça yükselir
- Standart sapması 2 olan bir dağılımın varyansı 4'tür; standart sapması 0.1 olan bir dağılımın varyansı ise 0.01'dir
1 yorum
Hacker News yorumları
Yazıyı keyifle okudum, ancak uygulama hatalı. En büyük hata, belirsizliği zaman ekseni boyunca yaymaması ve bu yüzden hatayı olduğundan küçük tahmin etmesi
Bu grafiklerde de görülüyor; hata aralığı çoğu zaman gerçek durumu kapsamalı, ama sonuçta böyle olmuyor
Yolcular tahmin değerine gürültü eklemiyor; yolcu açısından k anındaki durum verildiğinde k+1 anındaki durumun beklenen değeri basitçe
position_k+1 = position_k + velocity * Delta_tolur. Gerçek dinamiklerde gürültü vardır ve filtre bunu tahmin kovaryansına ekleyerek yansıtırKodun hemen bozulmamasının nedeni, 1000 yolcuyla dinamiklerden çok sayıda örnek çekip sonucun varyansını sayısal olarak hesaplaması; bu, pratikte genelde yapılan yöntemden epey farklı
Ayrıca GPS’in havadan etkilendiği yaygın bir yanılgıdır; gerçekte öyle değildir. Yazıda kullanılan tutarlılık tanımı da standart değil. Tahmin teorisinde bir tahmin edicinin tutarlı olması, veri miktarı arttıkça tahminin gerçek değere yakınsaması anlamına gelir
Genel okur için kolay anlaşılır biçimde anlatması iyi, ancak birkaç yanlış anlamanın sorun yarattığı görünüyor. Tahmin teorisi yüksek lisans öğrencisiyim; daha fazla konuşursak yardımcı olabilirim
Üniversitedeki sinyal işleme derslerinde Kalman Filter’ın neden bu kadar basit öğretilmediğini merak ettirecek kadar iyiydi. Matematiksel kavramları matematiksel olarak öğretmek elbette doğru, ama arka plan bilgisi yetersiz olanlar için bilgi kaybı oluşuyor
Eskiden ayrık kosinüs dönüşümü ve wavelet dönüşümünü görüntüler üzerinden öğretmiştim; önce sezgiyi verip titizliği sonra kuran yaklaşım, ters sıradan her zaman daha iyi işlemişti
Profesörlerin önce sezgi vermemesinin birkaç nedeni olabilir. Profesörün kendisinin sezgiden çok sayılar ve denklem manipülasyonlarında daha derin uzmanlığa sahip olması; öğretme becerisi ödüllendirilmediği için sezgisel biçimde açıklamaya harcanacak zamanı araştırma fonu tekliflerine veya doktora öğrencilerini yönetmeye ayırması; bir de matematiği anladıktan sonra sezgisel açıklamanın tersine “zor yol” gibi gelmesi ve beynin geri dönmeyi reddetmesi
Bence özellikle üçüncüsü en büyük neden. Bu, matematik eğitimini aşan şekilde uzmanlık ile öğretme becerisi arasındaki farkla da ilgili. Golfte drive vuruşu öğrenmek istiyorsanız, en uzağa vuran kişiden ziyade 100 yard’dan başlayıp istikrarlı biçimde 300 yard vurmaya ulaşmış birinden öğrenmek daha iyi olabilir
Kalman Filter uygulamak isteyenlere genel bir uyarı olarak, sayısal kararsızlıkla başa çıkma yöntemleri için https://www.stat.berkeley.edu/~brill/Stat248/kalmanfiltering... bağlantısındaki ilk birkaç sayfayı okumak iyi olur
Pratikte bunu yaptığımda göze çarpan sayısal artefaktları pek görmedim, ama oldukça cazip bir çözüm
Bu yazıya tamamlayıcı olarak, Kalman Filter ailesine daha kapsamlı ve matematiksel bir giriş yapmak istiyorsanız bu kitabı şiddetle öneririm: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...
İş gereği Kalman Filter uygulamak zorunda kalmış bir yazılım mühendisi tarafından yazıldığı için, kavramları motive etme ve aktarma biçimi bu okur kitlesine iyi uyabilir. Etkileşimli Jupyter not defterleri olarak hazırlanmış; depoyu klonlayıp doğrudan çalıştırarak takip edebilirsiniz
Basit bir filtreden başlayıp Bayes kuralını ekleyerek ve olasılık dağılımlarına genişleterek kademeli biçimde iyileştiriyor; böylece Kalman Filter’a yumuşak bir giriş yolu sunuyor
Eksik kalan bir yön var. Tahmin değeriyle ölçüm değerinin ağırlıklı ortalamasını alırken, Kalman Filter’ın ağırlıkları zamanla değişebilir. Aksi halde bence başka bir adla anılırdı
Yavaş değişen bir değeri tek sensörle ölçme örneği iyi. Örneğin yakıt göstergesinde saniyeler ölçeğinde değişim olmadığını varsaymak iyidir; ancak ölçümde depodaki yakıtın çalkalanması gibi gürültüler olabilir
Bu durumda Kalman Filter, üstel olarak azalan kazanca sahip birinci dereceden alçak geçiren filtre gibi görünür. Kesim frekansı değiştiği için başlangıç seviyesini birkaç saniye içinde hızlıca bulabilir; sonrasında ise 0.01Hz gibi çok düşük bir kesim frekansıyla gürültüyü yok sayabilir
Önemli bir araç hakkında iyi bir yazı.
Benim anladığım kadarıyla doğrusal Kalman Filter, doğrusal problemler için en iyi çözüm ve anlaması ile uygulaması görece kolay. Ama gördüğüm uygulamaların çoğu doğrusal değildi.
Extended Kalman Filter ve Unscented Kalman Filter’ı anlamak ve uygulamak çok daha zor; kaynaklar ve kütüphaneler de daha az ve daha az kullanışlıydı.
Örneğin küçük UAV’ler için bir AHRS/GNSS CAN cihazıyla uğraşırken, PX4 veya Ardupilot’ta gördüğüm Extended Kalman Filter çok karmaşıktı ve çok sayıda parametresi vardı. Bu yüzden quaternion temel ilkelerinden başlayıp gyro çözümünü ivmeölçerin “yukarı” yönüne ve manyetometrenin eğim vektörüne doğru azar azar düzeltmek daha basitti.
İvme büyüklüğü 1G’den çok farklıysa ya da manyetik alan vektörü yerel Dünya manyetik alan şiddetinden çok farklıysa ilgili sensör güncellemesinin ağırlığını düşürüp ya da atlayıp gyro’nun olduğu gibi ilerlemesine izin verdim. Muhtemelen doğru cevap büyük olasılıkla EKF’dir, ama bunu anlaşılması, yapılması veya ayarlanıp tanılanması kolay bir biçime getirme konusunda vazgeçtim.
Ancak quadrotor’larda büyük zorluk dönmedir. Kalman Filter’ın doğrusal modeli her şeyin Öklid uzayında olduğunu varsayar; oysa dönme bir manifold üzerindedir. Quaternion durumunda bu manifold, birim quaternion kümesidir.
Quaternion’ı tahmin etmek için EKF’yi safça uygularsanız artık bir birim quaternion olmaz ve tahmin değeri bozulur. Bu manifold kısıtını ele almanın iyi bilinen yolları var, ama koda aktardığım denklemler arasında en çirkin görünenlerdendi.
Basit bir örnek olarak, fizik yasaları nedeniyle her zaman birim çember üzerinde olması gereken
(x, y)durumunu düşünebilirsiniz. Gerçek dinamikf(x, y)çember üzerinde yeni bir nokta üretir; fakat bunun doğrusallaştırılmış yaklaşık dinamiğinin birim çember üzerinde kalacağı garanti değildir, bu da fiziksel olmayan durumlara veya EKF durum tahminlerine yol açabilir.İncelemeye değer seçenekler arasında ForneyLab.jl, Infer.net, Gen.jl ve Pyro var.
Ama Kalman Filter’ı kullanmanın birçok yolu vardır ve nereden başladığınıza bağlı olarak doğrusal olmayan dönüşümleri doğru ele almak aşırı zahmetli hale gelebilir.
Miyopluk ve astigmatım var; bir gözümü kapatıp duvar saati gibi bir şeye baktığımda her gözün birbirinden farklı bozulmuş görüntüler ürettiğini fark ettim. İki göz biraz farklı.
Ama saate iki gözümle baktığımda görüntü çok daha net oluyor ve tek gözle bakmaktan daha iyi. Yazıdaki, 1000 gemi yolcusunun kendi GPS koordinatlarını bildirdiği senaryo bana bu olguyu hatırlattı.
Beyin de Kalman Filter benzeri akıllı algoritmaları yaygın biçimde kullanıyor olabilir.
Kalman Filter’ı, gürültülü gözlemlerden basit ortalamadan daha iyi bir değer tahmini yapan şey olarak anlamak doğru mu?
Örneğin bir şeyi 3 kez ölçüp 7, 8, 9 elde ettiysek gerçek değerin 8 olduğunu tahmin ederiz; Kalman Filter farklı bir tahmin mi üretir?
Kalman Filter geleneksel olarak zaman içinde hareket eden şeyleri tahmin etmek için kullanılır. Videodaki bir insanı ya da bir tür rastgele yürüyüşü düşünebilirsiniz.
Ardışık iki zaman noktası veya ölçüm arasında hız ve mevcut yön gibi bir ilişki olduğunu varsayarsanız, hareket modelindeki bilgiyle gürültülü ölçüm modelindeki bilgiyi karıştırarak konumu ya da değeri, hatta tüm hareket geçmişini daha iyi tahmin edebilirsiniz.
Hareket modeli anlamlı biçimde yanlışsa tahmin iyileşmez. Sonrasında geliştirilen birçok yöntem, robotikte tekerlek kayması gibi daha incelikli hareket modellerini içermeye odaklanır.
Örneğin bir sabiti ölçtüğünüzü varsayalım; başlangıç belirsizliği olan bir sabiti, mesela standart sapması olan bir Gaussian dağılımı ve yine Gaussian gürültü ile standart sapması olan ölçümleri temel model olarak alabilirsiniz. Tahmin etmeye çalıştığınız sabitin etrafındaki başlangıç belirsizliğini ve ölçümlerin belirsizliğini ayarlayabilirsiniz.
Bu örnekte Kalman Filter ortalama gibi davranmaz. Ölçümler iyiyse, yani belirsizlik düşükse hızla yakınsar; ölçümler kötüyse tahmin değeri dalgalanır ve yakınsaması daha uzun sürer.
Ayrıca Kalman Filter’ın yalnızca hareket eden şeylerde kullanıldığı ifadesi doğru değildir. Sabit tahmini için de sürekli kullanılır, sadece hareketli nesnelerde daha ünlüdür.
Kalman Filter, örneklerin bazı doğrusal dinamikler nedeniyle korelasyonlu olduğu durumlarla ilgilenir. Ölçümlerin ilgi konusu şeyin bizzat kendisi olması da gerekmez; o şeyin doğrusal bir fonksiyonuna Gaussian gürültü eklenmiş hali de olabilir.
Dolayısıyla ilk ölçümde 7 gördüğünüz bilgisi, ikinci ölçümde 8 görme olasılığını değiştirir. Yukarıdaki gibi yalnızca örnek ortalaması alırsanız genelde gerçek ortalama değere yakınsamaz.
Örnekte ne üreteceği tamamen modele bağlıdır. Hayal edilebilecek en basit senaryoda bile Bayes’te olduğu gibi hangi beklenti değeriyle başlayacağınızı belirtmeniz gerekir.
Bu ifadeyi doğrusal Gaussian model olarak kodlarsanız ortaya Kalman Filter çıkar.
Kalman Filter’ı anlamamda bana bir farkındalık daha kazandıran kısa yazı John D. Cook’un notuydu: https://www.johndcook.com/blog/applied-kalman-filtering/
Geleneksel kalkülüs ve diferansiyel denklem temelli sistem modellemesi, verilerde belirsizlik olmadığını ve her şeyin sistem modelinde yer aldığını varsayarken; veri temelli kestiriciler “her şey verinin içindedir” diye bakar ve veriyi üreten fiziksel sürecin modelini tamamen yok sayar.
Kalman Filter’ın güzelliği, bu iki yaklaşımı birleştirmesinde yatar.
Görselleştirmesi iyi olan başka bir yazı da var: https://www.bzarg.com/p/how-a-kalman-filter-works-in-picture...
HN’de daha önce üç kez paylaşılmış bir yazı.