Ynt: IMU ile Translation Algılama

Başlatan barisertekin, 14 Nisan 2014, 18:33:59

barisertekin

3ds max içerisinde runtime olarak IMU datalarını(X,Y,Z) okuyup 3D modele aktarıyorum.
Bu şekilde aşağıdaki linkteki gibi rotasyon işlemini başarılı bir şekilde gerçekleştirebiliyorum.

http://www.youtube.com/watch?v=PyUgsx3SuyE#

Fakat ben bu sensörleri kendi eklemlerime bağladığımda ileri doğru yürüdüğümü nasıl algılayabilirim.

Yapmak istediğim.

http://www.youtube.com/watch?v=B4gT1y97AlU#ws

Teşekkürler.

mesaj birleştirme:: 14 Nisan 2014, 19:08:40

Kafa uçmuş. Basit bir olayı göremedim.

Pozisyonun türevi hız. Hızın türevi ivmedir. Bunları zaten biliyoruz.
Eğer nesnenin ivmesi biliniyorsa double integrasyon yaparak pozisyonuda bulunabilir.

İvmenin integrali V = Hız
Hızın integrali X = Pozisyon

Şimdi bu bilgileri hayata geçirmek lazım. Biraz uğraşayım geri dönüş yaparım.

barisertekin

#1
Hayat çok zor :)

Şimdi 2 tip kuvvet var. Eylemsizlik kuvveti(Hareketin Ters Yönünde) ve Yerçekimi kuvveti. Yerçekimi her daim yüzeye uygulanıyor. Yani sensörün ivme çıktısı sensör hareketsiz olsa bile 0 olmuyor.

Bu halde cihaz hareket mi ediyor yoksa duruyor mu nasıl anlayacağız?

ACC X,Y,Z değerlerinin grafiğini çizdirdim. Cihazı sabit tutsamda eylemsizlik kuvveti değil ama yerçekimi kuvvetinden dolayı yüzeye yine bir ivme uygulanıyor.


barisertekin

#2
Extracting Inertial-Frame Acceleration :  Eylemsizlik Kuvveti = Toplam kuvvet - Yer çekimi kuvveti gibi bir şey yapılıyormuş. Bilen var mı?

Aslında şöyle olabilir. Yerçekimi ivmesi 1g miydi? Açıyı biliyoruz. 45 derece olsa kok(2)/2 = 0.707

Eylemsizlik Kuvveti = [OkunanDeğer] - 0.707

Tagli

O işler biraz karışık. Öncelikle, yerçekimi kuvveti ifadesi yanıltıcı. Burada kuvvet değil ivme söz konusu. Ayrıca burada yönelimi de hesaba katman gerekecek. Çünkü senin sensörünün, mesela ayağına bağladığında, yönelimi de değişecek ve bu sebeple, üzerinde başka hiçbir ivme etki etmese bile yerçekimi ivmesinin x y z eksenleri üzerindeki izdüşümleri değişecek. Bir de işin içine hareketten kaynaklanan ivmelerin girdiğini düşün.

Bu sebeple, bu işler sadece ivme ölçer ile yapılmaz. Sadece yönelimi anlayabilmek için bile en azından 3 eksen ivme ölçere ek olarak 3 eksen de jiroskop gerekir. Bu bile sapma (yaw) açısının eksik/hatalı kalmasına sebep olur ve ayrıca bir de 3 eksen magnetometre eklemek gerekir. İnsansız hava aracı tasarımlarını incelersen çoğunda 9 eksen IMU'dan bahsedildiğini görebilirsin.

Cep telefonlarında yönelim tespiti için 3 eksen ivme ölçer yeterli oluyor çünkü normal bir insan cep telefonunu koşarken, zıplarken veya yüksek bir yerden düşerken kullanmadığı için cep telefonu üzerinde yer çekimi ivmesi hariç bir ivme olmuyor ve bunun 3 eksen üzerindeki izdüşümlerinden yola çıkarak yönelim rahatlıkla belirlenebiliyor.

Hava araçlarında ise temel olarak, jiroskoptan gelen açısal hız değerinin inregrali alınıyor. Sayısal integral işlemi ciddi hatalara sebep oluyor ve bu hataların bir kısmı yazılımda düzeltilebilse dahi, zaman içinde ölçülen değer kaymaya başlıyor, mesela saniyede 1 derece gibi. Bunun için de, hava aracına sürekli ivme etki etmeyeceği varsayımı ile, yerçekimi vektörü düşük bir katsayı ile çarpılarak jiroskoptan gelen integral sonucunu düzeltmekte kullanılıyor. Böylece ivmedeki ani ama kısa süreli değişimler jiroskop çıkışının saçmalamasına sebep olmuyor.

IMU yazılımda genelde Kalman filtresi kullanılıyor. Alternatif yöntemler de var, internette DCM algoritması olarak aratabilirsin. Arduino ile yapılan ArduPilot'un kodunu internette bulabilirsin, onda bu işlemler yapılıyordu.

Bu arada, bu yazdıklarım sadece yönelim ile ilgili. Sanırım senin öteleme miktarını da ölçmen gerekecek. Bu daha da zor çünkü öteleme için ivmelerin 2 kez integralinin alınması gerekecek ve buradan gelecek hatalar nasıl düzeltilir bilmiyorum. Ama yapanlar var.
Gökçe Tağlıoğlu

