Hazırlık Yapalım. MPU-6050

Başlatan muhittin_kaplan, 14 Haziran 2013, 17:10:54

striger

http://www.diydrones.com/profiles/blogs/invensense-releases-licence-to-allow-use-of-the-mpu-6000-dmp-proc?id=705844%3ABlogPost%3A932616&page=3#comments invensense download kısmında MotionDriver 5.1 diye bir library vermis sanırım indirmek icin uyelik gerekiyor, arduino icin kaynak kod daha cok var zorlu bir ise benziyo burda avr ara yuzuyle pc ye aktarmıs verileri stabil gorunuyor http://www.varesano.net/blog/fabio/initial-tests-freeimu-v04-and-mpu6050

everygelem

şöyle bir mantıkla olabilir belki.
loop(){
  angle += gyroRate / 100.0;
  Serial.print(angle);
  Serial.print("\n");
  delay(10ms);     
}

bu arada boşta aldığınız ortalama 150-50 gibi olan değer, döngüde toplanarak gittigi için devamlı  artan kayma  hatası oluşacağa benziyor.

muhittin_kaplan

Kullandığım Kütüphanede bir problem Olabilir
GYRO_X ile ACCEL_X in, hareket aynı düzlemde iken değerlerinin değişmesi gerekirken,
GYRO_Y yönünde hareket ettirdiğimde aynı oluyor.

muhittin_kaplan

Alıntı yapılan: pea - 08 Temmuz 2013, 00:14:05
Gyro, anlık açısal hız bilgisini veriyor. Açısal hızın integrali de açısal konum olduğu için kısaca; (okunan değer*geçen süre) sürekli toplanırsa modülün açısal konumu elde edilir. Ama, gyrolarda zamanla kayma(drift) hatası oluşuyor. 3 derece zamanla oluyor 13 derece.
İvmeölçerde de yerçekimi etkisinden direkt açı hesaplanabiliyor. (atan2 fonksiyonu) Ama ivmeölçerde de hassasiyet yüksek, en ufak etkide okuma coşuyor.

Bu ikisinin artıları birleştirilip, eksileri yok ediliyor çeşitli filtreler ile. Pek etkilenmediği için gyro, kaymadığı için ivmeölçer verilerine yüksek geçiren/alçak geçiren filtre mantığı ile manipülasyon yapılıyor.
En popüler 2 filtre tipi var. Biri Kalman; çok detaylı ve hassas, akademik uygulamalarda tercih ediliyor. Diğeri ise "Complementary/Tümleyici Filter", filtre işlemlerini katsayılar ile hallediyor, çok kullanılan pratik bir formülü var.
Burada formül, grafik, detaylı bilgi vs var: http://www.pieter-jan.com/node/11
Buradaki Linkte verlen programı VB.net  te gerçekledim ama bazı anlamadığım yerler var.

*pitch += ((float)gyrData[0] / GYROSCOPE_SENSITIVITY) * dt; // Angle around the X-axis
    *roll -= ((float)gyrData[1] / GYROSCOPE_SENSITIVITY) * dt;    // Angle around the Y-axis

bu nedir şimdi.


pea

2 eksen için okunan veriyi rad/s ya da derece/s cinsine çevirip integralini almış.

(float)gyrData[0] / GYROSCOPE_SENSITIVITY) = rad/s cinsinden açısal hız değeri
* dt = * değişim süresi/örnekleme zamanı
+= sürekli toplamaca

muhittin_kaplan

hocam anladım onu da dikkaet edcek olursak birinde gyro[0] diğerinde gyro[1] i kullanmış.
şimdi buradan çıkarttım "bu adam gyro dizisini 0 ına x, 1 ine y, 2 sine de z eksenini atıyor buna göre işlem yapıyor" oldu. ama accelerometre de bunu yapmamış.

Veli B.


pea

Alıntı yapılan: muhittin_kaplan - 10 Temmuz 2013, 15:32:15
hocam anladım onu da dikkaet edcek olursak birinde gyro[0] diğerinde gyro[1] i kullanmış.
şimdi buradan çıkarttım "bu adam gyro dizisini 0 ına x, 1 ine y, 2 sine de z eksenini atıyor buna göre işlem yapıyor" oldu. ama accelerometre de bunu yapmamış.

geç gördüm mesajı ne yazık ki.
aynen dediğiniz gibi yapmış. gyro[0]'da pitch ekseni, [1]'de roll ekseni, [2]'de yaw ekseni var.
ivmeölçer için de aynı şekilde dizi tanımlı. accData[3] dizisi var. açı bilgisi, tek bir ivme değerinden direkt çekilemeyeceği için atan2 fonksiyonuyla 2 eksen üzerinden bulunmuş sanırım.(bilgim zayıf o konuda)
en sonunda da complimentary filter denen filtre ile düzeltme yapmış, kayma değerini ivmeölçerden gelen açı bilgisi ile düzeltmiş.