4

我目前正在编写一个简单的 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 创建时间戳的错误吗?

4

3 回答 3

1

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

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

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

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

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

谷歌/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 版本即可。

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

于 2013-02-18T05:29:11.050 回答
1

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

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

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

...这表明不应持有对 SensorEvent 对象的引用。

于 2013-04-02T16:19:42.527 回答
0

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

private float timestamp;

private long timestamp;

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

于 2014-04-09T08:55:39.640 回答