IMU kontrol algoritması

Başlatan engineer42, 13 Eylül 2013, 15:13:24

mistek

Alıntı yapılan: muhittin_kaplan - 13 Eylül 2013, 23:39:05
ikisini de denemiş biri olarak söyüyorum.complementry iyidir. basittir.
kalman için taklalar atarsın sonuçta "ben kalman filtresi uyguladım" olur. (her ikisi içinde pc de program yazmış aynı degerlerle simule etmiş ve çok az fark olduğunu , hatta bazı yerlerde comp. filtrenin daha hızlı cevap verdiğini görmüşlüğüm vardır.)
hatta 3 kanal a kalman uygulamak mı ben bir daha almayayım.

kardeşim yıllarımı verdim filtrelere, kalman mı, complement mi yoksa morkov mu (buda yeni bilginiz olsun morkov chain) :-X
yedirtmem kimselere filtreleri  :P

Hocam ayıp oluyor ama. Bende bitirme projemde çok fazla haşır neşir oldum filtrelerle. Imudan aldığım bilgilerle mikroişlemcide açı hesaplatıp PC ye gönderdim ve matlabda grafiğe döktüm. Kalman ve comlemantary kıyaslandığında filtre çıkış cevabı evet comp. filtre daha hızlı ancak titreşimin yüksek olduğu yerlerde kalman daha temiz bir çıkış veriyor. Yanlış mıyım ? :)
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Tagli

Kalman'ı denemedim ama benim bahsettiğim yöntem (complementary dediğiniz o sanırım) titreşim durumunda hafiften saçmalıyordu. Tabi ben kodu doğru düzgün yazamamış da olabilirim. Üzerinde çok durmadım.
Gökçe Tağlıoğlu

engineer42

hocam bu complementary filter dediğimiz olay tam olarak ne oluyor kalman ile daha önce bişeyler duydum bir iki şey okudum ha anlamış değilim o ayrı tabi. complementary filter ile bi arkadaş şunu söylüyor;
  " In it's most simple form, the filter looks as follows:
             angle=0.98*(angle+gyrdata*dt)+(0.2*accdata) "

bu kadar mı sadece  ???

muhittin_kaplan

evet. okadar

(önce açı hesaplamalarını saymazsak)

Tagli

Benim bahsettigim farkliymis.
Gökçe Tağlıoğlu

muhittin_kaplan

    Public Sub AciHesapla()


        Dim Xv As Single = AlınanSensorBilgi.AccelX * (1 / 16384)
        Dim Yv As Single = AlınanSensorBilgi.AccelY * (1 / 16384)
        Dim Zv As Single = AlınanSensorBilgi.AccelZ * (1 / 16384)

        Dim Acilar As Euler = EulerHesapla(Xv, Yv, Zv) 'Euler Hesaplama Fonksiyonuna gider


        Dim GYRO_XRATE As Single = AlınanSensorBilgi.GyroX / 131
        Dim GYRO_YRATE As Single = AlınanSensorBilgi.GyroY / 131
        Dim GYRO_ZRATE As Single = AlınanSensorBilgi.GyroZ / 131

        '10ms
        compAngleX = (0.93 * (compAngleX + (GYRO_XRATE * 10 / 1000))) + (0.07 * Acilar.Pitch)  'Complimentary filter
        compAngleY = (0.93 * (compAngleY + (GYRO_YRATE * 10 / 1000))) + (0.07 * Acilar.Roll)
        compAngleZ = (0.93 * (compAngleZ + (GYRO_ZRATE * 10 / 1000))) + (0.07 * Acilar.Theta)



        gyroXangle += (GYRO_XRATE * 10) / 1000 'Calculate gyro angle without any filter  
        gyroYangle += (GYRO_YRATE * 10) / 1000

engineer42

muhittin hocam siz katsayıları 0.93 ve 0.7 olarak almışınız benim verdiğim örnekte de farklı almış. bunun hesabını neye göre yapıyoruz? bi de 1/16384 ve 1/131 değerleri ne için kullanılır ne ifade eder?

muhittin_kaplan

filtrede gyro ile ivmeölçerin ağırlıkları onlar.
yukardakiler doğrudan sensörün değerlerini açı değerlerine çevirmek için kullanılmıştır.

engineer42

şimdi gyro ivmeölçer ve compass dan verileri aldığımı kabul edelim. FIFO denilen arkadaşımızın tam görevini anlamadım. output registerinı okuduğumuzda yapılan ölçümün saklandığı yer olduğunu söyleyebilir miyiz? yani sürekli bi ölçüm yapılıyor ve output register a yazılmaktansa FIFO ya giriyor ve sırayla FIFO da bu veriyi outputa veriyor ta ki ben o veriyi okuyayım. eğer doğru anladıysam şöyle bi problemim var, gyro ivmeölçer ve compass dan aldığım bilgiler tek bir nokta için olmalı. yani 2x kadar yol aldım z düzleminde diğer eksenlerde oynama yok ancak bunu bir anda değil ikiye bölerek yapmış olsam x kadar yol aldım ölçülen veriler FIFO ya yazıldı sonra devam ettim tekrar yazıldı. benim iki farklı FIFO registerim var dolayısı ile atıyorum ivmeölçer den okuduğum veri ile gyro dan okuduğum veri aynı şeyin verileri değil... bu durumu nasıl çözebiliriz?  :o

engineer42

eğer FIFO anladığım şeyse zaten sensörün ölçtüğü veriler aynı sıra ile yazılır. sıra ile çıkışlar okunursa böyle bi karışıklık oluşmaz... galiba anladım şindi  ::)