Birinci Derece Kalman Filtresi DC Bara Gerilimi Okumak İçin Yeterli Midir?

Başlatan sedronjames, 16 Mayıs 2022, 13:32:35

sedronjames

Merhabalar

DC bara gerilimi okumak için mikro denetleyicinin adc'sini kullanıyorum.

Hem öğrenmek adına hem de ilerleyen zamanlarda da kullanmam gerektiğini düşündüğüm için Kalman filtresini öğrenmeye çalışıyorum son bir haftadır. adc'den gelen veriyi süzmek için kalman filtresi kullanmak istedim.

kalmanfilter.net sitesinde çok detaylı ve muazzam şekilde anlatılmış. Genel olarak bu siteyi referans aldım.

Öğrendiğim kadarıyla kalman filtresi için bir  fonksiyon da yazdım.

Uygulama üzerinde denemeye çalıştığımda ise başarılı olmadığını gözlemledim.

Mantık olarak DC bara gerilimim sabit bir değer. Ben de bunun için birinci derece kalman filtresi kullandım.

Program ilk başlatıldığında initial olarak verilen DC bara gerilimini okuyor. burada bir sorun yok.
Ancak DC bara gerilimini değiştirdiğimde, örneğin 24 volttan 36 volta çektiğimde, kalman filtre çıkışı çok yavaş olarak 36 volta çıkmaya başlıyor.

Tam olarak 36 volta oturması dakikalar sürecek gibi gözüküyor. Bir yandan adcye gelen veriyi takip ettiğimde 36.01 35.99 gibi değerler okuyorum . yani ölçümlerim doğuya yakın geliyor.

acaba bu step şeklindeki artışlarda birinci derece kalman filtresi işe yaramıyor mu? ikinci derece veya üçüncü derece mi kullanmak lazım?

Tecrübelerini aktarmak isteyenlere teşekkür ederim.

iyi forumlar dilerim.
float KF_FirstOrderKalmanFilter(struct KalmanFilterParameters *PointerKalmanFilter, float MeasuredValue)
{
	PointerKalmanFilter->KalmanGain =
			PointerKalmanFilter->PreviousPrediction /
			(PointerKalmanFilter->PreviousPrediction + PointerKalmanFilter->Variance);


	PointerKalmanFilter->ActualEstimation = PointerKalmanFilter->PreviousEstimation +
			PointerKalmanFilter->KalmanGain * (MeasuredValue - PointerKalmanFilter->PreviousEstimation);


	PointerKalmanFilter->ActualPrediction = (1 - PointerKalmanFilter->KalmanGain) *
			PointerKalmanFilter->PreviousPrediction;


	PointerKalmanFilter->PreviousPrediction = PointerKalmanFilter->ActualPrediction;

	PointerKalmanFilter->PreviousEstimation = PointerKalmanFilter->ActualEstimation;

	return PointerKalmanFilter->ActualEstimation;
}

z

Kalman filtresi hakkinda bilgim yok fakat bu filitre sensor sinyalinin gurultuye boguldugu durumlarda kullaniliyor diye hatirliyorum.

Senin uygulamanda temiz bir geri besleme zaten var.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Emre_Tuncay_

Sadece tek kaynaktan gelen ölçümler ile kalman filtresini çalıştıramazsınız. Hata kaynağı birbirinden bağımsız 2 farklı sensör kullanırsanız ve bu sensörlerin ölçtüğü veriler birbiri ile koşullu bağımlı ise kalman filtresini modelleyebilirsiniz.

Örnek vermek gerekirse bir aracın gnss'den hız verisini ölçtünüz ama gnss'in gürültüsünden kurtulmak için kalman filtresine başvurmak istediniz. Kalman filtresini modellemek için gnss ölçümlerinin hata kaynağından bağımsız hata kaynağı olan başka bir ölçüme ihtiyaç duyarsınız. Bu ölçümü de ivme sensöründen alabilirsiniz. Bakınız gnss ile ivme sensörünün hata kaynakları farklıdır ama birbirlerine koşullu bağımlı verilerdir. Yani araç ivmelenince hızı artar.

