получить ускорение без гравитации - PullRequest
3 голосов
/ 06 марта 2012

Я новичок в разработке Android.Я хочу получить фактическое ускорение телефона. Я нашел код для ускорения. Но он дает ускорение с силой тяжести.Пожалуйста, помогите мне найти способ получить фактическое ускорение без гравитации.Вот код, который я нашел ,, Пожалуйста, помогите мне с этим кодом.спасибо

    package com.SensorTest;

    import android.app.Activity;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.widget.TextView;


    public class SensorTestActivity extends Activity implements SensorEventListener {

    SensorManager sensorManager = null;

    //for accelerometer values
    TextView outputX;
    TextView outputY;
    TextView outputZ;

    //for orientation values
    TextView outputX2;
    TextView outputY2;
    TextView outputZ2;

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        setContentView(R.layout.main);

        //just some textviews, for data output
        outputX = (TextView) findViewById(R.id.TextView01);
        outputY = (TextView) findViewById(R.id.TextView02);
        outputZ = (TextView) findViewById(R.id.TextView03);

        outputX2 = (TextView) findViewById(R.id.TextView04);
        outputY2 = (TextView) findViewById(R.id.TextView05);
        outputZ2 = (TextView) findViewById(R.id.TextView06);


     }


    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
        // TODO Auto-generated method stub

    }

 @Override
 public void onSensorChanged(SensorEvent event) {
synchronized (this) {
    switch (event.sensor.getType()){
        case Sensor.TYPE_ACCELEROMETER:
            outputX.setText("acclaration x:"+Float.toString(event.values[0]));
            outputY.setText("acclaration y:"+Float.toString(event.values[1]));
            outputZ.setText("acclaration z:"+Float.toString(event.values[2]));
        break;
    case Sensor.TYPE_ORIENTATION:
            outputX2.setText("orientation x:"+Float.toString(event.values[0]));
            outputY2.setText("orientation y:"+Float.toString(event.values[1]));
            outputZ2.setText("orientation z:"+Float.toString(event.values[2]));
    break;

            }
        }
    }


    @Override
    protected void onResume() {
       super.onResume();
       sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), sensorManager.SENSOR_DELAY_GAME);
       sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), sensorManager.SENSOR_DELAY_GAME);
    }

    }

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Невозможно получить ускорение напрямую без гравитации.

Вы можете использовать фильтр высоких частот, как на Справочной странице Android , в разделе Sensor.TYPE_ACCELEROMETER:

public void onSensorChanged(SensorEvent event) {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }
1 голос
/ 15 апреля 2013

Повторяющийся вопрос: Android удаляет гравитацию из показаний акселерометра

Ответ использует Sensor.TYPE_LINEAR_ACCELERATION (API> = 9 примерно для 99% всех устройств Android).

0 голосов
/ 27 марта 2014

Почему бы не вычесть значения гравитации непосредственно из наблюдаемого ускорения с помощью датчика Android.Я думаю, что это более простой способ.Если за использование фильтра верхних частот есть какая-то конкретная причина, сообщите мне, пожалуйста, со ссылкой на сопроводительный документ или технический документ.Спасибо Раджив

0 голосов
/ 06 марта 2012

Ответ здесь: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

Цитата:

В частности, сила тяжести всегда влияет на измеряемое ускорение: Ad = -g - ∑F / масса

По этой причине, когда устройство сидит на столе (и, очевидно, не ускоряется), акселерометр считывает величину g = 9,81 м / с ^ 2

Аналогично, когда устройство находится всвободного падения и, следовательно, опасно ускоряющегося к земле со скоростью 9,81 м / с ^ 2, его акселерометр показывает величину 0 м / с ^ 2.

Должно быть очевидно, что для измерения реального ускоренияустройство, вклад силы тяжести должен быть устранен.Это может быть достигнуто путем применения фильтра верхних частот.И наоборот, фильтр низких частот можно использовать для изоляции силы тяжести.

public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }
...