Kalman Filtresi - Uygulama, Parametreler ve Ayarlama


10

Her şeyden önce, ilk defa Kalman filtresi yapmaya çalışıyorum.

Daha önce bu yazının arka planını açıklayan StackOverflow'daki gürültü ve hız değerlerinden varyasyonları filtreleyen soruyu yayınladım . Bu filtrelemeye çalıştığım değerlerin tipik bir örneğidir. Burada durumun azalması gerekmiyor. Ancak değişim oranı tipik olarak böyle

X ------- Y
16 --- 233.75
24 --- 234.01
26 --- 234.33
32 --- 234.12
36 --- 233.85
39 --- 233.42
47 --- 233.69
52 --- 233.68
55 --- 233.76
60 --- 232.97
66 --- 233.31
72 --- 233.99

Kalman Filtremi şu eğitime göre uyguladım: Kalman Filtresi Aptallar için .

Uygulamam buna benziyor (sözde kod).

//Standard deviation is 0.05. Used in calculation of Kalman gain

void updateAngle(double lastAngle){
  if(firsTimeRunning==true)
     priorEstimate = 0;               //estimate is the old one here
     priorErrorVariance = 1.2;        //errorCovariance is the old one
  else
     priorEstimate = estimate;              //estimate is the old one here
     priorErrorVariance = errorCovariance;  //errorCovariance is the old one
  rawValue = lastAngle;          //lastAngle is the newest Y-value recieved
  kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
  estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
  errorCovariance = (1 - kalmanGain) * priorErrVariance;
  angle = estimate;              //angle is the variable I want to update
}                                //which will be lastAngle next time

Önceden 0 tahmini ile başlıyorum. Bu iyi çalışıyor gibi görünüyor. Ama ne fark bu güncelleştirme her çalıştırıldığında kalmanGain azalacak olduğunu, bu da benim yeni değerler daha az benim filtre çalışıyor (?) Güven anlamına gelir. Bunu istemiyorum.

Sadece hareketli bir ortalama (basit ve üstel ağırlıklı) kullanarak bu kullanmaya gittim. Şu anki kadar iyi sonuç bile alamıyorum.

Benim sorum bu doğru uygulama olup olmadığını ve önceki hata varyansım ve standart sapma gönderdiğim örnek değerlere göre iyi görünüyorsa? Parametrelerim aslında iyi sonuçlar alıp alamayacağımı görmek için rastgele seçildi. Birkaç farklı aralık denedim ama kötü sonuçlarla. Yapabileceğim değişikliklere ilişkin herhangi bir öneriniz varsa, gerçekten takdir edilecektir. Eksik olan bazı şeyler varsa özür dilerim. Burada da ilk kez gönderme.

Yanıtlar:


5

Kalman filtreleri, giriş sinyaliniz bazı doğrusal dinamik sistem durumlarının gürültülü gözlemlerinden oluştuğunda yararlıdır. Sistem durumuyla ilgili bir dizi gözlem göz önüne alındığında, Kalman filtresi temeldeki sistemin durumuyla ilgili daha iyi ve daha iyi tahminler sunmayı amaçlamaktadır. Başarılı bir şekilde uygulamak için, durumunu tahmin ettiğiniz sistemin dinamikleri için bir modelinizin olması gerekir. Wikipedia'da ayrıntılı olarak açıklandığı gibi , bu model, önceki durumu, sisteme yapılan herhangi bir girdi ve işlem gürültüsü adı verilen Gauss dağıtılmış stokastik bir bileşen göz önüne alındığında, durumun temelindeki sistemin bir zaman adımında nasıl değişmesi beklendiğini açıklar.

Bununla birlikte, böyle bir temel modeliniz olup olmadığı sorunuzdan net değil. Bağlı yazı, bir sensörden hız değerleri kullandığınızı gösterdi. Bunlar, bir sistemin devletinin (devletin hızı olduğu yerde) doğrudan gözlemleri veya devletinin dolaylı gözlemleri (örneğin devletin konumu olduğu yerlerde) olarak modellenebilir. Ancak, Kalman çerçevesini kullanmak için, zaman geçtikçe bu durumun nasıl gelişeceği için bir model seçmeniz gerekir; bu ek bilgi, optimum tahminin üretilmesi için kullanılır. Kalman filtresi, kendisine uygulanan bir sinyali "temizleyecek" sihirli bir kara kutu değildir.

Bununla birlikte, Kalman filtresinin, girdi gözlemlerinin aşamalı olarak göz ardı edildiği noktaya kadar kendi çıktısında giderek daha fazla güvende olacağı, bahsettiğiniz fenomen pratikte gerçekleşir. Bu, proses gürültü kovaryans matrisindeki değerlerin manuel olarak arttırılmasıyla azaltılabilir. Daha sonra, niteliksel olarak, sistemin durum geçişi için model daha büyük bir stokastik bileşen içerir, bu nedenle tahmin edicinin mevcut durum göz önüne alındığında bir sonraki durumu doğru olarak tahmin etme yeteneği azalır. Bu, sistem durumu hakkındaki mevcut tahminine olan bağımlılığını azaltacak ve daha sonraki gözlemlerde güvenini artıracak ve "girdiyi göz ardı etme" etkisini önleyecektir.


