我目前正在编写一个简单的android应用程序来计算设备imu的偏差。在这样做的时候,我遇到了一个关于event.timestamp的值的问题
使用以下代码:
float dT = (event.timestamp-accel_timestamp)*NS2S;从Android Reference Guide的示例中计算四元数的旋转矩阵。
当我使用Galaxy Nexus-S运行代码时,两次测量之间的dT为0.06~0.07秒,但当我在LG Nexus 4或Nexus7上运行相同的代码时,dT始终为0。我意识到一个问题,Android SensorEvent timestamp issue,Nexus7时间戳是一个unix时间戳,但连续测量之间的差异不应该总是零。Nexus 4和Nexus 7都有相同的IMU,这会不会是从IMU创建时间戳的错误?
发布于 2013-02-18 13:29:11
哇,好吧,这肯定是个bug!
每个SensorEvent的时间戳都会被覆盖,就好像它是一个静态变量一样……
当我记录事件发生时的时间戳字符串时,所有的值都不同。
事件原封不动地存储在数组中。
数组中的每个SensorEvent现在都有相同的时间戳,但值数组仍然不同(即,它们不是同一个对象,并且包含不同的信息……除了时间戳之外)。
除非有人能解释这种行为,否则我会去提交一份bug报告。它肯定没有记录在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功能,只需继续并将其放入完整版本中即可。
这很麻烦,但我认为快速修改总比等待API更新要好!
发布于 2013-04-03 00:19:43
还要注意SensorEventListener的onSensorChanged -method上的文档:
注意:应用程序不拥有作为参数传递的事件对象,因此不能持有它。该对象可以是内部池的一部分,并且可以由框架重用。
点击此处:http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged%28android.hardware.SensorEvent%29
...which建议人们不应该引用SensorEvent -objects。
发布于 2014-04-09 16:55:40
如果您从here复制了代码片段,请注意它有一个错误。需要更换
private float timestamp;至
private long timestamp;在其他情况下,您增量时间将始终包含奇怪的值
https://stackoverflow.com/questions/14842537
复制相似问题