我正在开发一个应用程序,其中我用我的安卓设备收集线性加速度值。因此,我使用Sensor.TYPE_LINEAR_ACCELERATION我还使用磁力计加速度和陀螺仪通过传感器融合方法计算设备方向
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中,im将线性加速度原始数据写入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 分钟时,测量有时会无缘无故地停止。测量通过单击按钮开始,如果使用其他应用程序或显示超时几分钟,则不会停止。为什么可以调用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));
}
提前致谢
当今手机中使用的加速度计传感器包含容易注意到的噪声。此外,它们对日常物品中存在的噪音非常敏感,例如它们所在的桌子,当有人走过时会轻微移动。此噪声和环境噪声将出现在加速输出数据中,使用这些值的方式可能会给结果增加误差。
为了解决这个问题,你可能希望在计算量级之前单独过滤你的event.values[]。根据您的应用,如果系统可以注意到它现在只是躺在桌子上,那么它可以在每个轴的数据上放置一个低带宽低通滤波器(几赫兹或更小),然后再在计算中使用这些值。这将过滤掉噪音。如果应用程序需要原始数据,则可以在系统唤醒后扩大筛选器带宽。如果唤醒事件从同一流馈送,则系统将需要更长的时间才能唤醒,但您可能有不同的数据路径,该路径仅查找非常大的移动以唤醒系统。