簡體   English   中英

Android SensorEvent時間戳記常量

[英]Android SensorEvent Timestamp constant

我目前正在編寫一個簡單的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創建時間戳的過程中的錯誤嗎?

哇,好吧,這肯定是一個錯誤!

每個SensorEvent的時間戳都被覆蓋,就像它是一個靜態變量一樣。

當我記錄事件發生時的時間戳字符串時,所有值都不同。

這些事件未更改地存儲在數組中。

現在,數組中的每個SensorEvent都具有相同的時間戳,但是value數組仍然不同(即,它們不是同一對象,並且包含不同的信息……時間戳除外)。

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功能,只需繼續並將其插入完整版本即可。

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

還要注意有關SensorEventListener的onSensorChanged-方法的文檔:

注意:該應用程序不擁有作為參數傳遞的事件對象,因此無法保留該對象。 該對象可以是內部池的一部分,並且可以由框架重用。

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

...這表明不應保存對SensorEvent對象的引用。

如果您從此處復制了代碼段,請注意它有一個錯誤。 需要更換

private float timestamp;

private long timestamp;

在其他情況下,您的增量時間將始終包含奇怪的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM