Android加速度计采样率统计

时间:2014-10-06 20:10:09

标签: android accelerometer wakelock

我正在努力应对我的应用的加速度计采样率。 所以我决定开发一个小应用程序,仅用于测试采样率。

我的代码有错误吗?采样率几乎在变化: - /

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 个答案:

答案 0 :(得分:1)

粗略地看一下你的代码后,我看不出它有什么问题(除了可能是线程优先级的过度更新,这在测试应用程序中是有意义的,但在实际的生产代码中没有充分的理由我不会使用)

对于SensorManager数据的不规则速率(扰流警报:,同样的行为适用于其他传感器流;-)),它的意思是这样,并指定频率SensorManager.SENSOR_DELAY_FASTEST仅仅是一个提示(这就是为什么实际上你在每个事件中都能获得如此精确的测量时间的原因)。这在官方文档中说明:

rateUs :速率传感器事件在。这只是对系统的暗示。 可以比指定的速率更快或更慢地接收事件。通常会更快收到事件。来源:registerListener reference page

一方面,请记住,Android是Linux的核心,而linux不是实时系统(因此无法提供实时准确的数据);另一方面, Android必须应对许多不同的硬件实现(和传感器品牌),因此Android开发团队可能做出明智的选择,以避免任何关于比例的承诺传感器数据。

这些是我的50美分,如果你想认真对待Android Sensors编程我会建议这本书:

Professional Android Sensor Programming (Greg Milette, Adam Stroud)

我读了大约四分之一,到目前为止,非常好(我与出版商或作者无关)。

希望这有帮助