Почему я не могу изменить задержку при сборе акселерометра? Android одежда - PullRequest
0 голосов
/ 17 января 2019

В исследовательском проекте, над которым я работаю, мне необходимо собирать данные акселерометра с часов на андроиде (я использую Asus ZenWatch 3, если это помогает), но проблема в том, что, независимо от задержки, я укажите, что я всегда получаю 100 событий в секунду или 100 Гц.

Я попытался изменить задержку с SensorManager.SENSOR_DELAY_NORMAL на SensorManager.SENSOR_DELAY_GAME, SensorManager.SENSOR_DELAY_UI, SensorManager.SENSOR_DELAY_FASTEST и даже вручную указать задержку в 20000000 и аналогичные значения в микросекундах. Независимо от того, что я указываю задержку, поскольку она продолжает поставлять со скоростью 100 Гц. Я урезал свой код, чтобы кратко показать, что я сделал. Что я делаю не так?

Изменить: В качестве ссылки я использовал https://developer.android.com/guide/topics/sensors/sensors_overview#java в качестве ссылки для этого проекта. В нем говорится, что задержка SENSOR_DELAY_NORMAL должна составлять 200 000 мс, хотя в моих тестах это не то, что я получаю.

открытый класс MainActivity расширяет WearableActivity, реализует SensorEventListener {

private ExecutorService cachedPool;
private LinkedList<String> xyzValues = new LinkedList<>();
private final String TAG = MainActivity.class.getName(),DELIM = ",";
private SensorManager mSensorManager;
private byte[] bytes;
private Estimator estimator;
private int puffNum = 0,sessionNum = 0,num = 0, BATCH_SIZE = 500, SENSOR_DELAY = 20000000;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    cachedPool = Executors.newCachedThreadPool(); //part of delivering messages to the phone.

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //Keeps the app working - no screen off

    initSensors();
}
private void initSensors()
{
    try
    {
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        if(mSensorManager != null) 
        {
            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
    }
    catch(NullPointerException e)
    {
        Log.d(TAG,"FATAL ERROR in initSensors: "+e.getMessage());
    }
}
@Override
public void onSensorChanged(SensorEvent event) //Current sampling rate is 100HZ, taking every 4th point gives 25Hz
{
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        //changes event.timestamp to human readable time.
        String xyzValue = dateFormatted + DELIM + event.values[0] + DELIM + event.values[1] + DELIM + event.values[2] + DELIM + puffNum + DELIM + sessionNum;
        xyzValues.add(xyzValue);
        Log.d(TAG,"xyzValues size:" +xyzValues.size());
        if(xyzValues.size() >= BATCH_SIZE)
        {
            //do the stuff I need such as transmit data
            xyzValues.clear();
        }
    }
}

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
    //do something with this
}
@Override
protected void onResume()
{
    super.onResume();
    mSensorManager.registerListener(this, mSensor,SENSOR_DELAY);
    mGoogleApiClient.connect();
}
@Override
protected void onPause()
{
    super.onPause();
    mSensorManager.unregisterListener(this);
    mGoogleApiClient.disconnect();
}

}

1 Ответ

0 голосов
/ 18 января 2019

Значения задержки не всегда соблюдаются. Из документации :

samplingPeriodUs int : ... Это только подсказка системе. События могут быть получены быстрее или медленнее, чем указанная скорость. Обычно события принимаются быстрее ...

...