我正在开发一个应用程序,我用我的Android设备收集线性加速度值。因此我使用Sensor.TYPE_LINEAR_ACCELERATION我还使用MAGNETOMETER ACCELERATION和GYROSKOP通过传感器融合方法计算设备方向
public void initListeners(){
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (startFlag == true) {
switch(event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
// copy new accelerometer data into accel array
// then calculate new orientation
System.arraycopy(event.values, 0, accel, 0, 3);
calculateAccMagOrientation();
break;
case Sensor.TYPE_LINEAR_ACCELERATION:
myLinearAcceleration(event);
break;
case Sensor.TYPE_GYROSCOPE:
// process gyro data
gyroFunction(event);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
// copy new magnetometer data into magnet array
System.arraycopy(event.values, 0, magnet, 0, 3);
break;
}
}
}
在方法myLinearAcceleration中,我将线性加速原始数据写入txt文件以存储它以供以后分析。
public void myLinearAcceleration(SensorEvent event) {
magnitude = Math.sqrt((event.values[0] * event.values[0]) + (event.values[1] * event.values[1]) +
(event.values[2] * event.values[2]));
rollingAverage[0] = roll(rollingAverage[0], magnitude);
filtered.add(averageList(rollingAverage[0]));
if(filtered.size() == ACTIVITY_WINDOW_SIZE ){
double [] params = myEvaluation(filtered);
myRecognize(params);
myEnergie(activity);
// params[0]=mean, params[1]=var, params[2]=stw, params[3]=RMS
//if (params[0]){}
counter++;
rest.setText("RES: " + decimal.format(calories[0]));
sedentary.setText("SED: " + decimal.format(calories[1]));
light.setText("LIGHT: " + decimal.format(calories[2]));
moderate.setText("MOD: " + decimal.format(calories[3]));
vigorous.setText("VIG: " + decimal.format(calories[4]));
total.setText("Gesamt: " +decimal.format(calories[5]));
filtered.clear();
}
else{
xSize.setText(String.valueOf(counter));
}
String x = String.valueOf(event.values[0])+"; ";
//String y = String.valueOf(event.values[1])+"; ";
//String z = String.valueOf(event.values[2])+"; ";
String t = String.valueOf(event.timestamp)+"\n";
try{
fileOutputStream.write(x.getBytes());
fileOutputStream.write(y.getBytes());
fileOutputStream.write(z.getBytes());
fileOutputStream.write(t.getBytes());
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
对于大约半小时或更短时间的测量时间,一切正常并且测量值在测量的活动的典型范围内(坐着低,走路高),但是如果Android设备处于静止位置较长时间周期线性加速度值随时间不断增加。如附件所示。 GYROSKOPE测量中是否存在一种漂移的可能性,因为过滤不良以从加速度值中接收线性加速度数据?
当测量时间超过30分钟时,第二个问题测量有时无理由停止。通过buttonclick开始测量,如果使用其他应用程序或显示器超时几分钟,则不会停止测量。有什么想法可以调用unregisterlisteners()或者是否有其他原因让系统取消注册传感器事件监听器?
public void unregisterListeners() {
mSensorManager.unregisterListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
mSensorManager.unregisterListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION));
mSensorManager.unregisterListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE));
mSensorManager.unregisterListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD));
}
提前致谢
答案 0 :(得分:0)
今天手机中使用的加速计传感器包含易于察觉的噪音。此外,他们对日常物品中存在的噪音非常敏感,例如他们所在的桌子会随着有人走过而稍微移动。这种噪音和环境噪音将出现在加速输出数据中,使用这些值的方式可能会给结果增加误差。
要解决此问题,您可能需要在计算幅度之前单独过滤event.values []。根据您的应用,如果系统可以发现它现在只是躺在桌子上,那么它可以在每个轴的数据上放置一个低带宽低通滤波器(几Hz或更低),然后再使用这些值。计算。那会过滤掉噪音。如果您的应用程序需要原始数据,您可以在系统唤醒后扩大过滤器带宽。如果唤醒事件是从同一个流中提供的话,系统将需要更长时间才能唤醒,但是您可以使用不同的数据路径,仅查看非常大的移动以唤醒系统。