【问题标题】:Android SensorEvent Timestamp constantAndroid SensorEvent 时间戳常量
【发布时间】:2013-01-28 08:22:27
【问题描述】:

我目前正在编写一个简单的 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 或 Nexus 7 上运行相同的代码时,dT 始终为 0。我知道关于问题,Android SensorEvent timestamp issue Nexus 7 时间戳是一个 unix 时间戳,但连续测量之间的差异不应该总是为零。 Nexus 4 和 Nexus 7 都具有相同的 IMU 这可能是从 IMU 创建时间戳的方式中的错误吗?

【问题讨论】:

  • 我在运行 HTC Sensation XL 时遇到了同样的问题。遵循相同的参考指南。我尝试删除 *NS2S 并将 dT 保持为 long,但差异仍然为零,所以这不是浮点问题。在 IntelliJ 的调试器中,我可以查看在大约 2 秒内累积的 SensorEvent 数组——它们都具有相同的 event.timestamp!这是我们手机 API 中的错误,还是“功能”?

标签: android timestamp unix-timestamp android-sensors nexus-4


【解决方案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 功能,只需将其放入 Unbroken 版本即可。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      如果你从here复制了sn-p 注意它有一个错误。 需要更换

      private float timestamp;
      

      private long timestamp;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多