+1: Özellikle son paragraf. KF tasarımındaki gürültü kovaryanslarını, çevirmek için "düğmeler" olarak düşünün.
Peter K.

4

Doğru anladıysam, hareket eden bir şeyiniz var ve hızı gözlemleyebilirsiniz ve bu hız gürültülüdür. Ölçümlerinizden 2 çeşit varyasyon gözlemlersiniz. \

  1. Gürültüden kaynaklanan varyasyonlar
  2. Nesneler hızı gerçekten değiştirdiği için varyasyonlar (örn. Dönüş)

Kalman kazancınızın sıfıra gitmesinin nedeni, nesnenin hızının sabit olduğunu ve tek yapmanız gereken bu gerçek hızı tahmin etmektir.

" Hey, sabit bir hızda hareket eden bir cisim var ve bu sabit hızı tahmin etmek istiyorum "

Modelin böyle, nerede xk zamandaki hız k ve yk karşılık gelen ölçümdür.

xk=xk1
yk=xk+qk

Fakat nesneniz bu şekilde hareket etmiyor. Hızı değişiyor ve nasıl ve ne zaman değişeceğini bilmiyorsunuz.

Bunun yerine söylemeniz gerekenler:

" Hey, hızda hareket eden bir nesnem var ama hızını nasıl değiştirdiğinden emin değilim "

Bunu yapmanın birçok yolu vardır: En basit yol, durumunuza belirsizlik eklemektir.

xk=xk1+vk1you add uncertainty
yk=xk+qk
nerede qk ve vk beyaz gürültü olduğu varsayılır.

Kalman Filtre denklemleriniz aşağıdaki gibi görünecektir:

y^k|k1=x^k|k1
Kk=Pk|k1Pk|k1+Qo
x^k|k=x^k|k1+Kk(yky^k|k1)
Pk|k=Pk|k1KkPk|k1
Pk+1|k=Pk|k+Qs

Sizin durumunuzda 0.05değer, Gözlem gürültü kovaryansıdır,Qo. Bu değişikliği yapmak için yapmanız gereken tek şeyQs, durum gürültü kovarinası (durumunuzdaki belirsizlik) sabit bir değere.

Kodunuzda küçük bir değişiklik olacaktır:

stateVariance = 0.5

errorCovariance = (1 - kalmanGain) * priorErrVariance + stateVariance;

Ekleyerek vermeyerek stateVarianceveyaQs kodunuzda sıfır olduğunu varsaydınız.

Bu stateVariancedeğer istediğiniz herhangi bir şey olabilir. Hızın ne kadar değişeceğine olan güveninize dayanır. Hızın oldukça sabit kalacağını düşünüyorsanız, bunu küçük bir sayıya ayarlayın.

Bu şekilde Kalman Kazancınız sıfıra gitmeyecektir.


3

Kalman Filtresi kullanmak için dinamik bir sisteme ihtiyacınız var.

öneririm

y=i=0naixi

a[k+1]=a[k]+w
cov(w)=Q
Ölçüm:
z=i=0naixi=y

Yani kullanmak yerine x devletler olarak, katsayıyı (a) devlet olarak


1

Klasik kontrol teorisinden bazı fikirleri kullanabileceğinizi düşünüyorum, örneğin PID kontrolörü .

Y sinyaliniz, u (t) kontrolörünün ayar noktası olabilir. Proses tesisi sadece 1'dir ve y (t) çıktısı filtrelenecektir. Tek yapmanız gereken, istediğinizi elde etmek için P, I ve D parametrelerini ayarlamak (ayarlamak).

Y (t) çıkışı u (t) girişini "takip etmeye" çalışacaktır, ancak parametreler bu izlemenin nasıl olacağını kontrol eder.

Diferansiyel kazanç D, yanıtınızı hızlı hata değişikliklerine duyarlı hale getirecektir. Senin durumunda, sanırım D küçük olmalı. U (t) aniden değişirse y (t) 'nin değişmesini istemezsiniz.

İntegral kazanç 'I' yanıtınızı biriken hataya duyarlı hale getirecektir. Oraya çok değer vermelisin. U (t) seviyeyi değiştirir ve orada tutarsa, hata artar ve sonra y (t) 'nin aynısını yapmasını istersiniz.

P kazancı ince bir ayar verebilir. Her neyse, parametrelerle oynamaya çalışın ve ne elde ettiğinizi görün.

Yine de karmaşık ayarlama yöntemleri var, ancak buna ihtiyacınız olduğuna inanmıyorum.

İyi şanslar.


Aslında daha iyi bir yaklaşım var. Bu gönderiye bakın .
Daniel R. Pipa


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.