【问题标题】:Accelerometer sampling rate jitter with 'onSensorChanged'带有“onSensorChanged”的加速度计采样率抖动
【发布时间】:2014-04-11 10:18:25
【问题描述】:

我正在使用三星 Galaxy ace3 来采样加速度。 getMinDelay() 给了我 10 000 µs。当我将该时间段内的加速度记录到 csv 文件时,我会在正确的时间段内出现延迟,并且随机抖动有时会很大(超过 0.5 秒)。

有人知道如何改进吗?

这是我得到的样本之间的延迟。

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);

    }
  }
}

【问题讨论】:

    标签: android accelerometer android-sensors sampling


    【解决方案1】:
    mSensorManager.registerListener((SensorEventListener) this, mSensor, 10000);
    

    使用 SensorManager.SENSOR_DELAY_FASTEST

    代替硬编码值 10000
    mSensorManager.registerListener((SensorEventListener) this, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
    

    【讨论】:

    • 没有好转。此外,我想以固定速率采样,不一定是 100Hz。
    【解决方案2】:

    onSensorChanged 的​​文档说你不应该在方法中做太多的处理,因为它会阻止更多的样本进入。它在这个页面上说:

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

    在这里,您正在从数据中创建一个字符串并将其添加到一个 ArrayList。创建字符串需要一定的时间,通常会很快将其添加到 ArrayList 中,但有时 ArrayList 需要增长以容纳下一个对象,在这种情况下需要很长时间,因为它需要在内部分配一个新的(更大的)数组,并将旧数组中的引用复制到新数组中。

    考虑将 SensorEvent 添加到方法中的 FIFO(例如 ArrayDeque),然后在另一个线程中处理这些事件。它应该可以改善抖动。

    我认为 Android 系统不能保证抖动永远不会很大,但这应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多