Sizin uygulamanızda da 2.bir veriye ihtiyaç var. Mesela DC baranın üzerine düşen gerilimden kaynaklanan manyetik alanı ölçen bir sensör olduğunu düşünelim. Bu sensörü kullanarak kalman filtresini modelleyebilirsiniz.

sedronjames

Merhaba

Aslına bakarsanız ölçeceğim sinyal sabit bir değer. Devre DC motor süreceği için PWM dalgalarından bile iç gürültü oluşabiliyor. Benim amacım bu gürültüleri temizlemekti.

Bahsettiğiniz sensörlerde işaret sürekli değişken olabilir. Aracın hızına göre konum eksponansiyel veya parabolik bir grafik çizebilir. Bu tür işaretler için birinci derece kalman filtresi kullanmak uygun olmaz tabikide.

İkinci bir sensör kullanmam da pek mümkün değil. En basit yöntemle, gerilim bölücü kullanarak, DC gerilim okuma işlemi yapıyoruz.

Sisteme uygun en mükemmel kalmanı tasarlamak için kesinlikle ölçülecek sinyalin modellenmesi gerekiyor. Buna ben de kefilim. Ancak PID tuningdeki gibi katsayılar ile oynayarak da başarılı sayılabilecek bir sonuca ulaşmak mümkün sanırsam.

Dün bu başlığı açarken kullandığım kalman filtresinde yaşadığım sorun gerilimin seviyesi değiştiğinde bu gerilime çok yavaş oturmasıydı. Bunun nedeni de Kalman Gain'in sıfıra yaklaşmasıydı. Kalman gain sıfıra yaklaştığı için her bir estimationdaki artış çok az oluyordu. Githubdan da bakındığın pek çok algoritmada Prediction hesabı yapılırken bir katsayı eklenmişti.

Ben de aynı şekilde denediğimde Kalman katsayıları ile oynama da yaparak Başarılı bir filtreleme gerçekleştirdim diyebilirim.

Ortalama filtre, kayan ortalama ya da medyan filtre gibi belirli sayıda örnek alıp işlem yapmaya da gerek kalmıyor.

Kalman filtresinin en basit ADC okumalarında bile kesinlikle kullanılmasını öneririm.



17 Mayıs 2022, 15:34:09
Alıntı yapılan: z - 16 Mayıs 2022, 18:59:23Kalman filtresi hakkinda bilgim yok fakat bu filitre sensor sinyalinin gurultuye boguldugu durumlarda kullaniliyor diye hatirliyorum.

Senin uygulamanda temiz bir geri besleme zaten var.

@z Hocam, bu Kalman Filtresinin dayandığı matematik tam sizlik. İçine daldığınızda uğraşmaktan keyif alacağınıza eminim.

muuzoo

Alıntı yapılan: Emre_Tuncay_ - 16 Mayıs 2022, 23:39:12Sadece tek kaynaktan gelen ölçümler ile kalman filtresini çalıştıramazsınız. Hata kaynağı birbirinden bağımsız 2 farklı sensör kullanırsanız ve bu sensörlerin ölçtüğü veriler birbiri ile koşullu bağımlı ise kalman filtresini modelleyebilirsiniz.

Örnek vermek gerekirse bir aracın gnss'den hız verisini ölçtünüz ama gnss'in gürültüsünden kurtulmak için kalman filtresine başvurmak istediniz. Kalman filtresini modellemek için gnss ölçümlerinin hata kaynağından bağımsız hata kaynağı olan başka bir ölçüme ihtiyaç duyarsınız. Bu ölçümü de ivme sensöründen alabilirsiniz. Bakınız gnss ile ivme sensörünün hata kaynakları farklıdır ama birbirlerine koşullu bağımlı verilerdir. Yani araç ivmelenince hızı artar.

Sizin uygulamanızda da 2.bir veriye ihtiyaç var. Mesela DC baranın üzerine düşen gerilimden kaynaklanan manyetik alanı ölçen bir sensör olduğunu düşünelim. Bu sensörü kullanarak kalman filtresini modelleyebilirsiniz.

