frecuencias de muestreo Android variación de sensores de hardware de Nexus 6P

Timm L:

Estoy desarrollando una aplicación para Android, para una investigación, y estoy de leer varios datos de sensores como acelerómetro, giroscopio, barómetro, etc. Así que tengo 4 dispositivos Nexus 6P todos con la más nueva imagen de fábrica y recién creados con ninguna otra aplicación instalada que la estándar vez, que son pre-instalado. Así que el problema que se presenta ahora es que uno de los teléfonos está constantemente a la zaga, así que por ejemplo conste que durante media hora el acelerómetro a 105 Hz (por lo que la tasa máxima posible para el acelerómetro es 400Hz), sólo para asegurarse de que consigo al menos aproximadamente la cantidad de muestras que esperaría de 100 Hz y los resultados son los siguientes:

Smapling durante media hora a 100 Hz -> 180000 Muestras

Smapling durante media hora a 105Hz -> 189000 Muestras

(Esto es ahora sólo un ejemplo para el acelerómetro, pero es el mismo para cualquier otro sensor en cada dispositivo. Dispositivo para obtener 1,3,4 sobre los mismos buenos resultados para otros senors mientras que el dispositivo 2 obtiene los mismos malos resultados en todos los otros sensores ).

  • El dispositivo 1: 180000 muestras
  • El dispositivo 2: 177273 Las muestras <- el teléfono que va a la zaga
  • Dispositivo 3: 181800 muestras
  • Dispositivo 4: 179412 muestras

Así que el problema está en el número 2, donde el dispositivo que me falta casi 3000 muestras (sé que esto está llorando en un nivel alto) y mi conjetura para este problema es que es probablemente relacionado con el hardware. Que podría ser un problema de rendimiento es probable que pueda descartar, ya que no importa cuántos sensores im lectura y también leerlos a 400 Hz funciona como se espera (si lo desea también puede ofrecer un Las muestras para esto también). También traté de establecer la velocidad de muestreo de 400 Hz por lo que el más rápido y luego tomar grabaciones de acuerdo a la marca de tiempo que llevó al mismo resultado.

Así que por si acaso voy a proporcionar cómo registrar el detector del sensor:

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

Así que lo que quiero es conseguir al menos aproximadamente la cantidad de muestras que debo esperar por lo anterior es ningún problema y sólo un poco más adelante también es aceptable. Así que si alguien tiene una idea de lo más que pueda probar o lo que puede causar el problema estaría muy agradecido.

Este es mi primer post así que si falta algo o si he explicado algo de una manera mal lo siento y hago lo mejor para solucionarlo.

Geordie mechas

Yo trabajo con Android sensores mucho, y te puedo decir que el hardware es de calidad variable. Yo suelo usar un filtro si necesito que los resultados sean consistentes a través de los teléfonos:

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

Sin embargo esto significa que sólo se pueden establecer los móviles para que coincida con el denominador común más bajo. Si se ayuda me parece que cada vez más que 25 Hz es demasiado para la mayoría de aplicaciones, incluso los médicos.

Puede también ayuda a asegurarse de que cualquier archivo escribe que está haciendo se realizan fuera de hilo, y en lotes, como escribir en el archivo es una operación costosa.

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

            }

Haciendo todos los resultados razonablemente buenos por encima de mí tiene, pero nunca será perfecto debido a diferencias en el hardware.

¡Buena suerte!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192461&siteId=1
Recomendado
Clasificación