2011-08-02 12 views
14

Ivmeölçer okumaları yerçekimi kaldırmak gerekir Android için bir uygulama geliştiriyorum. Bu konuda birçok tartışmayı okudum, ayrıca bir algoritma buldum here, ama ben gerçekten anlamadım.android ivmeölçer okumaları yerçekimi kaldırmak

Toplam ivmeden değil, her eksenden yerçekimini filtrelemek istiyorum.

Lütfen bana yardımcı olabilir misiniz? Benim kod şey gibi olmalıdır:

Ben filterGravity() yönteminde yer gerekenler kodu
public void onSensorChanged(SensorEvent sensorEvent) { 
    float vals[] = sensorEvent.values; 
    float accelerationX = filterGravity(vals[0]); 
    float accelerationY = filterGravity(vals[1]); 
    float accelerationZ = filterGravity(vals[2]); 
} 

?

cevap

20

Temel bir çözüm için, bir Kalman filtresi gibi diğer yaklaşımların bir low pass filter olması gerekir. Android için basit bir örnek, http://developer.android.com/reference/android/hardware/SensorEvent.html#values adresindeki bağlantınızdan bir tık uzakta.

Düşük geçiş filtresinin basitçe, tüm geçmiş değerlerinden ağırlıklı ortalama oluşturduğunu söylüyorsunuz. Örneğin, 0.1'lik bir filtreleme faktörüne sahipseniz, mevcut değerinizin% 10'unun önceki ortalama değere eklendiği anlamına gelir: newMeanValue = currentMalue'nin% 10'u + oldMeanValue'nın% 90'ı. Bu, ani bir tepe noktası olsa bile, ortalama değerinizi yalnızca% 10'dan dolayı yavaşça itecek anlamına gelir.

+0

Teşekkür ederiz. Yardımcı oldu. – Gabriel

+0

@Kay Üzgünüz, cevabınızı UPvote etmek istedim. Lütfen son cümlenize bir nokta ekleyin (ya da birtakım düzeltmeler yapın) bu yüzden oylama notumun bir değeri olur. Üzgünüz ... – Ali

+0

@Ali: nokta eklendi, sorun değil :-) – Kay

11

Lineer hızlanma ihtiyacınız olan şeydir. Sensor.TYPE_LINEAR_ACCELERATION here'u kontrol edin.

+0

Çok teşekkür ederim. Bu benim problemimi başaracaktı. Ancak, bu yalnızca API level 9'dan beri desteklenmektedir. Bunu, önceki API sürümlerinde uygulamak için bir yol var mı? – Gabriel

+0

@Gabriel Korkmuyorum.Bunun arkasında, ivmeölçer, jiroskop ve pusula verilerini birleştiren bazı ağır matematik var. Burada sensör füzyonu ile ilgili ilginç bir video var: http://www.youtube.com/watch?v=C7JQ7Rpwn2k – Ali

-1

değil Tamamladılar çalışıyor ama büyüklüğü için göz ise (0 arasında bir sonuç verecektir ve 1) ne çok emin o zaman yapmak herkes tarafından sonucu bölmek olduğunu 10

public void onSensorChanged(SensorEvent sensorEvent) { 
float vals[] = sensorEvent.values; 
float accelerationX = (vals[0]/10); 
float accelerationY = (vals[1]/10); 
float accelerationZ = (vals[2]/10); 

} bir oyun ortamında

sensör sizin nesne TYPE_LINEAR_ACCELERATION ile bir telefon yoksa

7

, sen TYPE_ACCELERATION ile sıkışmış maksimum hızda olacak bütün hızıyla olduğunu Bu, yerçekimini (eğim) doğrusal ivme ile ayıramaz.

Düşük geçiş filtresini uygulamak için bir seçenek kullanılacaktır. Başka bir yaklaşım jiroskop mevcut ise sensör füzyon kullanıyor. Her iki yaklaşımın avantajları ve dezavantajları vardır.

Açık kaynak projesinde Acceleration Explorer çok sayıda çalışma örneğim var.

+0

Merhaba Kaleb, şu anda android kullanamayacağım farkla FusedLinearAcceleration android uygulamanıza benzer bir java uygulaması üzerinde çalışıyorum. yerçekimi hesaplamak için sanal sensörler. SensorManager'dan bazı yöntemler kullandım, ancak yerçekimi vektörünü elde etmek için algoritma bulamıyorum. Bunun quaternions kullanarak elde edilebileceğini ve bunun gibi bir şeyin değiştirildiğini/yazdığını buldum: https://gist.github.com/Bresiu/c0a69552881b8df34a2e. Ancak kötü sonuç verir - yerçekimi sadece z ekseni ile telafi edilir (dinlenme kodu uygulamanıza dayanır). Bazı ipuçların var mı, neyin yanlış olabilir? Kodum: http://goo.gl/5jmlvY – Bresiu

+0

@Bresiu: FusedLinearAcceleration'ın kullandığı tek sanal sensör Sensor.TYPE_GRAVITY ve bunu Sensor.TYPE_ACCELERATION olarak değiştirebilirsiniz. Ancak, bir jiroskopu olan bir cihazınız varsa, Sensor.TYPE_GRAVITY uygulanmalıdır. Göndermiş olduğunuz kodu (ve kodumu detaylandıran bu blog makalesine (http://www.kircherelectronics.com/blog/index.php/11-android/sensors/17-gyroscope-linear-acceleration) bakabilirsiniz.). Yerçekimi vektörünü kapladığı için yardımcı olabilir. Dinamik hızlandırma sırasında (bir araba gibi) herhangi bir şeyi ölçmeye çalışıyorsanız, bunun modifikasyona ihtiyaç duyacağını unutmayın. – Kaleb

+0

Ben jiroskop, ivmeölçer ve manyetometre ile bir cihaz var, bu yüzden en iyi sonuç için bazı sensör füzyon arıyorum. Diğer uygulamalarınızı gördüm ve FusedLinear en doğru gibi görünüyor. Arama yapmaya devam edeceğim ... – Bresiu

İlgili konular