2013-02-12 56 views
4

我目前正在编写一个简单的android应用程序来计算设备imu的偏见。虽然这样做,我遇到一个问题,与event.timestampAndroid SensorEvent时间戳常量

使用代码值:

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创建时间戳的缺陷吗?

+1

我有运行HTC感觉XL同样的问题。遵循相同的参考指南。我尝试删除* NS2S并保持dT长,但差异仍然为零,所以它不是浮点问题。在IntelliJ的调试器中,我可以查看大约2秒内累积的SensorEvent数组 - 全部具有相同的event.timestamp!这是我们手机的API中的错误,还是“功能”? – Alex 2013-02-18 05:16:15

回答

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

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

0

如果您从here复制摘录 注意它有一个错误。 需要更换

private float timestamp; 

private long timestamp; 

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