Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Kontrol Teorisi - Matematiği => Konuyu başlatan: ugurer - 30 Kasım 2016, 22:43:05

Başlık: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 30 Kasım 2016, 22:43:05
Merhaba arkadaşlar. Load cell kullanarak ağırlık ölçümü gerçekleştiriyorum. Filtre araştırırken Kalman Filtresi ile karşılaştım. Çok az örneklemeyle mükemmele yakın bir sonuç elde edebiliyorum fakat gürültüden dolayı çıkan sonuç sürekli olarak değişkenlik gösteriyor. Ölçümde ki hata payım %0.02 bu yüzden çok hassas olması gerekiyor. Kullandığım yöntem kabaca şu
pk[0]=pk[0]+0.0004;//0.0004 matematiksel formüllerde ifade edilen Q değeridir.Tahmini değerdir. Değiştirip etkisini //görebilirsin.
kalmank=(float)((pk[0])/(pk[0]+r));//kalmank kalman katsayısı oluyor
xk[1]=(float)xk[0]+(float)kalmank*(float)((float)ham_deger-(float)xk[0]);//çıktının filtreli hali
pk[1]=(1-kalmank)*pk[0];//bir sonrakinde kullanmak için güncelliyor pk yı
pk[0]=pk[1];
xk[0]=xk[1];
Çıkan sonucun stabil olması için ne yapabilirim? Destekleriniz için şimdiden teşekkür ederim.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: Melih1802 - 01 Aralık 2016, 01:06:38
Şemayı görmeden yorum zor fakat arada OpAmp ADC yoksa yazılımla işi toparlamak biraz zor. Şema eklersen yardımcı olmak kolaylaşır.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 01:23:44
google -> bilgin esme kalman for dummies
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 01 Aralık 2016, 09:05:45
ADC olarak hx711 kullanıyorum loadcell'e besleme olarak da 5V kullanıyorum herhangi bir opamp yada yükseltme yok. Şöyle söyleyeyim normalde filtre olarak ortalama almayı kullanıyoruz yani ADC'den 40 tane örnek alıp 40'a bölüyoruz. Bu şekilde yapınca ölçüm sonucunda stabilliği sağlayabiliyoruz fakat sizde tahmin edersiniz ki çok yavaş oluyor bu yöntemle. Kalman filtresi ile yapınca çok hızlı sonuç alıyoruz fakat elde ettiğimiz değer sürekli değişiyor. He yanlış anlamayın 1 kilo 2 kilo değişim olmuyor ama dediğim gibi %0.02'lik bir tolerans değerim var bu yüzden sonucun çok değişken olmaması gerekiyor.

Muhittin_kaplan Bey gönderdiğiniz linki daha önceden de incelemiştim hatta baya bir makale falan da araştırdım elde edilen veriyi sabitlemeyle alakalı bir bilgi bulamadım maalesef.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 10:16:13
yapmak istediğiniz Kalman kullanarak "bir çeşit ortalama" alarak lowpass filtre benzeri birşey yapmak mı ? Yoksa PID türevi bir kontrol algoritması oluşturmak mı ?
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: Melih1802 - 01 Aralık 2016, 10:18:42
Yine şema olmadığından, dirençler %1 hatta daha altında bir toleransa sahip mi. Aymı şekilde kondansatörler ve diğer malzemeler. Kullandığınız kart + otamın nemi. Kartın tasarımı, graund plane, nem için epoksi kaplama, alttan ve üstten faraday kafesi izoleli muhteşem besleme.

Bu saydıklarım son derece profesyonel kartlarda gördüğüm tasarımlardır.  Belki az bile yazdım.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 01 Aralık 2016, 11:27:45
@muhittin_kaplan bey aynen PID benzeri olabilir yani oturması gereken bir değer var ve buna ne kadar çabuk oturursa o kadar iyi bizim için. Kalmanda da yapmaya çalıştığımız bu temel olarak ilk 2 3 değerde olması gereken değere oturmalı sonrasında da çok az değişim olması gerekiyor. Şöyle bir örnek ölçüm gönderiyim daha iyi ifade edebilmek için
olt  50.008   -   50.005 
olt  50.006   -   49.987 
olt  50.006   -   49.994 
olt  50.006   -   50.014 
olt  50.004   -   50.000 
olt  50.004   -   50.000 
olt  50.006   -   50.029 
olt  50.008   -   50.011 
olt  50.008   -   49.994 
olt  50.008   -   49.996 
olt  50.008   -   49.992 
olt  50.006   -   49.964 
olt  50.004   -   49.992 
olt  50.002   -   49.979 
olt  50.000   -   49.992 
olt  49.998   -   49.992 

Sol tarafta görünenler 40 örneklemeyle elde edilen sonuç, sağ taraf ise kalmanla elde ettiğimiz sonuç. Demek istediğim ağırlık ölçümü bittikten sonra sonuçta oynama olmamasını yada çok çok az bir değişim istiyorum.
@Melih1802 Hocam anladım demek istediğinizi fakat PCB'yi ben çizmedim ve dediğiniz gibi devre kısmında çok fazla filtreleme yok bu sorunu programla halletmeye çalışıyorum.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 01 Aralık 2016, 11:32:38
@pro-TR Hocam yeni üye olduğum için galiba mesaj atamıyorum. R değeri formülün kendisinde var yanlış hatırlamıyorsam sistemin hata payı oluyor bir de Q değişkeni var o da yaptığınız modellemenin hata payı.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 14:08:35
http://www.muhittinkaplan.com/?p=29
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 01 Aralık 2016, 14:37:51
@muhittin_kaplan ilginiz için teşekkür ederim fakat sonucu stabil hale getirmeyle alakalı bir şey göremedim linkte.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 14:42:08
Hocam linkte kaynağı açık olan bir kalman simulator mevcut. oradan  Q R değerleriyle oynayarak gerekli verilere ulaşabilirsiniz (sanırım)
(Konunun donanım tarafına hiç değinmiyorum, Yukarıda gerekli cevap verilmiş.)
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 14:46:27
peki ölçüm derinliği ne olacak, kaçkez örneklediğinizde 0.02 lik bir sapma değerini görmek istiyorsunuz ?

hareketli ortalama işinize yaramıyor mu ?
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 01 Aralık 2016, 15:39:52
Video'yu izledim de o açıdan bakmamıştım hiç. R ve Q üzerinde baya bir oynadım hocam da sonucu o da değiştirmiyor. Şu şekilde olması lazım atıyorum teraziye 50kg ağırlığı koyduk bu ağırlık üzerinde olduğu sürece görmemiz gereken değerde ki değişim %0.02'yi geçmemeli belirli bir ölçüm sayısı ya da süre yok.
Kalman sayesinde ani değişimleri filtre edebiliyorum ama dediğim gibi işte ekranda gösterdiğim değer özellikle son iki digit hep değişiyor.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: tekosis - 01 Aralık 2016, 15:44:36
burada medyan filtreleme işe yarar gibi görünüyor.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 15:44:43
aslında lowpass istiyorsunuz.
Derin Hareketli Ortalama (Yada Unutulan Geçmiş de deniliyor) ile çözülür düşüncesindeyim.
Peki ölçülecek olan ağırlıkların çözünürlülüğü ne olacak 0.02 değişim demişsiniz ama A nesnesi 1gram iken B nesnesi 1,04 gram olabiliyor mu ?
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 01 Aralık 2016, 15:52:14
https://www.picproje.org/index.php/topic,39593.msg290322.html

https://www.picproje.org/index.php/topic,43892.msg321380.html

https://www.picproje.org/index.php/topic,49348.msg370354.html

https://www.picproje.org/index.php/topic,32011.msg224288.html

