重力传感器数值增加

4

onSensorChanged(SensorEvent event)被调用后,重力传感器值会增加。该事件的值会随着时间的推移而增加,并在一段时间后(大约1分钟)达到NaN值。有人能解释一下为什么会出现这种情况吗?

private void recordData(SensorEvent e) {
    String label;
    int currentSensorId = -1;
    switch (e.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        currentSensorId = 0;
        label = LOG_LABEL_ACCELEROMETER;
        break;
    case Sensor.TYPE_GYROSCOPE:
        label = LOG_LABEL_GYROSCOPER;
        currentSensorId = 1;
        break;
    case Sensor.TYPE_GRAVITY:
        label = LOG_LABEL_GRAVITY;
        currentSensorId = 2;
        break;
    case Sensor.TYPE_ROTATION_VECTOR:
        label = LOG_LABEL_ROTATION_VECTOR;
        currentSensorId = 3;
        break;
    default:
        label = "UNKNOWN SENSOR TYPE!";
        break;
    }
    if (currentSensorId == -1)
        return;

    // Force set events frequency to value from config,
    // cause sensor events minimal frequency = 0.2 sec.
    timePassed[currentSensorId] = System.currentTimeMillis()
            - lastSensorEventTime[currentSensorId];
    if (timePassed[currentSensorId] < Config.SENSOR_DELAY_MILLISEC) {
        return;
    } else {
        lastSensorEventTime[currentSensorId] = System.currentTimeMillis();
    }

    if (this.pauseRecordingData || checkSDCardMemory())
        return;
    fileWriter.writeEvent(label, System.currentTimeMillis(), e.values);
}

public void writeEvent(String eventSource, long timestamp, float[] values) {
        Log.d(TAG, "writeEvent(); eventSource = " + eventSource);       


    if ( !this.fileExists ) createNewFile();        
    try {       
        String valuesString = eventSource + "\t" + String.format( "%d\t", timestamp);

        for (int i = 0; i < values.length; i++) {
            valuesString += String.format( "%f\t",values[i]);
            Log.d(TAG, "writeEvent(); values[" + i + "] = " + values[i]);
    }           
        buffWriter.append(valuesString + "\n");
    } catch (IOException e1) {              
          e1.printStackTrace();
          Log.d(TAG,"RECORDING EVENT TO FILE FAILED!");
    }               
}

4
能否提供一些简短的代码示例?你试用过多台设备吗?该数值何时被重置? - Tobias Ritzau
你能否发布使用event.values元素的代码? - njzk2
1个回答

0

有两种可能性:

  1. 最有可能的是:您的代码存在错误,例如,您从未重置变量或对值进行加法运算(有关详细信息,请阅读http://developer.android.com/guide/topics/sensors/sensors_motion.html)。

  2. 您的重力传感器已损坏(要检查,请在另一台设备上尝试)。

如需更多帮助,请发布您的代码,以及您如何访问和管理从重力传感器读取的值。

编辑:

正如我所提到的,您的代码中存在错误。传感器读取延迟应设置为可能的选项之一:

int     SENSOR_DELAY_FASTEST     get sensor data as fast as possible
int     SENSOR_DELAY_GAME        rate suitable for games
int     SENSOR_DELAY_NORMAL      rate (default) suitable for screen orientation changes
int     SENSOR_DELAY_UI          rate suitable for the user interface 

而不是自定义值!!!

感谢您找到解决方案。


但是你是如何收集这些值的呢?你的应用程序在后台运行吗? - Milos Cuculovic
这是使用值之前的代码,但效果相同。 public synchronized void onSensorChanged(SensorEvent event) { Log.d(TAG, "onSensorChanged: " + event.sensor.getName()); float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; Log.d(TAG, "onSensorChanged; \nx = " + x +"\n y = " + y + "\n z = " + z); recordData(event); } - Sergio
问题在于我在mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), 500000); 中使用了自定义延迟值。 - Sergio
1
可能它不起作用。需要使用常量SensorManager.SENSOR_DELAY_UI或其他常量。 - Sergio
哦,是的,你需要使用其中一个延迟:SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME、SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI。很好,你自己找到了解决方案。如果可以,请添加一个新答案,或者我可以编辑我的答案以提供更多精确信息。 - Milos Cuculovic
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接