Emin misiniz? Geçmiş zaman ama pekala tek kaynaktan gelen ardışıl verilere kalman filtresi uygulanabilir. İlla iki kaynak olmak zorunda değil.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

muuzoo

Alıntı yapılan: sadogaffari - 17 Mayıs 2022, 15:31:49Merhaba

Aslına bakarsanız ölçeceğim sinyal sabit bir değer. Devre DC motor süreceği için PWM dalgalarından bile iç gürültü oluşabiliyor. Benim amacım bu gürültüleri temizlemekti.

Bahsettiğiniz sensörlerde işaret sürekli değişken olabilir. Aracın hızına göre konum eksponansiyel veya parabolik bir grafik çizebilir. Bu tür işaretler için birinci derece kalman filtresi kullanmak uygun olmaz tabikide.

İkinci bir sensör kullanmam da pek mümkün değil. En basit yöntemle, gerilim bölücü kullanarak, DC gerilim okuma işlemi yapıyoruz.

Sisteme uygun en mükemmel kalmanı tasarlamak için kesinlikle ölçülecek sinyalin modellenmesi gerekiyor. Buna ben de kefilim. Ancak PID tuningdeki gibi katsayılar ile oynayarak da başarılı sayılabilecek bir sonuca ulaşmak mümkün sanırsam.

Dün bu başlığı açarken kullandığım kalman filtresinde yaşadığım sorun gerilimin seviyesi değiştiğinde bu gerilime çok yavaş oturmasıydı. Bunun nedeni de Kalman Gain'in sıfıra yaklaşmasıydı. Kalman gain sıfıra yaklaştığı için her bir estimationdaki artış çok az oluyordu. Githubdan da bakındığın pek çok algoritmada Prediction hesabı yapılırken bir katsayı eklenmişti.

Ben de aynı şekilde denediğimde Kalman katsayıları ile oynama da yaparak Başarılı bir filtreleme gerçekleştirdim diyebilirim.

Ortalama filtre, kayan ortalama ya da medyan filtre gibi belirli sayıda örnek alıp işlem yapmaya da gerek kalmıyor.

Kalman filtresinin en basit ADC okumalarında bile kesinlikle kullanılmasını öneririm.



18 Mayıs 2022, 01:34:09
@z Hocam, bu Kalman Filtresinin dayandığı matematik tam sizlik. İçine daldığınızda uğraşmaktan keyif alacağınıza eminim.


Çözmenize sevindim. Aslında zevkli konudur, geçmişte uğraşmıştım. Lineer olmayan sistemler için de çeşitli versiyonları mevcuttur.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

sedronjames

@muuzoo paylaştığınız kaynağı incelemiştim. Hatta formüllerimi de ona bakarak çıkarmıştım. Bahsettiğiniz kaynaktaki örneği @muhittin_kaplan  koda dökmüştü. Kod çalışıyor. Verilen örnektekiyle de aynı sonucu veriyor. Ancak giriş sinyalinin (ya da donanım yoksa giriş olarak bir dizi tanımlayın) genliğini step şeklinde artırdığınızda, doğru ifadeye oturması için oldukça fazla sayıda iterasyon gerektiğini göreceksiniz. Bunun nedenini de yukarıda anlattım.
 

muuzoo

Alıntı yapılan: sadogaffari - 17 Mayıs 2022, 16:41:30@muuzoo paylaştığınız kaynağı incelemiştim. Hatta formüllerimi de ona bakarak çıkarmıştım. Bahsettiğiniz kaynaktaki örneği @muhittin_kaplan  koda dökmüştü. Kod çalışıyor. Verilen örnektekiyle de aynı sonucu veriyor. Ancak giriş sinyalinin (ya da donanım yoksa giriş olarak bir dizi tanımlayın) genliğini step şeklinde artırdığınızda, doğru ifadeye oturması için oldukça fazla sayıda iterasyon gerektiğini göreceksiniz. Bunun nedenini de yukarıda anlattım.
 