barisertekin

#4
Önceden söylemeyerek sizi boşuna yordum. 9 DOF IMU kullanıyorum. Aslında AHRS diye geçiyor. Sebeb sadece yönelim algılayan sensörlere AHRS deniyor diye biliyorum.

Attitude and heading reference system : Ayarlanabilir Kafa Koruma Sistemi

Pozisyonda hesaplarsak tam anlamıyla IMU olacak sanırım.

Sensörün çıktısı:
XYZ,-6.0,-0.1,-28.0 //KALMANLI X,Y,Z Açıları
RAW,266,852,15638,-191,-47,133,118,-71,-132 // HAM( ACC X,Y,Z - GYRO X,Y,Z - MGNT X,Y,Z )


Sensör aslında ivme üretiyo ama açıya çevirip çıktı veriyor. Yanında bide açıya çevirmeden verseydi iyi olurdu. HAM dediği o mu acaba? Yoksa kalmansız mı kastedilmiş.

Hazır aldığım için kodu yok  güncelleyemiyorum.

berat23

ahrs düşündüğünle pek alakalı birşey değil;
http://en.wikipedia.org/wiki/Attitude_and_heading_reference_system

sensörün ne olduğunu söylersen yol gösterebilirim. basitçe yönelimini bulup(attitude) yerçekimini çıkardıktan sonra ivmenin integrali ile hız, yer değişirme vs bulursun. ama gürültü, bias kolay aşılacak sorular değil.

barisertekin

#6
Sensörün dökümanı aşağıdaki linkte.
http://www.barisertekin.com/Downloads/prosedur_v2.docx

Basitçe yönelimini bulup(attitude) yerçekimini çıkartmak. İşte bu. Bunu anlatabilirseniz süper olur.

picusta

Anladigim kadari ile sen ST'nin modülünü kullaniyorsun.

Ben de bu konuyu bir sene önce arastirmistim (hobi olarak 3 boyutlu ilerleyen robotlarda).
MPU6050 devre (6 eksen ivme, gyro ölçer) bir de 3 eksenli manyetometre kullaniyordum.
MPU6050 6 ekseni birlestirip bilgileri veriyordu (AHRS vs..?) manyetometreden gelen ilave 3 ekseni nasil birslestirecegimi bilmiyordum.
Senin de yapmak istedigin IMU (pozisyon için) + AHRS (yerçekimini eksiltmek için ) mi ? boyutta bir nesnenin korrdinatlarini zamana göre bulmak ?

berat23

9.81m/s2 lik yerçekmimi ivmesi roll pitch 0 iken sadece z olur diyeceksin, yani ivmeler (0 0 g) olacak, sonra sensörden gelen açılarla 3*3lük bir dönüşüm matrisi olacak sinüslü kosinüslü falan. aslında çıkarılabilir(attitude'a göre g nin bileşenleri hesabı) ama bence ara bul, internette var. bu vektör ile matrisi çarparsan yerçekiminin o anlık bileşenini bulursun. işlemin sonucu olan 3 elemanlı vektörü sensörden gelen ham ivme datasından çıkarırsan harekete neden olan ivme kalır. sonra ivmelerin integralini alacaksın, discrete integral demek toplama demek ama zaman önemli. dt'yi sensörün periyodu alacaksın ve gelen verinin birimi önemli, g mi mg mi yoksa m/s2 mi belli değil, o yüzden sensörün ne olsuğunu sordum.

kabaca bu. bu işlemlerin sonunda xyz eksenlerinde yer değiştirmeni bulursun. bulduğun sonuçta epey hatalı, zamanla kayan saçma birşey olur.

barisertekin

Öncelikle cihazın yeryüzü ile yaptığı açıyı tespit etmemiz gerekiyor.

Linkte adam anlatmış.
http://www.starlino.com/imu_guide.html#comment-783

Buradaki Rx,Ry,Rz bileşenleri Acc'den okuduğumuz X,Y,Z ivmeleri ise. Ki ben okuyamıyorum. Aşağıda yeni sensör önerisi istedim.

double R = Math.Sqrt(Math.Pow(ACCX, 2) + Math.Pow(ACCY, 2) + Math.Pow(ACCZ, 2));
double ThetaX = Math.Acos(ACCX / R);


ThetaX sensörün X ekseninin yeryüzü ile yaptığı açı.

----------------

Benim Sensör kodlarında değişiklik yapamadığım için istediğim dataları alamıyorum. Yeni bir sensör satın almam gerekiyor.

Kodlarında kolaylıkla güncelleme yapabileceğim.
Kalmanlı olarak g cinsinden çıktı veren bi sensör almam gerekiyor. Açıyı kendim hesaplarım. Benim sensör direk açı veriyor. İvme okuyamıyorum.

Uygun fiyatlı kaynağı olan bir IMU tavsiyesi yapabilir misiniz?

Asof544

Merhaba arkadaş projeyi tam olarak gerçekleştirdi mi?Yaptıysa ayrıntılarla birlikte bahsebilirmisin bende yaopmak istiyorum şimdiden teşşekkürler.