2011-06-11 4 views
5

나는 가속도계를 사용하여 떨림을 감지하려고 노력했다. 나는 휴대 전화에 연속 흔들기를 할 때 가속도 값 차이 이 상당히 안정하다는 것을 발견했다. 그러나 전화를 돌릴 때 항상 값에 큰 변화가 있습니다 (이 값은 보통 "흔들림없이 흔들림"보다 큽니다). 회전 이벤트가 아니라 흔들기 이벤트에 집중하고 싶습니다. 문제를 해결하는 방법이 있습니까?떨리는 이벤트를 감지하는 안정적인 방법이 있습니까?

여기

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(); 

은 가속도계를 사용하여 회전 이벤트를 무시하는 것이 가능 감지 shaing 내 코드입니까? 또는 방향 변경을 수행하고 sumAcc에서 계산을 수행해야합니까? ?

답변

3

중력의 영향을 제거하기 위해 필터를 사용해야합니다. 어떤 종류의 tutorial on the docs to do so이 있습니다. 저는 비슷한 것을했습니다. 제 경우에는 다른 움직임을 감지하려고 했으므로 작업이 조금 더 단순 해 보입니다. 다음 월요일에 코드를 게시 할 수 있습니다 (기억한다면).

행운을 빈다. 내가 대답을 편집하고있어


당신은 안드로이드 2.3 이상에 있다면 당신은 Sensor TYPE_LINEAR_ACCELERATION을 사용할 수 있습니다 추가 할 수 있습니다. 그것은 흔들림 이벤트를 감지 할 필요가없는 중력의 효과를 버리는 일반 가속도 센서입니다.

관련


편집 13/06 -> 내가 대신, 나는 코드의 샘플 조각을 제공 this link을 게시 할 수있는 더 좋은 아이디어라고 생각 흔들림 감지하는 내 코드를 게시,하지만 약속 다양한 응답. 내 코드는 거기에 게시 된 코드 중 하나와 매우 유사합니다.

행운을 빈다. 원하는 플래그와이 센서를

sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); 

그리고 등록 :

public class ShakeActivity extends Activity implements SensorListener 

당신은 SensorManager을 취득해야합니다

보기의 코드 포인트에서
+0

귀하의 조언에 감사드립니다. 나는 그 코드를 기대하고있다. 곧이 문제를 해결할 수 있기를 바랍니다. – Jim31837

+0

알파 (고역 필터 상수)를 변경하려고 시도했지만 여전히 작은 회전 이벤트가 큰 떨림보다 큰 값으로 나타납니다. 실제로 나는 안드로이드 2.2를 사용하고 있습니다 .... 2.3 장치를 사용할 기회가 있다면 선형 가속 계기를 사용해 보겠습니다. – Jim31837

0

, 당신은 SensorListener를 구현해야
ensorMgr.registerListener(this, 
SensorManager.SENSOR_ACCELEROMETER, 
SensorManager.SENSOR_DELAY_GAME); 

onSensorChange() 메서드에서 흔들기 여부를 결정합니다.

private static final int SHAKE_THRESHOLD = 800; 

가 흔들 움직임을 감지 너무 다른 방법이있다 :로

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; 
    } 
    } 
} 

손떨림 임계 값

정의된다. 이 link.을보십시오 (해당 링크가 작동하지 않거나 링크가 작동하지 않는 경우 look at this web archive).

감사합니다.

관련 문제