我想以20Hz的采样率模拟一个固定的加速度传感器延迟。 (600个样本/ 30秒)
这是针对人类活动识别Android移动应用程序,它使用TensorFlow来预测用户的活动。我尝试使用固定的SENSOR_DELAY
(NORMAL,UI,FASTEST)和samplePeriodUS。我注意到,使用samplingPeriodUS
上的自定义值,由于采样率不断变化,因此无法获得一致的延迟。我最终使用了SENSOR_DELAY_NORMAL
,因为它给了我一致的采样率,接近46Hz。
使用此代码,我收集了600个加速度计样本(x,y,z),然后将其添加到Arraylist中,然后将其发送到Tensorflow以返回概率。
使用此设置,我希望每13-14秒获得600个样本。我想实现30秒的延迟(20Hz)。
是否可以通过Thread.Sleep
,ScheduledExecutorService
或线性插值来实现?
好奇地从源代码中提取了源代码,并对其进行了稍微的修改:Github Link
protected void onResume() {
super.onResume();
getSensorManager().registerListener(this, getSensorManager().getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent event) {
specificActivityPrediction(activity);
x.add(event.values[0]);
y.add(event.values[1]);
z.add(event.values[2]);
}
private void specificActivityPrediction(String activity) {
if (x.size() == N_SAMPLES && y.size() == N_SAMPLES && z.size() == N_SAMPLES) {
data = new ArrayList<>();
data.addAll(x);
data.addAll(y);
data.addAll(z);
results = classifier.predictProbabilities(toFloatArray(data));
downstairsTextView.setText(Float.toString(round(results[0], 2)));
joggingTextView.setText(Float.toString(round(results[1], 2)));
sittingTextView.setText(Float.toString(round(results[2], 2)));
standingTextView.setText(Float.toString(round(results[3], 2)));
upstairsTextView.setText(Float.toString(round(results[4], 2)));
walkingTextView.setText(Float.toString(round(results[5], 2)));
sendProbabilities(activity);
x.clear();
y.clear();
z.clear();
}
}