O yüzden mesajımı değiştirip kaynağı silmiştim çzödüğünüzü görünce. Bu durumlar için o katsayı dediğiniz aslında formülde verilen gürültü matrisi (sizin durum için process noise). Bir de measurement noise mevcut. Zaten kalman uygulamadaki zorluklardan biri uygun gürültü matrisini bulmaktır. Sezgisel ve algoritmik çeşitli metodlar mevcut.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


Emre_Tuncay_

Alıntı yapılan: muuzoo - 17 Mayıs 2022, 16:21:37Emin misiniz? Geçmiş zaman ama pekala tek kaynaktan gelen ardışıl verilere kalman filtresi uygulanabilir. İlla iki kaynak olmak zorunda değil.

Kalman filtresi üzerine biraz kafa yordum ama işin uzmanı değilim yanılıyor da olabilirim. Kalman filtresinin tek bir ölçüm ile yapıldığını belirten bir kaynak varsa paylaşırsanız faydalı olur benim için.

Kalman filtresinde 2 adım vardır. Bunlar tahmin ve ölçümlerin düzeltilmesi. Bir veriyi tahmin edersiniz ve ölçüm alırsınız sonrada ölçümünüzünmü yoksa tahminizinmi doğru olduğuna karar verirsiniz buna göre de ölçümünüzü düzeltirsiniz.

Tek bir ölçüm ile nasıl bir tahmin modeli geliştiriliyor. Gnss verilerini filtrelemek üzerine uğraştığım için yine örneği gnss'den vereceğim. Elimizde sadece pozisyon ölçebildiğimiz bir gnss olsun. Bu gnss'i düz bir çizgi üzerine hareket ettirdiğimizde ölçümler o çizgi üzerinde hep salınır. Biz bu gürültüyü filtrelemek için kalman filtresi kullanmaya kalktığımızda. İlk olarak pozisyon örneklemesi yaparız ardından tahmin etme adımını gerçekleştiririz. Tahmin adımında pozisyon değişimi modelleyebilmek için hız ve delta zamana ihtiyacımız olacaktır. Örnekleme frekenasımızdan delta zamanı elde edebiliriz ama hız bilgisine ulaşmamız mümkün olmaz çünkü hız verisini başka bir kaynaktan ölçmedik bu nedenle tahmin modelini çalıştıramayız.

Aşağıdaki kaynak faydalı bulduğum bir kaynaktır.
https://www.bzarg.com/p/how-a-kalman-filter-works-in-pict

@sadogaffari
Okuduğum bir kaç kaynakta kalman filtresinin tune edilmesinde bahsediyordu. Dediğiniz gibi pratikte ince ayarlamalar yapılıyor.

muhittin_kaplan

Yukarıda verdiğim linklerde tekbir ölçüm, ve birkaç katsayı ile yapılan örnek verilmiş.
Bu katsayıları başka bir ölçüm sonucu oluşturursanız daha doğru bir filtre oluşturursunuz.

Firzen

Alıntı yapılan: sadogaffari - 16 Mayıs 2022, 13:32:35Merhabalar

DC bara gerilimi okumak için mikro denetleyicinin adc'sini kullanıyorum.

Hem öğrenmek adına hem de ilerleyen zamanlarda da kullanmam gerektiğini düşündüğüm için Kalman filtresini öğrenmeye çalışıyorum son bir haftadır. adc'den gelen veriyi süzmek için kalman filtresi kullanmak istedim.

kalmanfilter.net sitesinde çok detaylı ve muazzam şekilde anlatılmış. Genel olarak bu siteyi referans aldım.

Öğrendiğim kadarıyla kalman filtresi için bir  fonksiyon da yazdım.

Uygulama üzerinde denemeye çalıştığımda ise başarılı olmadığını gözlemledim.

Mantık olarak DC bara gerilimim sabit bir değer. Ben de bunun için birinci derece kalman filtresi kullandım.

Program ilk başlatıldığında initial olarak verilen DC bara gerilimini okuyor. burada bir sorun yok.
Ancak DC bara gerilimini değiştirdiğimde, örneğin 24 volttan 36 volta çektiğimde, kalman filtre çıkışı çok yavaş olarak 36 volta çıkmaya başlıyor.

Tam olarak 36 volta oturması dakikalar sürecek gibi gözüküyor. Bir yandan adcye gelen veriyi takip ettiğimde 36.01 35.99 gibi değerler okuyorum . yani ölçümlerim doğuya yakın geliyor.

acaba bu step şeklindeki artışlarda birinci derece kalman filtresi işe yaramıyor mu? ikinci derece veya üçüncü derece mi kullanmak lazım?

Tecrübelerini aktarmak isteyenlere teşekkür ederim.

iyi forumlar dilerim.
float KF_FirstOrderKalmanFilter(struct KalmanFilterParameters *PointerKalmanFilter, float MeasuredValue)
{
	PointerKalmanFilter->KalmanGain =
			PointerKalmanFilter->PreviousPrediction /
			(PointerKalmanFilter->PreviousPrediction + PointerKalmanFilter->Variance);


	PointerKalmanFilter->ActualEstimation = PointerKalmanFilter->PreviousEstimation +
			PointerKalmanFilter->KalmanGain * (MeasuredValue - PointerKalmanFilter->PreviousEstimation);


	PointerKalmanFilter->ActualPrediction = (1 - PointerKalmanFilter->KalmanGain) *
			PointerKalmanFilter->PreviousPrediction;


	PointerKalmanFilter->PreviousPrediction = PointerKalmanFilter->ActualPrediction;

	PointerKalmanFilter->PreviousEstimation = PointerKalmanFilter->ActualEstimation;

	return PointerKalmanFilter->ActualEstimation;
}

Covariance Matrix'i ve Process Modeli nasıl belirlediniz?
Doğru çalışmama nedeni şunlar olabilir:
  • Process Model ile Covariance matrix'e aynı oranı vermiş olabilirsin.
  • Measurement Noise için topladığın gürültü variance'ı doğru değildir.
  • Sistemin Process modeli ile gerçek modeli arasındaki fark 0.99'u geçmiş olabilir.
  • Sistem Nonlinear Dynamics olmasına rağmen basit bir linear function ile tanımlandırılmış olabilir.
Bunlar için çözüm:
  • Linear modelini simülasyon ile test edebilirsin bu sayede Process Modelini test etmiş olursun
  • Bara üzerine giriş çıkış gerilimleri uygulayarak gürültünün dağılımını çıkar, sonrasında da gürültü dağılımını covariance matrix'e çevir
  • Oluşturduğun modelin örnekleme zamanı ile sistemin örnekleme zamanını eşle ve çıktıların transient response'una bak
  • Sistemin linear modelini tasarlamış ve belirli kararlılık aralığında vermiş olabilirsin. Bu da gerçek hayattaki sistemininin herhangi bir belirsizlik altında beklenmedik cevap vermesine neden olmuş olabilir. Bu durum coupled dynamics'lerden kaynaklı da olabilir. Bu durumda sistemin Nonlinear Dynamics'lerini çıkarıp ardından Extended Kalman Filter Kullanabilirsin. Ama burada Farklı olarak Sistem modelinin Jacobian Matrix'ini alman gerekecektir.

17 Mayıs 2022, 23:54:29
Alıntı yapılan: Emre_Tuncay_ - 16 Mayıs 2022, 23:39:12Sadece tek kaynaktan gelen ölçümler ile kalman filtresini çalıştıramazsınız. Hata kaynağı birbirinden bağımsız 2 farklı sensör kullanırsanız ve bu sensörlerin ölçtüğü veriler birbiri ile koşullu bağımlı ise kalman filtresini modelleyebilirsiniz.

Örnek vermek gerekirse bir aracın gnss'den hız verisini ölçtünüz ama gnss'in gürültüsünden kurtulmak için kalman filtresine başvurmak istediniz. Kalman filtresini modellemek için gnss ölçümlerinin hata kaynağından bağımsız hata kaynağı olan başka bir ölçüme ihtiyaç duyarsınız. Bu ölçümü de ivme sensöründen alabilirsiniz. Bakınız gnss ile ivme sensörünün hata kaynakları farklıdır ama birbirlerine koşullu bağımlı verilerdir. Yani araç ivmelenince hızı artar.

