Senin, 31 Oktober 2011

FUSION SENSOR ACCELEROMETER DAN GYROSCOPE MENGGUNAKAN ALGORITMA COMPLEMENTARY FILTER

Mengapa diperlukan penggabungan (fusion) sensor accelerometer dengan gyroscope?

Jawabannya: 

Accelerometer dapat memberikan pengukuran sudut kemiringan (tilt) yang akurat ketika sistem sedang diam (statis). Bila sistem sedang berotasi atau bergerak, accelerometer tidak bisa mengikuti pergerakan yang cepat dikarenakan responnya yang lamban dan memiliki noise. 

Gyroscope dapat membaca kecepatan sudut (angular rate) yang dinamis. Setelah melakukan komputasi menggunakan integral data dari waktu ke waktu, maka perpindahan sudut atau sudut kemiringan dapat dihitung. Tetapi sudut ini akan menjadi tidak akurat dalam jangka panjang karena efek bias yang dihasilkan oleh gyroscope.

Untuk lebih jelasnya tentang kelemahan sensor-sensor tersebut, saya telah melihat dan membuat grafik tentang respon output dari kedua sensor tersebut. Grafik ini saya dapatkan dengan mengirimkan data output masing-masing sensor ke komputer melalui komunikasi serial.

Accelerometer.
Accelerometer yang saya gunakan adalah MMA7260Q.
Untuk dapat mengkases dan membaca serta mengkalibrasi sensor ini, silakan klik disini.
Setelah saya lakukan kalibrasi, sensor tersebut saya gunakan untuk mengukur kemiringan sudut (tilt). Berikut adalah keluaran sensor accelerometer saat mengukur kemiringan sudut 0 derajat.
 
Dari output accelerometer terlihat jelas bahwa sinyal keluarannya masih memiliki noise.

Gyroscope
Gyroscope yang saya gunakan adalah LISY300 Gyroscope Module.
Untuk dapat membaca atau mengakses sensor ini silakan klik disini.
Gyroscope mempunyai cara kerja sebagai berikut: 
"Sensor gyroscope yang digunakan akan mempunyai nilai keluaran jika sedang berotasi. Ketika sensor gyroscope berotasi searah jarum jam pada sumbu Z, maka tegangan keluarannya akan mengecil. Sedangkan jika berotasi berlawanan arah jarum jam, maka tegangan keluarannya akan membesar. Jika sensor gyroscope tidak berotasi (keadaan diam) maka keluaran tegangan gyroscope akan bernilai sama dengan nilai offset-nya."

Berikut adalah ourput gyroscope ketika berotasi:
Label a menunjukkan bahwa sensor gyroscope berotasi searah jarum jam yang ditandai dengan mengecilnya nilai keluaran sensor gyroscope. Sedangkan label b, menunjukkan bahwa sensor gyroscope berotasi berlawanan arah jarum jam yang ditandai dengan membesarnya nilai keluaran sensor gyroscope.
Sekarang perhatikan ketika sedang diam (tidak berotasi)
Sensor gyroscope dalam keadaan diam (tidak berotasi), sehingga kecepatan rotasinya adalah 0. Tetapi dari grafik diatas, sinyal yang dihasilkan terkadang mempunyai nilai dan berubah-ubah. Jika sensor gyroscope dalam keadaan diam, keluarannya akan sama dengan nilai offset-nya, hal ini dikarenakan sensor gyroscope mempunyai nilai bias.
Cukup untuk dasar teorinya, sekarang langsung ke algoritma complementary filter. Pada dasarnya ada sebuah metode algoritma yang lebih baik dibanbing complementary filter yaitu algoritma kalman filter. Tetapi saya kurang begitu paham, jadi saya pakai complementary filter saja.
Dibawah ini adalah diagram blok dari komplementary filter.

Menggunakan 2 sumbu sensor accelerometer untuk mendapatkan nilai kemiringan sudut (θ), yaitu sumbu X dan Z. Kemudian sudut kemiringan dari accelerometer ini di umpankan ke low-pass filter untuk menghilangkan noise. Sedangkan keluaran sensor Gyroscope yang berupa kecepatan sudut (ω) harus diintegralkan terlebih dahulu untuk mendapatkan nilai perpindahan sudut atau sudut kemiringan. Kemudian diumpankan ke high-pass filter untuk menghilangkan efek bias pada gyroscope. 

Jika complementary filter ini diaplikasikan ke bahasa pemrograman, maka akan terlihat pada cuplikan program dibawah ini.
sudut = (a)*(sudut+out_gyro*dt)+(1-a)*(sudut_acc);

Dimana:
a                =  koefisien filter
dt               =   waktu sampling, disesuaikan dengan waktu sampling nilai sensor
sudut         =  sudut keluaran complementary filter
out_gyro    =  keluaran sensor gyroscope berupa kecepatan sudut
sudut_acc  =  keluaran sensor accelerometer yang sudah berupa sudut

