【问题标题】:Android sampling rates variation of hardware Sensors on Nexus 6PNexus 6P 上硬件传感器的 Android 采样率变化
【发布时间】:2019-03-06 11:25:26
【问题描述】:

我正在开发一个 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);
}

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

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

【问题讨论】:

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


    【解决方案1】:

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

    以上所有的操作都让我得到了相当不错的结果,但由于硬件的差异,它永远不会完美。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多