2014-10-06 2 views
1

Я борюсь с частотой дискретизации акселерометра моего приложения. Итак, я решил разработать небольшое приложение только для тестирования частоты дискретизации.Статистика частоты опроса акселерометра Android

Есть ошибки в моем коде? Частота дискретизации в значительной степени меняется: -/

private PowerManager.WakeLock mWakeLock; 
private TextView infotext; 

private SensorManager sensorManager; 
private long nanoNow; 
private long nanoOld; 
private long nanodiffsum=0; 
private int i=0; 
private int values=2000; 
private long[] nanodiff=new long[values]; 

DescriptiveStatistics myDescrStat = new DescriptiveStatistics(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    int tid=android.os.Process.myTid() 
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

    infotext = (TextView) findViewById(R.id.textView); 

    sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE); 
    sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST); 

    final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
    mWakeLock.acquire(); 
    } 

public void onSensorChanged(SensorEvent event){ 
    if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){ 

     if (i==0){ 
     nanoOld=event.timestamp; 
     } 

     if (i == values) { 

     for (int i=1; i<nanodiff.length; i++){ 
      myDescrStat.addValue(nanodiff[i]); 
      nanodiffsum+=nanodiff[i]; 
     } 

     infotext.setText(
      "Average:" + nanodiffsum/values + "ms\n" + " = " + (double) 1000/(nanodiffsum /values) + "Hz" + "\n" + 
        "mean: " + 1000/myDescrStat.getMean() + "\n" + 
        "std:" + 1000/myDescrStat.getStandardDeviation() + "\n" + 
        "max:" + 1000/myDescrStat.getMin() + "\n" + 
        "min:" + 1000/myDescrStat.getMax() + "\n"); 

     mWakeLock.release(); 
     sensorManager.unregisterListener(this); 
     }else{ 
     nanoNow=event.timestamp; 
     nanodiff[i]=(nanoNow-nanoOld)/1000000; 
     if (i%20==0) 
      infotext.setText("Aktuell: " + nanodiff[i] + "ms" + " = " + Math.round((double)1000/ nanodiff[i]) + "Hz"); 
     nanoOld=nanoNow; 
     i++; 

     } 
    } 
} 

Незлые С уважением, Артур

ответ

1

После беглого взгляда на код, я не вижу ничего плохого с ним (за исключением, возможно, переусердствовали обновление приоритета потока , что имеет смысл в тестовом приложении, но я не буду использовать без уважительной причины в фактическом производственном коде).

Что касается неправильной скорости данных в SensorManager в (спойлер Alert: такое же поведение относится и к другим датчиком потоков ;-)), это означает быть таким образом, и с частотой, указанной с SensorManager.SENSOR_DELAY_FASTEST предназначен для быть только намеком (именно по этой причине вы фактически получаете время измерения с такой точностью на каждом событии). Это указано в официальной документации:

rateUs: События датчика скорости передаются по адресу. Это всего лишь намек на систему. События могут быть получены быстрее или медленнее, чем указанная ставка. Обычно события получают быстрее.registerListener reference page

С одной стороны, имейте в виду, что Android является ядром Linux, а linux не является системой реального времени (и, следовательно, не может предоставлять данные с точностью в реальном времени); с другой стороны, Android должен справиться с множеством различных аппаратных реализаций (и сенсорных брендов), поэтому команда разработчиков Android, вероятно, сделала правильный выбор, чтобы избежать каких-либо обязательств относительно соотношения данных датчика.

Таковы мои 50 центов, если вы хотите, чтобы серьезно о программировании Android Sensors Я хотел бы предложить эту книгу:

Professional Android Sensor Programming (Greg Milette, Adam Stroud)

Я читал о 1/4 этого и до сих пор, так хорошо (Я никоим образом не связан с издателем или автором).

Надеюсь, что это поможет

Смежные вопросы