Mudah bukan???
Jika cuplikan program diatas menggunakan waktu sampling sebesar dt, maka time constant (τ) dapat ditentukan:
 τ=(a*dt)/(1-a)
dimana:
a=koefisien filter
dt=waktu sampling
Time constant adalah lamanya waktu update sinyal keluaran dari complementary filter.
Sekarang saya akan jelaskan pengaruh koefisien filter (a) dan pengaruh wakru sampling (dt).

Pengaruh koefisien filter (a)
Nilai koefisien filter (a) akan saya ubah-ubah sebesar 0,6, 0,8 dan 0.97 dengan waktu sampling  (dt) tetap yaitu 10 ms. Berikut adalah respon keluaran dari sinyal complementary filter.
 
koefisien filter 0,6 sedang diam (tidak berotasi)

 
koefisien filter 0,6 sedang berotasi


 koefisien filter 0,8 sedang diam (tidak berotasi)

 koefisien filter 0,8 sedang berotasi

 
koefisien filter 0,97 sedang diam (tidak berotasi)


koefisien filter 0,97 sedang berotasi

Garis berwarna merah adalah keluaran sensor accelerometer, hitam adalah keluaran sensor gyroscope dan biru adalah sinyal keluaran dari complementary filter.
Dari beberapa gambar diatas dapat disimpulkan:
Semakin besar  nilai koefisien filter (a) maka sinyal keluaran complementary filter akan lebih stabil (semakin tidak ber-noise) tetapi akan memperlama time constant yang mengakibatkan waktu update sinyal semakin lama.
Coba anda bandingkan dengan persamaan untuk mencari nilai time constant, maka kesimpulan diatas berdasarkan pengujian akan sesuai dengan persamaannya.

Pengaruh waktu sampling (dt)
Nilai waktu sampling akan saya ubah-ubah dengan nilai 0,1 detik (10Hz), 0,05 detik (20Hz) dan 0,01 detik (100Hz).
dt=0.01

  dt=0.05

 dt=0.1
Sehingga dapat disimpulkan bahwa semakin cepat waktu sampling yang digunakan maka akan semakin cepat time constant dari sinyal keluaran complementary filter.
Sekali lagi anda perhatikan persamaan untuk menghitung time constant, maka kesimpulan diatas yang berdasarkan pengujian sinyal keluaran complementary filter, akan sesuai dengan teori pada persamaan menghitung nilai time constant.

Pemilihan nilai koefisien filter (a) dan waktu sampling (dt)  harus disesuaikan dengan respon pada aplikasi yang anda buat. Jika respon sistem aplikasi anda cepat, maka disarankan untuk mempercepat nilai time constant, dan jika respon sistem pada aplikasi yang anda buat relatif lambat, maka nilai time constans pada algoritma complementary filter dapat anda buat relatif lebih lama.

Semoga bermanfaat...
kedua sensor yang saya gunakan saya beli di digi-ware.com

REFERENSI:
Colton, Shane, The Balance Filter: A Simple Solution for Integrating Accelerometer and Gyroscope Measurements for a Balancing Platform.

7 komentar:

  1. semakin menarik aja informasi diatas, kalau keluaran accelerometer untuk 3 axis yg digunakan tanpa dari gyro.
    x_acc=(float)(x_acc_ADC-x_acc_offset)*x_acc_scale; //dalam radian

    atau tetap menggunakan rumus sebelumnya mas.

    BalasHapus
  2. algoritma complementary filter ini digunakan untuk fusion sensor accelerometer dan dan gyroscope

    BalasHapus
  3. Saat ditampilkan dlm bentuk sudut sumbu Y terhadap Z menunjukkan nilai 40 (int) saat kondisi diam. sedangkan y=read_adc(2) nilainya 85 dan z=read_adc(1) nilainya 99. Apa ada kesalahan terhadap nilai tsb mas

    BalasHapus
  4. Komentar ini telah dihapus oleh administrator blog.

    BalasHapus
  5. masih keren klo bikin kalman filter<<TOP BGT

    BalasHapus
  6. apa bisa data out dari sensor lagsung di filter??

    bukannya untuk menfilter kedua sensor tersebut data out dari sensor di rubah kePWM untuk mengetahui frekuensi sehingga dapat di filter.....

    BalasHapus
  7. Tentu saja bisa...
    Untuk apa harus dicari PWMnya... apakah anda bisa menentukan frekuensi dari sebuah data yang berboise? dan apakan frekuensi dari noise itu konstan?
    intinya data yg saya dapat dari sensor ingin dikurangi noisenya...
    Tergantung dari karakteristik sensor itu sendiri

    BalasHapus