2014-10-06 10 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 데이터의 요철 률 (스포일러 경고 : 같은 문제가 ;-) 다른 센서 스트림에 적용)로서는

, 그렇게 될 운명되고 SensorManager.SENSOR_DELAY_FASTEST 지정된 주파수를 의미 단지 힌트 일뿐입니다 (실제로 각 이벤트에서 그러한 정확도로 측정 시간을받는 이유입니다). 이것은 공식 문서에 명시되어 있습니다 :

rateUs: 속도 센서 이벤트는에서 제공됩니다. 이것은 시스템에 대한 힌트 일뿐입니다. 이벤트가 지정된 속도보다 빠르거나 느릴 수 있습니다. 보통 이벤트는 더 빨리 수신됩니다. 출처 : registerListener reference page

Android는 핵심 Linux이고 Linux는 실시간 시스템이 아니므로 실시간 정확도로 데이터를 제공 할 수 없습니다. 다른면에서, 안드로이드는 많은 다른 하드웨어 구현 (및 센서 브랜드)에 대처해야하므로 안드로이드 개발자 팀은 센서 데이터의 비율에 대한 어떠한 공약도 피하기 위해 현명한 선택을했을 것입니다. (

Professional Android Sensor Programming (Greg Milette, Adam Stroud)

내가 약 1/4 그것의 지금까지를 읽고 너무 좋은 : 당신은 내가이 책을 건의 할 것입니다 안드로이드 센서 프로그래밍에 대한 심각 할 경우

내 50 센트 나는 출판사 나 저자와 아무런 관련이 없다.)

희망이 도움이되었습니다.