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

2024-01-28

我正在开发一个 Android 应用程序,用于研究,并且正在读取多个传感器数据,例如加速度计、陀螺仪、气压计等。 所以我有 4 台 Nexus 6P 设备,全部配备最新版本工厂形象 https://developers.google.com/android/images并且全新设置,除了预安装的标准应用程序外,没有安装其他应用程序。 所以现在出现的问题是其中一部手机不断落后,因此例如我以 105 Hz 的频率记录加速度计半小时(因此加速度计的最大可能速率为 400Hz),只是为了确保我得到至少大约是我期望的 100Hz 的样本量,结果如下:

以 100 Hz 采样半小时 -> 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);
}

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

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


我经常使用 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();

            }

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

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