线性加速度值随时间增加

时间:2016-04-26 08:21:45

标签: android-studio accelerometer android-sensors

我正在开发一个应用程序,我用我的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));
}

提前致谢

1 个答案:

答案 0 :(得分:0)

今天手机中使用的加速计传感器包含易于察觉的噪音。此外,他们对日常物品中存在的噪音非常敏感,例如他们所在的桌子会随着有人走过而稍微移动。这种噪音和环境噪音将出现在加速输出数据中,使用这些值的方式可能会给结果增加误差。

要解决此问题,您可能需要在计算幅度之前单独过滤event.values []。根据您的应用,如果系统可以发现它现在只是躺在桌子上,那么它可以在每个轴的数据上放置一个低带宽低通滤波器(几Hz或更低),然后再使用这些值。计算。那会过滤掉噪音。如果您的应用程序需要原始数据,您可以在系统唤醒后扩大过滤器带宽。如果唤醒事件是从同一个流中提供的话,系统将需要更长时间才能唤醒,但是您可以使用不同的数据路径,仅查看非常大的移动以唤醒系统。