如何在 android 中处理加速度计的实时数据?
How to handle live data of Accelerometer in android?
我需要使用一些先前存储的数据和加速度计数据执行动态时间环绕 (DTW) 算法。但我无法处理来自加速度计的大量数据。我需要确定一个步骤。为此,我之前存储了一些数据并尝试与当前数据匹配。
ArrayList<Double> test=new ArrayList<Double>();
public void onSensorChanged(SensorEvent event) {
double x=event.value[0];
double y=event.value[1];
double z=event.value[2];
double a=Math.sqrt(x*x+y*y+z*z);
test.add(a);
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
private class ProgressRunner extends AsyncTask<Double, Integer, Boolean>
{
@Override
protected Boolean doInBackground(Double... params) {
new Thread(new Runnable() {
@Override
public void run() {
double r=DTWDistance(StepSamples.sample1, standTest);
if(r<700) /* "Step Detected */
}
}).start();
return null;
}
但是我从传感器获得了大量数据。我的问题是如何处理这些数据并连续匹配样本数据。我还用 Log.d 进行了测试,我确定问题与我处理此实时数据的方式有关,但我找不到出路。任何建议都会有所帮助。
我也尝试过每隔 2 秒执行一次,但 OutOfMemeoryBoundsException 抛出
if((System.currentTimeMillis()-sTime)/1000>2){
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
}
解决此问题的方法之一是为传感器值的变化设置一个阈值。如果 deltaX
、deltaY
、deltaZ
中的变化更大,那么您可以启动 AsyncTask,否则不要。
由于您没有保留任何阈值,因此您创建的线程数量非常庞大。
编辑 1:
这是一个 link 小教程,可以帮助您快速入门...在这个 link 中,他使用了时间间隔和摇动设备的阈值...我敢打赌这是满足您要求的完美解决方案
您需要处理每一个值还是每 x(例如 0.1)秒精细处理一次?我调用了一个检查 "now - lastProcessedTime" 的方法。如果该值 > 100 毫秒,我将处理数据并更新 lastProcessedTime = now。如果没有,我会扔掉传感器值。
我需要使用一些先前存储的数据和加速度计数据执行动态时间环绕 (DTW) 算法。但我无法处理来自加速度计的大量数据。我需要确定一个步骤。为此,我之前存储了一些数据并尝试与当前数据匹配。
ArrayList<Double> test=new ArrayList<Double>();
public void onSensorChanged(SensorEvent event) {
double x=event.value[0];
double y=event.value[1];
double z=event.value[2];
double a=Math.sqrt(x*x+y*y+z*z);
test.add(a);
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
private class ProgressRunner extends AsyncTask<Double, Integer, Boolean>
{
@Override
protected Boolean doInBackground(Double... params) {
new Thread(new Runnable() {
@Override
public void run() {
double r=DTWDistance(StepSamples.sample1, standTest);
if(r<700) /* "Step Detected */
}
}).start();
return null;
}
但是我从传感器获得了大量数据。我的问题是如何处理这些数据并连续匹配样本数据。我还用 Log.d 进行了测试,我确定问题与我处理此实时数据的方式有关,但我找不到出路。任何建议都会有所帮助。
我也尝试过每隔 2 秒执行一次,但 OutOfMemeoryBoundsException 抛出
if((System.currentTimeMillis()-sTime)/1000>2){
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
}
解决此问题的方法之一是为传感器值的变化设置一个阈值。如果 deltaX
、deltaY
、deltaZ
中的变化更大,那么您可以启动 AsyncTask,否则不要。
由于您没有保留任何阈值,因此您创建的线程数量非常庞大。
编辑 1:
这是一个 link 小教程,可以帮助您快速入门...在这个 link 中,他使用了时间间隔和摇动设备的阈值...我敢打赌这是满足您要求的完美解决方案
您需要处理每一个值还是每 x(例如 0.1)秒精细处理一次?我调用了一个检查 "now - lastProcessedTime" 的方法。如果该值 > 100 毫秒,我将处理数据并更新 lastProcessedTime = now。如果没有,我会扔掉传感器值。