1

Androidデバイスの方向を取得するAndroidアプリケーションを開発しています。

以下のコードを使用しています。

 public class AccelerometerDirection  extends Activity implements SensorEventListener {
    TextView textView;
    StringBuilder builder = new StringBuilder();

    float [] history = new float[2];
    String [] direction = {"NONE","NONE"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        setContentView(textView);

        SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
        manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        float xChange = history[0] - event.values[0];
        float yChange = history[1] - event.values[1];

        history[0] = event.values[0];
        history[1] = event.values[1];

        if (xChange > 2){
          direction[0] = "LEFT";
        }
        else if (xChange < -2){
          direction[0] = "RIGHT";
        }

        if (yChange > 2){
          direction[1] = "DOWN";
        }
        else if (yChange < -2){
          direction[1] = "UP";
        }

        builder.setLength(0);
        builder.append("x: ");
        builder.append(direction[0]);
        builder.append(" y: ");
        builder.append(direction[1]);

        textView.setText(builder.toString());
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // nothing to do here
    }
}

this を参照して、加速度計を使用して移動方向を取得するにはどうすればよいですか? .

しかし、作業は恐ろしく、正確な値が得られません。さまざまな定数値で試しましたが、使用できません。アイデアを共有してください。

4

1 に答える 1

1

この線は、さまざまなデバイスの50HZまたは100Hzの非常に高い周波数での値を示します

manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);

したがって、読み取り加速度計はあまり正確ではないため、デバイスが静止しているときでも、読み取りごとに出力が変化します。

したがって、ローパスフィルターで読み取り値をフィルター処理するか、より低い周波数(1 HZなど)で読み取り値を使用します。

manager.registerListener(this, accelerometer, 1000000);

しかし、ローパスフィルターはスムーズな動作を得るための最良のオプションです

于 2013-01-15T21:36:42.657 に答える