繁体   English   中英

Android SensorEvent时间戳记常量

[英]Android SensorEvent Timestamp constant

我目前正在编写一个简单的android应用程序,以计算设备imu的偏差。 在执行此操作时,我遇到了event.timestamp值的问题

使用代码:

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

Android参考指南中的示例中,根据四元数计算旋转矩阵。

当我使用Galaxy Nexus-S运行代码时,两次测量之间的dT为0.06〜0.07秒,但是当我在LG Nexus 4或Nexus 7上运行相同的代码时,dT始终为0。我知道这个问题, Android SensorEvent时间戳问题是Nexus 7时间戳是unix时间戳,但连续测量之间的差值不应该始终为零。 Nexus 4和Nexus 7都具有相同的IMU,这可能是从IMU创建时间戳的过程中的错误吗?

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

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

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

这些事件未更改地存储在数组中。

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

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功能,只需继续并将其插入完整版本即可。

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

还要注意有关SensorEventListener的onSensorChanged-方法的文档:

注意:该应用程序不拥有作为参数传递的事件对象,因此无法保留该对象。 该对象可以是内部池的一部分,并且可以由框架重用。

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

...这表明不应保存对SensorEvent对象的引用。

如果您从此处复制了代码段,请注意它有一个错误。 需要更换

private float timestamp;

private long timestamp;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM