Android SensorEvent 时间戳常量

4

我目前正在编写一个简单的安卓应用程序,用于计算设备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 timestamp issue,即Nexus 7时间戳是Unix时间戳,但连续测量之间的差异不应始终为零。 Nexus 4和Nexus 7都有相同的IMU,这可能是如何从IMU创建时间戳的错误吗?


1
我在运行HTC Sensation XL时遇到了同样的问题。按照相同的参考指南进行操作。我尝试删除*NS2S并将dT保留为long,但差异仍然为零,因此这不是浮点问题。在IntelliJ的调试器中,我可以查看大约2秒钟累积的SensorEvent数组 - 所有事件时间戳都相同!这是我们手机API中的一个错误还是“特性”? - Alex
3个回答

1

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

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

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

事件被不变地存储在一个数组中。

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

Google/HTC,请归还我三个小时的生命!

我将提交一个错误报告,除非有人能解释这种行为。它肯定没有在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版本中。
虽然这种方法不太正规,但在我看来,快速解决问题总比等待API更新要好!

1

0
如果你从这里复制了代码片段,请注意它有一个错误。 需要进行替换。
private float timestamp;

private long timestamp;

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

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