Nexus 6P上Android硬件传感器的采样率变化

时间:2018-10-01 10:57:12

标签: java android android-sensors sampling nexus-6p

我正在开发一个Android应用程序以进行研究,并即时读取多个传感器数据,例如加速度计,陀螺仪,气压计等。 因此,我有4台Nexus 6P设备,它们都装有最新的Factory Image,并且是刚安装的,没有安装过除标准版(预安装)之外的其他应用。 因此,现在出现的问题是其中一部手机一直处于落后状态,因此,例如,我以105 Hz的频率记录了半小时的加速度计(因此,加速度计的最大可能速率为400Hz),只是为了确保我能至少大约是我期望的100Hz采样数量,结果如下:

以100Hz采样半小时-> 180000个采样

以105Hz采样半小时-> 189000个采样

(这只是加速度计的一个示例,但每个设备上的每个其他传感器都是相同的。因此,设备1,3,4对于其他传感器可获得相同的好结果,而设备2则得到相同的不良结果。所有其他传感器)。

  • 设备1:180000个样本
  • 设备2:177273采样<-落后的手机
  • 设备3:181800个样本
  • 设备4:179412个样本

所以问题出在2号设备上,我缺少了将近3000个样本(我知道这是高水平的哭泣),我对此问题的猜测是可能与硬件有关。我可能会排除这可能是性能问题,因为无论有多少传感器正在读取并以400Hz的频率读取它们,都可以按预期工作(如果需要,我也可以提供样本)。我还尝试将采样率设置为400Hz,以使其达到最快,然后根据时间戳进行记录,从而得到相同的结果。

以防万一,我将提供注册传感器侦听器的方式:

protected void onCreate(Bundle savedInstanceState){
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    unaccDataSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER_UNCALIBRATED);
}
....
private void Start(){
    sensorManager.registerListener(unaccDataListener, unaccDataSensor, 10000);
}

所以我想要得到的至少是我应该期望的样本数量,因此上面没有问题,仅低于一点点也是可以接受的。 因此,如果有人对我可以尝试的其他方法或可能导致问题的方法有所了解,我将非常感激。

这是我的第一篇文章,因此,如果缺少任何内容,或者我以不好的方式解释了某些内容,对不起,我会尽力解决。

1 个答案:

答案 0 :(得分:2)

我经常使用Android传感器工作,我可以告诉您硬件质量参差不齐。如果需要在手机之间保持一致的结果,通常会使用过滤器:

// Filter to remove readings that come too often
        if (TS < LAST_TS_ACC + 100) {
            //Log.d(TAG, "onSensorChanged: skipping");
            return;
        }

但是,这意味着您只能将手机设置为与最低公分母匹配。如果有帮助,我发现对于大多数应用程序,甚至是医疗应用程序,超过25hz都是过大的。

由于写入文件是一项昂贵的操作,因此它还可以帮助确保正在执行的所有文件写操作都是在线程外进行的,并且是分批进行的。

accelBuffer = new StringBuilder();
accelBuffer.append(LAST_TS_ACC + "," + event.values[0] + "," + event.values[1] + "," + event.values[2] + "\n");

if((accelBuffer.length() > 500000) && (writingAccelToFile == false) ){
                writingAccelToFile = true;

                AccelFile = new File(path2 +"/Acc/"  + LAST_TS_ACC +"_Service.txt");
                Log.d(TAG, "onSensorChanged: accelfile created at : " + AccelFile.getPath());

                File parent = AccelFile.getParentFile();
                if(!parent.exists() && !parent.mkdirs()){
                    throw new IllegalStateException("Couldn't create directory: " + parent);
                }

                //Try threading to take of UI thread

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //Log.d(TAG, "onSensorChanged: in accelbuffer");
                        // Log.d(TAG, "run: in runnable");
                        //writeToStream(accelBuffer);
                        writeStringBuilderToFile(AccelFile, accelBuffer);
                        accelBuffer.setLength(0);
                        writingAccelToFile = false;

                    }
                }).start();

            }

以上所有操作都给我带来了不错的效果,但是由于硬件的不同,它永远不会是完美的。

祝你好运!