Sizin uygulamanızda da 2.bir veriye ihtiyaç var. Mesela DC baranın üzerine düşen gerilimden kaynaklanan manyetik alanı ölçen bir sensör olduğunu düşünelim. Bu sensörü kullanarak kalman filtresini modelleyebilirsiniz.

Açıkcası yanlış bilgi hocam. Tek sensör üzerine de kalman uygulanabilir. Önemli olan sistem üzerindeki gürültüyü bulabilmek. Örneğin DC gerilim sensörünüz var Bunu bildiğiniz bir güç kaynağına takın sabit ve EMİN OLDUĞUNUZ bir gerilim verin ardından variance'ı belirleyin. Sizin bahsettiğiniz Kalman Filter değil Complementary Filter.
Kararsız...

sedronjames

Alıntı yapılan: muuzoo - 17 Mayıs 2022, 17:01:13O yüzden mesajımı değiştirip kaynağı silmiştim çzödüğünüzü görünce. Bu durumlar için o katsayı dediğiniz aslında formülde verilen gürültü matrisi (sizin durum için process noise). Bir de measurement noise mevcut. Zaten kalman uygulamadaki zorluklardan biri uygun gürültü matrisini bulmaktır. Sezgisel ve algoritmik çeşitli metodlar mevcut.

Tam olarak dediğiniz gibi evet. İlginiz için teşekkür ederim.

sedronjames

Alıntı yapılan: Emre_Tuncay_ - 17 Mayıs 2022, 20:27:22Kalman filtresi üzerine biraz kafa yordum ama işin uzmanı değilim yanılıyor da olabilirim. Kalman filtresinin tek bir ölçüm ile yapıldığını belirten bir kaynak varsa paylaşırsanız faydalı olur benim için.

Kalman filtresinde 2 adım vardır. Bunlar tahmin ve ölçümlerin düzeltilmesi. Bir veriyi tahmin edersiniz ve ölçüm alırsınız sonrada ölçümünüzünmü yoksa tahminizinmi doğru olduğuna karar verirsiniz buna göre de ölçümünüzü düzeltirsiniz.

Tek bir ölçüm ile nasıl bir tahmin modeli geliştiriliyor. Gnss verilerini filtrelemek üzerine uğraştığım için yine örneği gnss'den vereceğim. Elimizde sadece pozisyon ölçebildiğimiz bir gnss olsun. Bu gnss'i düz bir çizgi üzerine hareket ettirdiğimizde ölçümler o çizgi üzerinde hep salınır. Biz bu gürültüyü filtrelemek için kalman filtresi kullanmaya kalktığımızda. İlk olarak pozisyon örneklemesi yaparız ardından tahmin etme adımını gerçekleştiririz. Tahmin adımında pozisyon değişimi modelleyebilmek için hız ve delta zamana ihtiyacımız olacaktır. Örnekleme frekenasımızdan delta zamanı elde edebiliriz ama hız bilgisine ulaşmamız mümkün olmaz çünkü hız verisini başka bir kaynaktan ölçmedik bu nedenle tahmin modelini çalıştıramayız.

Aşağıdaki kaynak faydalı bulduğum bir kaynaktır.
https://www.bzarg.com/p/how-a-kalman-filter-works-in-pict

@sadogaffari
Okuduğum bir kaç kaynakta kalman filtresinin tune edilmesinde bahsediyordu. Dediğiniz gibi pratikte ince ayarlamalar yapılıyor.

Sinyalimin karakteristiğini bildiğim için modelleme konusunda bir kabul yaptım. Sizin projenizde de konum bilgisi hıza ve dolayısıyla ivmeye göre değişebilir. İvmenin sabit olacağı kabulü ile üçüncü derece kalman filtresi tasarlayabilirsiniz. Kalman konusunda çok yeniyim. Yüksek lisansta Kontrol okuyacağım. Bol bol haşır neşir oluşuruz ve burada da öğrendiklerimi paylaşırım diye düşünüyorum.