https://www.picproje.org/index.php/topic,42802.0.html
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 02 Aralık 2016, 10:30:41
@muhittin_kaplan ve @tekosis yorumlarınız için teşekkür ederim. Medyan ortalamayı hiç denememiştim ona da bakınıyım biraz. @muhittin_kaplan hocam sizin kullandığınız yöntemi de deneyeceğim en kısa sürede sonuçları buraya yazarım. İlginiz için teşekkürler.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 12 Aralık 2016, 15:09:52
@muhittin_kaplan hocam belirttiğiniz linkleri inceledim en sonunda desteğiniz için teşekkür ederim fakat istediğim gibi bir sonuç elde edemedim maalesef klasik ortalama almayla aynı hızda çalışıyor ve picklere karşı istediğim seviyede hassas çalşmıyor.
@tekosis  hocam medyan filtreyi de araştırdım fakat kendi kodlarıma nasıl ekleyeceğimi bulamadım maalesef, örnek olarak alabileceğim bir yerler var mıdır ?

Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 12 Aralık 2016, 15:14:24
unutulan geçmiş, moving average, median average  bildiğiniz fifo ortalama.
http://www.muhittinkaplan.com/?p=22
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 13 Aralık 2016, 12:19:05
hocam tekrar ölçüm sonuçlarını paylaşıyorum hareketli ortalama için,

(https://s29.postimg.cc/z66q9n0er/Ekran_Al_nt_s.png) (https://pixxxels.org/image/z66q9n0er/)
Yani anlamıyorum nerede hata var sizin dediğiniz gibi yapıyorum ama hiç bir iyileşme olmuyor. Sol taraf klasik ortalama sağ tarafta hareketli ortalama için.
kodlar https://www.picproje.org/index.php/topic,32011.msg224288.html (https://www.picproje.org/index.php/topic,32011.msg224288.html) bu linktekinin birebir aynısı.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: muhittin_kaplan - 13 Aralık 2016, 12:23:50
ortalama derinliği kaç hocam
(image şeklinde değilde text liste atarsanız ölçüm değerlerini bakalım hocam)
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: berat23 - 13 Aralık 2016, 12:40:28
bence olayı iyi analiz etmek lazım. sonra metod belirlenir.

mesela sizin durum gauss gürültülü bir ölçüme benziyor. gürültünün istatistiği bilinirse kalman bize en optimum estimation'u verir. moving average ya da benzeri low pass yapılar gürültüyü yumuşatır ama öte yandan gecikmeler yaşatır. zaten bilmediğin bir gürültüyü low pass ile ki bu gauss ise mümkün değil filtreleyemezsin. ama şu var, eğer süren sonsuz ve girişin sabitse ortalama alırsan sonuç en düşük hatalıdır. bizim sistemde giriş değişken ve gerçek zamanlı olduğundan smoothing filter uygun değildir. yani ortalama ile filtrelersin ama yakışıklı olmaz.

bize en uygun çözümün kalman türevi estimator'lar olduğunu anladık. şimdi kalman der ki ben sana en az mse ile estimation yaparım. bu şu demek değl, çıkış hep ideal ortalamada kalacak. elbette girişe bağlı olarak değişecek ve bu değişime 1-2 digit gibi bir sınır çizemesiniz. kalman deyince ben şunu da sorgularım; state  space modeli sistemi tanımlamada yeterli mi, ya da measurement ve process noise'ları nasıl belirlendi. zira kalman bu istatistikleri bilirse işini yapar.

biraz daha temele dönelim, dedik ki kalman filtremiz mükemmel, sorun yok. yine istenenden fazla gürültü varsa temelde dönmek lazım. eğer benim ölçüm sistemim fazla gürültülü ise kalman harikalar yaratamaz. demek ki ölçen devremde bir hata var ki ben istediğim doğruluğu sağlayamıyorum.

öte yandan bu kadar mühendislik yapmak yerine gecikmeleri göze alıp sanayi stayla 10-15 tap moving average koymak ta bir çözüm olabilir.
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: ugurer - 13 Aralık 2016, 13:38:24
Anlıyorum hocam. Ölçüm dengesiz olduğu için yani elektronik kısım iyi filtrelenmediği için kalman istediğim sonucu veremiyor. Anladığım kadarıyla bu durumda en iyi çözüm bol örnekleme alıp ortalama almak baya bir yol denedim fakat istediğim sonuçlara yaklaşamadı. Bu arada konuyla alakalı güzel bir makale buldum ilgilenen arkadaşlar için paylaşıyım.
http://www.analog.com/en/analog-dialogue/articles/a-reference-design-for-weigh-scales.html (http://www.analog.com/en/analog-dialogue/articles/a-reference-design-for-weigh-scales.html)
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: tekosis - 13 Aralık 2016, 15:13:18
@ugurer kusura bakma yazamadım. aşağıda kaynak olarak kullandığım, medyan filtreyi anlatan siteyi veriyorum. sonrasında ise benim kullandığım, pek profesyonelce olmayan ama işime yarayan kodları paylaşıyorum. eğer sitede verilen örneği bir kalem kağıt ile sende çözersen verdiğim kodu da rahatlıkla anlarsın inşallah. hani profesyonel bir kod olduğundan değil, düzensiz olduğundan  :D

https://electronicsfreelancer.wordpress.com/2011/09/14/median-filter-ortanca-filtresi/


void adc_oku()
{
unsigned int ao_i=0;
unsigned int ao_j=0;
sensor1voltaj=0;

  set_adc_channel(sensor1_kanali);
  delay_us(20);
 
  for(ao_i=1;ao_i<=8;ao_i++)
  {
  adc_deger[ao_i]=read_adc();// 8 adet örnek alınıyor(adc_deger[10] adet değer alıyor ama ben 1....8 arası olanları kullanıyorum)
  delay_ms(1);
  }

adc_deger[0]=adc_deger[1]; // burada medyan filtreleme için gerekli olan soldaki ve sağdaki değer eklemeleri yapılıyor
adc_deger[9]=adc_deger[8];// ilk değerin aynısı dizinin soluna, son değerin aynısı dizinin sağına ekleniyor.

    for(ao_j=0;ao_j<=9;ao_j++)   //buradan sonra yukarıda alınan 8 örneğin medyan filtrelemeye uygulanmış hali var
    {
    adc_deger_2[ao_j]=adc_deger[ao_j]; // örnekler yedekleniyor
    }

  for(ao_i=0;ao_i<=9;ao_i++)
  {
    for(ao_j=0;ao_j<=9;ao_j++)
    {
    adc_deger[ao_j]=adc_deger_2[ao_j];
    }

  if(adc_deger[ao_i]>adc_deger[ao_i+1])
  {
  adc_deger_yedek=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger[ao_i];
  adc_deger[ao_i]=adc_deger_yedek;
  }

  if(adc_deger[ao_i+1]>adc_deger[ao_i+2])
  {
  adc_deger_yedek=adc_deger[ao_i+2];
  adc_deger[ao_i+2]=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger_yedek;
  }

  if(adc_deger[ao_i]>adc_deger[ao_i+1])
  {
  adc_deger_yedek=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger[ao_i];
  adc_deger[ao_i]=adc_deger_yedek;
  }

  adc_deger_medyan[ao_i]=adc_deger[ao_i+1];
  }

  // burada medyan filtreleme tamamlandı.
 
  adc_deger_medyan[8]=0; // en sağda kalan gereksiz değerleri alışkanlıktan sıfırlıyorum
  adc_deger_medyan[9]=0;

          adc_ortalama=0;
            for(ao_j=0;ao_j<=7;ao_j++)   // filtrelemeden geçirilmiş 8 değerin ortalaması alınıyor.
            {
            adc_ortalama = adc_ortalama + adc_deger_medyan[ao_j];
            }ao_j=0;
           adc_ortalama=adc_ortalama/8;
   
   }
Başlık: Ynt: Kalman Filtresi Sonucu Sabitleme
Gönderen: berat23 - 13 Aralık 2016, 17:43:11
median filtreye gauss verirsen verdiğin gibi birşey alırsın. median, arada sırada gelen büyük hatalı verileri filtrelemek için ideal.

ayrıca örnek sayısını arttırıp filtreyi uzatmakta çözüm olmaz, neticede aynı kapıya çıkar. örneği arttırmadan filtre uzar ya da filtre boyu sabitken örnek azalırsa sonuç daha yumuşak olur.