线性加速度值随时间增加



我正在开发一个应用程序,其中我用我的安卓设备收集线性加速度值。因此,我使用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[]。根据您的应用,如果系统可以注意到它现在只是躺在桌子上,那么它可以在每个轴的数据上放置一个低带宽低通滤波器(几赫兹或更小),然后再在计算中使用这些值。这将过滤掉噪音。如果应用程序需要原始数据,则可以在系统唤醒后扩大筛选器带宽。如果唤醒事件从同一流馈送,则系统将需要更长的时间才能唤醒,但您可能有不同的数据路径,该路径仅查找非常大的移动以唤醒系统。

相关内容

  • 没有找到相关文章

最新更新