任何人都可以幫助我獲得流暢的傳感器事件流嗎?索尼智能手錶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」 我懷疑傳感器讀數的聚集行爲可能是由藍牙系統:輸入緩衝區可能?有誰知道是否有可能改變藍牙輸入緩衝器的讀取速度?
在上面的「裸機」的例子中,手錶顯示根本沒有更新。我只是在聽傳感器事件。最終,我想在每個傳感器事件上更新手機的顯示屏(〜40ms =〜25fps),手錶顯示屏應該只顯示應用程序標識並作爲傳感器(當您揮動手臂時看不到多少東西無論如何)。當我使用手機自帶的加速計傳感器時,這很容易實現,但是當我使用手錶作爲「遙感器」時,我會遇到所描述的效果。 – Christian
好的,我明白了。讓我做一些調查,我會回到你身邊。 –