2014-06-30 46 views
3

任何人都可以幫助我獲得流暢的傳感器事件流嗎?索尼智能手錶2加速度計傳感器在FixedRateListener中打嗝

我試圖使用索尼智能手錶2的加速度計數據來動畫在Android設備的屏幕上揮舞着國旗。 使用索尼的傳感器控制示例代碼作爲起點,我得到了一個很好的工作設置。但只有約5-6秒!那麼傳感器數據開始進入叢林,搞亂了我的動畫。試圖找到罪魁禍首,我已經切了我的SmartWatch代碼裸必不可少的:

監聽器只需登錄自從上次sensorevent的毫秒數:

private final AccessorySensorEventListener timeListener = new AccessorySensorEventListener() { 
    long lastTime = 0; 
    @Override 
    public void onSensorEvent(AccessorySensorEvent event) { 
     Log.i(TAG, "SmartWatch - onSensorEvent: " + (System.currentTimeMillis()-lastTime)); 
     lastTime = System.currentTimeMillis(); 
    } 
}; 

而且這個監聽

登記
SW2SensorsControl(final String hostAppPackageName, final Context context) { 
    super(context, hostAppPackageName); 

    AccessorySensorManager manager = new AccessorySensorManager(context, hostAppPackageName); 
    if (DeviceInfoHelper.isSensorSupported(context, hostAppPackageName, SensorTypeValue.ACCELEROMETER)) { 
     accelerometer = manager.getSensor(SensorTypeValue.ACCELEROMETER); 
    }  
    if(accelerometer!=null) { 
     try { 
      accelerometer.registerFixedRateListener(timeListener, com.sonyericsson.extras.liveware.aef.sensor.Sensor.SensorRates.SENSOR_DELAY_NORMAL); 
     } catch (AccessorySensorException e) { 
      Log.d(TAG, "Failed to register listener", e); 
     } 
    } 
} 

運行代碼,我看到傳感器在10到70毫秒之間進行流式傳輸。但大約6秒後,我開始看到打嗝:200毫秒,然後他們試圖「趕上」,我得到5個讀數相隔幾毫秒。在此之後,它運行良好幾秒鐘,然後我看到另一個呃逆:500〜100毫秒,並再次一些快速「追趕」事件。 - 這個方案重複並且變得更加頻繁,直到幾秒鐘後,這個流完全陷入了困境。 我已經在三星Galaxy S5,Nexus-4和Nexus-5上進行了測試,所以它不是特定於設備的,雖然在SG5上,logcat被一些名爲「ServiceKeeper」的東西加速垃圾郵件顯然是一些系統進程。下面是450毫秒打嗝,其次是短期「抓窗口」的例子:

06-30 11:47:23.208: I/SW2SensorsControl(5173): SmartWatch - onSensorEvent: 450 
06-30 11:47:23.208: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.208: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.218: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.218: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.218: I/SW2SensorsControl(5173): SmartWatch - onSensorEvent: 9 
06-30 11:47:23.218: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.218: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.228: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.228: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.228: I/SW2SensorsControl(5173): SmartWatch - onSensorEvent: 9 
06-30 11:47:23.228: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.228: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.228: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.228: I/SW2SensorsControl(5173): SmartWatch - onSensorEvent: 3 
06-30 11:47:23.228: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.238: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.238: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 
06-30 11:47:23.238: I/ServiceKeeper(857): In getappinfo pid = 857 pkgName = android appinfo = null 
06-30 11:47:23.238: I/ServiceKeeper(857): In getseinfo pid = 857 uid = 1000 seinfo= system 

正如你可以看到,這裏的聽衆是沒有做任何工作 - 從記錄的時間預留 - 但動畫時我的旗幟,打嗝開始更快(因爲還有更多事情)。這就像傳感器事件線程被搶佔,事件在場景後面排隊,或者也許是藍牙接收緩衝區不被讀取。當我使用替代

accelerometer.registerInterruptListener(timeListener); 

事件中更快流,打嗝變得更糟! 有人可以告訴我,如果這可以解決?它是我的代碼,是Android還是索尼?

問候

編輯:

傳感器事件本身不顯示「追趕」的行爲時間戳,但在39-41ms的穩定速度繼續(時間標記在納米-seconds irl - 爲什麼?)。仍然存在奇怪的打嗝 - 通常是401或402毫秒。 在做基於加速度計的動畫時,這對我更有用。但是聽衆沒有以幾乎正常的速度接收它們;有時幾秒鐘通過接下來的 「塊體」 成爲前...

編輯-2:

測試今天三星Galaxy S-3上。在這一點上,數據以比Nexus-4或SG S-5(最差)更平滑的速度進入。這兩個Samsungs 垃圾郵件 logcat輸出,在S5是一個沒有有用信息的系統進程,但在S3上它說「BluetoothSocket.cpp; readNative」 我懷疑傳感器讀數的聚集行爲可能是由藍牙系統:輸入緩衝區可能?有誰知道是否有可能改變藍牙輸入緩衝器的讀取速度?

回答

1

我懷疑問題是您更新顯示器的頻率。你的國旗揮動動畫的時間間隔是多少?如果您每隔幾毫秒更新一次顯示,那麼您可能會遇到一些滯後。

---- -----編輯

抱歉耽擱。在再次查看您的問題後,我想知道問題可能出在您如何註冊手錶傳感器。您是否使用HelloSensors示例應用程序作爲基礎。如果不是,我會建議看看。以下是傳感器在樣本中的註冊方式。請試試這個,讓我知道如果你仍然有問題

/** 
* Checks if the sensor currently being used supports interrupt mode and 
* registers an interrupt listener if it does. If not, a fixed rate listener 
* will be registered instead. 
*/ 
private void register() { 
    Log.d(HelloSensorsExtensionService.LOG_TAG, "Register listener"); 

    AccessorySensor sensor = getCurrentSensor(); 
    if (sensor != null) { 
     try { 
      if (sensor.isInterruptModeSupported()) { 
       sensor.registerInterruptListener(mListener); 
      } else { 
       sensor.registerFixedRateListener(mListener, Sensor.SensorRates.SENSOR_DELAY_UI); 
      } 
     } catch (AccessorySensorException e) { 
      Log.d(HelloSensorsExtensionService.LOG_TAG, "Failed to register listener", e); 
     } 
    } 
} 
+0

在上面的「裸機」的例子中,手錶顯示根本沒有更新。我只是在聽傳感器事件。最終,我想在每個傳感器事件上更新手機的顯示屏(〜40ms =〜25fps),手錶顯示屏應該只顯示應用程序標識並作爲傳感器(當您揮動手臂時看不到多少東西無論如何)。當我使用手機自帶的加速計傳感器時,這很容易實現,但是當我使用手錶作爲「遙感器」時,我會遇到所描述的效果。 – Christian

+1

好的,我明白了。讓我做一些調查,我會回到你身邊。 –