首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nexus 6P上硬件传感器的Android采样率变化

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

Stack Overflow用户
提问于 2018-10-01 10:57:12
回答 1查看 259关注 0票数 4

我正在开发一个用于研究的安卓应用程序,我正在读取几个传感器数据,如加速度计、陀螺仪、气压计等。所以我有4台Nexus6P设备,所有设备都配备了最新的工厂形象,而且刚安装时没有安装任何其他应用程序,只需安装一次预装的标准程序。因此,现在出现的问题是,其中一部手机一直落后,例如,我记录了加速度计105赫兹半小时(加速度计的最大可能频率是400赫兹),只是为了确保至少得到100赫兹的样本量,结果如下:

100 at -> 180000采样半小时

105 at -> 189000样品采样半小时

(这只是加速度计的一个例子,但是每个设备上的其他传感器都是一样的。因此,设备1,3,4在其他传感器上获得相同的好结果,而设备2在所有其他传感器上得到相同的坏结果)。

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

因此,问题是在第2号设备上,我丢失了将近3000个样本(我知道这在很大程度上是个痛处),而我对这个问题的猜测是,这可能与硬件有关。这可能是一个性能问题,我可能可以排除,因为它不重要的是,有多少传感器,阅读和读取在400赫兹的预期(如果需要,我也可以提供这方面的样本)。我还试着将采样率设置为400 to,以便最快,然后根据导致相同结果的时间戳进行录音。

因此,万一我将提供如何注册传感器侦听器:

代码语言:javascript
复制
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);
}

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 21:37:43

我经常使用Android传感器,我可以告诉你硬件的质量是可变的。我通常使用一个过滤器,如果我需要的结果是一致的手机:

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

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

它还可以帮助确保您正在执行的任何文件写入都是在线程之外完成的,并且是分批完成的,因为向文件写入是一项昂贵的操作。

代码语言:javascript
复制
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();

            }

做以上所有这些都给我带来了相当好的结果,但是由于硬件上的差异,它永远不会是完美的。

祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52589631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档