【问题标题】:Android accelerometer sampling rate statisticAndroid 加速度计采样率统计
【发布时间】:2014-10-07 15:13:14
【问题描述】:

我正在为我的应用的加速度计采样率而苦苦挣扎。 所以我决定开发一个小应用程序来测试采样率。

我的代码有错误吗?采样率变化很大:-/

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++;

        }
    }
}

谨此, 亚瑟

【问题讨论】:

    标签: android accelerometer wakelock


    【解决方案1】:

    粗略查看您的代码后,我看不出有任何问题(除了线程优先级的过度更新,这在测试应用程序中是有意义的,但在实际生产代码中没有充分理由我不会使用) .

    至于 SensorManager 数据的不规则速率(剧透警告:相同的行为适用于其他传感器流 ;-)),它的意思是这样,并且使用指定的频率SensorManager.SENSOR_DELAY_FASTEST 只是一个提示(这就是为什么您实际上在每个事件中都会收到如此准确的测量时间的原因)。这在官方文档中有说明:

    rateUs :发送速率传感器事件。这只是对系统的提示。 事件的接收速度可能比指定的速率快或慢。通常事件接收更快。 来源:registerListener reference page

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

    这是我的 50 美分,如果您想认真对待 Android 传感器编程,我建议您阅读这本书:

    Professional Android Sensor Programming (Greg Milette, Adam Stroud)

    我读了大约 1/4,到目前为止,很好(我与出版商或作者没有任何关系)。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多