Android SensorEvent时间戳常量

时间:2013-02-12 21:52:22

标签: android timestamp unix-timestamp android-sensors nexus-4

我正在编写一个简单的Android应用程序来计算设备imu的偏差。在这样做时,我遇到了event.timestamp

的值的问题

使用代码:

float dT = (event.timestamp-accel_timestamp)*NS2S;

来自Android Reference Guide的示例来计算四元数的旋转矩阵。

当我使用Galaxy Nexus-S运行代码时,我在测量之间得到0.06~0.07秒的dT但是当我在LG Nexus 4或Nexus 7上运行相同的代码时,dT始终为0.我知道问题Android SensorEvent timestamp issue表示Nexus 7时间戳是一个unix时间戳,但连续测量之间的差异不应该总是为零。 Nexus 4和Nexus 7都有相同的IMU,这可能是IMU创建时间戳的错误吗?

3 个答案:

答案 0 :(得分:1)

哇,好吧这肯定是个错误!

每个SensorEvent的时间戳都被覆盖,好像它是一个静态变量......

当我在事件发生时记录时间戳的字符串时,所有值都不同。

事件存储在一个未更改的数组中。

数组中的每个SensorEvent现在都具有相同的时间戳,但值数组仍然不同(即,它们不是同一个对象并包含不同的信息......除了时间戳)。

Google / HTC,请返回我生命中的3个小时!

除非有人能解释这种行为,否则我会提交错误报告。它当然没有在API中记录。

与此同时,试用此解决方案

import android.hardware.Sensor;
import android.hardware.SensorEvent;

public class UnbrokenSensorEvent {
    public long timestamp;
    public float[] values;
    public Sensor sensor;

    public UnbrokenSensorEvent(SensorEvent event){
        this.timestamp = event.timestamp;
        this.values = event.values;
        this.sensor = event.sensor;
    }
}

然后在你的听众中做这样的事情:

ArrayList<UnbrokenSensorEvent> results = new ArrayList<UnbrokenSensorEvent>();

public void onSensorChanged(SensorEvent event) {
    results.add(new UnbrokenSensorEvent(event));
}

重构应该非常简单,因为SensorEvent和UnbrokenSensorEvent具有相同的公共字段。如果您需要使用其他SensorEvent功能,请继续将其放入Unbroken版本中。

这很hacky,但恕我直言,快速破解总是比等待API更新更好!

答案 1 :(得分:1)

另请注意有关SensorEventListener的onSensorChanged -method的文档:

  

注意:应用程序不拥有作为a传递的事件对象   参数因此无法坚持下去。对象可能是一部分   内部池,可以由框架重用。

在此处找到:http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged%28android.hardware.SensorEvent%29

...这表明不应该持有对SensorEvent -objects的引用。

答案 2 :(得分:0)

如果您从here复制了代码段 注意它有一个bug。 需要更换

private float timestamp;

private long timestamp;

在其他情况下,您的增量时间将始终包含奇怪的值