2011-06-11 13 views
5

İvmeölçer kullanarak sarsıcı olay tespit etmeye çalıştım. Telefona sürekli bir sarsıntı verdiğimde hızlanmadaki değer farkının oldukça kararlı olduğunu buldum. Ancak telefonu döndüğümde, her zaman değer üzerinde büyük bir değişiklik olur (değer genellikle "döndürmeden sallanmadan" daha büyüktür). Sarsıntı olayına odaklanmak, çalma olayına odaklanmak istiyorum. sorununu çözmenin bir yolu var mı?Çalkalama olayını algılamanın sabit bir yolu var mı?

burada

public void onSensorChanged(SensorEvent event) 
    { 
     if (event.sensor.getType() == SensorManager.SENSOR_ACCELEROMETER) 
     { 
      nowTime = System.currentTimeMillis(); 

      float x = event.values[SensorManager.DATA_X]; 
      float y = event.values[SensorManager.DATA_Y]; 
      float z = event.values[SensorManager.DATA_Z]; 
      nowAcc = Math.sqrt(x*x+y*y+z*z); 
      accDiff = Math.abs(nowAcc - preAcc); 
      timeDiff = (nowTime - preTime); 
         // try to get the sum of 10 samplings of accDiff 
      tempAccDiff10 = tempAccDiff9; 
      tempAccDiff9 = tempAccDiff8; 
      tempAccDiff8 = tempAccDiff7; 
      tempAccDiff7 = tempAccDiff6; 
      tempAccDiff6 = tempAccDiff5; 
      tempAccDiff5 = tempAccDiff4; 
      tempAccDiff4 = tempAccDiff3; 
      tempAccDiff3 = tempAccDiff2; 
      tempAccDiff2 = tempAccDiff1; 
      tempAccDiff1 = accDiff; 
      sumAcc = tempAccDiff10+tempAccDiff9+tempAccDiff8+tempAccDiff7+tempAccDiff6+ 
        tempAccDiff5+tempAccDiff4+tempAccDiff3+tempAccDiff2+tempAccDiff1; 
      Log.i("SSSS",String.valueOf(sumAcc)); 
         //when I give the phone a big & continuous "shake", it returns 
         //a value about 30~40, but when I give the phone a small 
         //"rotation", it returns a value of 80~120 
      preAcc = nowAcc; 
      preTime = nowTime; 
      if (sumAcc>100) 
      { 
       SM.unregisterListener(sensorListener, sensor); 
      } 

      //123 
     } 


    }//end of onSensorChanged(); 

o ivmeölçer kullanarak dönme olayını ihmal etmek mümkündür algılama salonu Türkiye'de pot benim kod? Veya oryantasyon değişikliği almayı denemek ve sumAcc bazı hesaplamalar mu?

cevap

3

Yerçekiminin etkisini ortadan kaldırmak için bir filtre kullanmalısınız, bir çeşit tutorial on the docs to do so var. Benzer bir şey yaptım, benim durumumda diğer hareketleri de tespit etmeye çalışıyordum, bu yüzden göreviniz biraz daha basit görünüyor. Kodu pazartesiye gönderebilirim (hatırlarım).

İyi şanslar! Ben cevabı düzenleme ediyorum


Eğer Android 2.3 veya daha yüksek iseniz bir Sensor TYPE_LINEAR_ACCELERATION kullanabilirsiniz ekleyin. Bu, bir sallanma olayını tespit etmek için kesinlikle gerek duymadığınız yer çekiminin etkisini göz ardı eden normal bir hızlanma sensörüdür.

Saygılarımızla


Düzen 13/06 -> yerine, ben bir kod örnek parçalarını verir this link, göndermek için daha iyi bir fikir olduğunu düşünüyorum sallayarak algılamak için kodumu sonrası, ancak söz çeşitli cevaplar. Kodum, oraya gönderilenlerden birine çok benziyor.

İyi şanslar! İstenilen bayraklarla bu sensör

sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); 

Ve kayıt:

public class ShakeActivity extends Activity implements SensorListener 

Bir SensorManager edinmeniz gerekir:

bakış kod açıdan
+0

Tavsiyeniz için teşekkürler! Kodu bekliyorum. Umarım yakında bu sorunu çözebilirim! – Jim31837

+0

Alfa'yı (yüksek geçiş filtresi sabiti) değiştirmeyi denedim, ancak yine de küçük dönen olay büyük sallanmadan daha büyük bir değere neden oluyor. Aslında android 2.2 kullanıyorum .... 2.3 cihaz kullanma şansım varsa lineer hızlanma ölçüm cihazını deneyeceğim – Jim31837

0

, sen SensorListener uygulamak gerekir
ensorMgr.registerListener(this, 
SensorManager.SENSOR_ACCELEROMETER, 
SensorManager.SENSOR_DELAY_GAME); 

OnSensorChange() yönteminizde, sarsılma olup olmadığını belirlersiniz:

private static final int SHAKE_THRESHOLD = 800; 

çalkalama hareketi tespit etmek için bazı başka yöntemler bulunmaktadır: olarak

public void onSensorChanged(int sensor, float[] values) { 
    if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 
    long curTime = System.currentTimeMillis(); 
    // only allow one update every 100ms. 
    if ((curTime - lastUpdate) > 100) { 
     long diffTime = (curTime - lastUpdate); 
     lastUpdate = curTime; 

     x = values[SensorManager.DATA_X]; 
     y = values[SensorManager.DATA_Y]; 
     z = values[SensorManager.DATA_Z]; 

     float speed = Math.abs(x+y+z – last_x – last_y – last_z)/diffTime * 10000; 

     if (speed > SHAKE_THRESHOLD) { 
     Log.d("sensor", "shake detected w/ speed: " + speed); 
     Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show(); 
     } 
     last_x = x; 
     last_y = y; 
     last_z = z; 
    } 
    } 
} 

çalkalama eşik

tanımlanır. Bu link.'a bakın (Bu bağlantı çalışmıyor veya bağlantı kesilirse, look at this web archive.).

Teşekkürler.

İlgili konular