Android加速度计采样率统计

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

        }
    }
}

谨致问候, 亚瑟

最佳答案

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

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

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

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

这是我的 50 美分,如果你想认真学习 Android 传感器编程,我会推荐这本书:

Professional Android Sensor Programming (Greg Milette, Adam Stroud)

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

希望对你有帮助

关于Android加速度计采样率统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26224068/

相关文章:

与加速度计接口(interface)时的 C 段错误

java - 如何获取设备原始宽度和高度或实际屏幕宽度和高度?

android - 计算移动设备线性运动(Android)

android - 将 Android OpenGL 过滤器重写为 Metal(用于 CIFilter)

c++ - 方向传感器的 Windows Sensor API C++ COM 集成未在 Windows 10 上定期更新

android - 如何使用 PowerManager.ACQUIRE_CAUSES_WAKEUP

android - 是否可以持有多个唤醒锁?

android - android什么时候会在没有唤醒锁的情况下停止它的cpu?

java - Marshmallow 上的 getSerial() 方法

android - 在最后一步使用 HoloEverywhere 时出错