5

加速度計を使用して揺れイベントを検出しようとしました。携帯電話を連続して振ると、加速度の値の差がかなり安定することがわかりました。しかし、電話を回転させると、常に値が大きく変化します (値は通常、「回転せずに振る」よりも大きくなります)。回転イベントではなく、揺れイベントに注目したい。問題を解決する方法はありますか?

これがshaing検出のための私のコードです

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

加速度計を使用して回転イベントを無視することは可能ですか? または、方向の変更を取得して、sumAcc で計算を行う必要がありますか?

4

2 に答える 2

3

フィルターを使用して重力の影響を排除する必要があります。ドキュメントには、そうするためのチュートリアルがあります。私の場合、他の動きも検出しようとしていたので、あなたの仕事は少し簡単に見えます。来週の月曜日にコードを投稿できます (覚えていれば)。

幸運を!


Android 2.3以降を使用している場合は、センサーTYPE_LINEAR_ACCELERATIONを使用できることを追加するために回答を編集しています。これは、重力の影響を無視する通常の加速度センサーであり、揺れイベントを検出する必要はありません。

よろしく


2006 年 13 月編集 -> 揺れを検出するためにコードを投稿することを約束しましたが、代わりに、さまざまな応答でコードのサンプルを提供するこのリンクを投稿することをお勧めします。私のコードは、そこに投稿されたものの 1 つと非常によく似ています。

幸運を!

于 2011-06-11T16:21:18.027 に答える
1

コードの観点からは、SensorListener を実装する必要があります。

public class ShakeActivity extends Activity implements SensorListener

SensorManager を取得する必要があります。

sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

そして、このセンサーを目的のフラグに登録します。

ensorMgr.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_GAME);

onSensorChange() メソッドで、揺れかどうかを判断します。

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

揺れの閾値は次のように定義されます。

private static final int SHAKE_THRESHOLD = 800;

手ぶれの動きを検出するには、他にもいくつかの方法があります。このリンクを見てください。(そのリンクが機能しない場合、またはリンクが無効になっている場合は、この Web アーカイブを参照してください。)

ありがとう。

于 2014-02-17T03:13:44.730 に答える