4

我正在开发一个 Android 应用程序,用于研究,并且我正在读取几个传感器数据,如加速度计、陀螺仪、气压计等。所以我有 4 台 Nexus 6P 设备,所有设备都安装了最新的出厂映像,并且除了安装其他应用程序之外,没有安装其他应用程序。预先安装的标准一次。所以现在出现的问题是其中一部手机一直落后,所以例如我以 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);
}

所以我想要的是至少得到我应该期望的样本数量,所以上面没有问题,稍微低于一点也是可以接受的。因此,如果有人知道我还可以尝试什么或可能导致问题的原因,我将非常感激。

这是我的第一篇文章,所以如果有什么遗漏或者我解释的不好,我很抱歉,我会尽力修复它。

4

1 回答 1

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();

            }

完成以上所有工作给我带来了相当不错的结果,但由于硬件的差异,它永远不会是完美的。

祝你好运!

于 2018-10-04T21:37:43.887 回答