2014-04-11 52 views
0

我正在使用三星銀河ace3來加速採樣。 getMinDelay()給我10 000μs。當我將那段時間的加速度記錄到一個csv文件時,我會在正確的時間週期出現延遲,並伴隨着一個隨機抖動,這個抖動有時很大(0.5秒以上)。'onSensorChanged'加速度計採樣率抖動

有人知道如何改善這一點嗎?

這是我得到的樣本之間的延遲。

Delays vs time Delays vs time (Zoom)

public class MainActivity extends Activity implements SensorEventListener {  
private SensorManager mSensorManager; 
private Sensor mSensor; 
private int cpt = 0; 
private boolean start; 
private List<String> records = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

} 


public final File dir = new File("/mnt/extSdCard/test/"); 
public FileOutputStream afos = null; 
public OutputStream stream = null; 

public void startButton(View view) { 
    start = true; 
    cpt = 0; 
    mSensorManager.registerListener((SensorEventListener) this, mSensor, 10000); // 10000 µs -> 10 ms 
    openCsvFiles(dir, "data.csv"); 
    stream = new BufferedOutputStream(afos); 
} 

public void stopButton(View view) { 

    for (String record: records) { 
     try { 
      stream.write(record.getBytes()); 
     } catch (IOException e) { 

     } 
    } 

    try { 
     stream.flush(); 
     stream.close(); 
     afos.close(); 
     start = false; 
    } catch (IOException e) { 
     Toast.makeText(MainActivity.this, "exception: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
    } 
    Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public final void onSensorChanged(SensorEvent event) { 
    float ax, ay, az; 
    String axs, ays, azs, ts, line; 
    if (start) { 
     cpt++; 

     ax = event.values[0]; 
     ay = event.values[1]; 
     az = event.values[2]; 

     ts = String.valueOf(event.timestamp); 

     long ns = android.os.SystemClock.elapsedRealtimeNanos(); 

     line = ns+", "+ cpt+", "+ ts + "," + ax + "," + ay + "," + az + "\n"; 

     records.add(line); 

    } 
    } 
} 

回答

0
mSensorManager.registerListener((SensorEventListener) this, mSensor, 10000); 

而不是硬編碼值10000使用SensorManager.SENSOR_DELAY_FASTEST

mSensorManager.registerListener((SensorEventListener) this, mSensor, SensorManager.SENSOR_DELAY_FASTEST); 
+0

它不會好轉。此外,我想以固定速率採樣,不一定是100Hz。 – user1035648

0

爲onSensorChanged文檔說,你不應該內做太多的處理方法,因爲它阻止了進一步的樣本進來。它說此頁面上:

http://developer.android.com/guide/topics/sensors/sensors_overview.html

在這裏,您將創建從數據的字符串,並將其添加到一個ArrayList。創建字符串需要一定的時間,並且通常會快速添加到ArrayList中,但有時ArrayList需要增長以適應下一個對象,並且在這種情況下需要很長時間,因爲它需要在內部分配一個新的(更大的)數組,並將舊數組中的引用複製到新數組中。

考慮將SensorEvent添加到FIFO中,例如方法內的ArrayDeque,然後在另一個線程中處理這些數據。它應該改善抖動。

我不認爲Android系統提供任何保證抖動永遠不會很大,但這應該有所幫助。