Как сохранить предыдущее значение барометра, чтобы сравнить его с текущим Android Android Fall Detection

Пишу приложение Fall Detection как проект для учебы. Я использую акселерометр для обнаружения ударов, таких как падения, прыжки и тряски, затем я использую барометр для проверки высоты. Если высота выше 0,5 м между положением стоя и положением лежа после удара, он должен обнаружить это как падение. У меня проблема с сохранением значения давления барометра до удара от акселерометра и сравнения его с текущим давлением, чтобы увидеть разницу. Теперь я сохраняю значение давления при обнаружении удара, а затем позже, когда текущее состояние активно или неактивно. Мне нужно это, чтобы проверить высоту и посмотреть, действительно ли произошло падение. Вот код:

     public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            double ax = event.values[0];
            double ay = event.values[1];
            double az = event.values[2];
            double acceleration = getMagnitude(ax, ay, az);
            pushAcceleration(acceleration);
            setKinematicState(accelerationFrame, ay);
/*
Checking Barometers Height in case of Falling
 */
            if (currentState != previousState) {
                if (currentState == KinematicState.FALL) {
                    PressuredataObject barometer;
                    barometer = pressuredataObjects.get(pressuredataObjects.size() - 1);
                    beforeFallAltitude = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, barometer.getAirPressure());
                    impactDetected = true;
                }
                if ((currentState == KinematicState.INACTIVE || currentState == KinematicState.ACTIVE) && impactDetected) {
                    PressuredataObject barometer;
                    barometer = pressuredataObjects.get(pressuredataObjects.size() - 1);
                    afterFallAltitude = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, barometer.getAirPressure());
                    float diffAltitude = beforeFallAltitude - afterFallAltitude;
                    float abs_diffAltitude = (diffAltitude < 0) ? -diffAltitude : diffAltitude;
                    if (abs_diffAltitude > 0.5) {
                        Log.d("abs_diffAltitude", "" + abs_diffAltitude);
                        state.setText("FALL DETECTED");
                        state.setTextColor(Color.parseColor("#FF0000"));
                        fallPlayer.start();
                        showDialog();
                    }
                    impactDetected = false;
                }
                systemState(currentState);
                previousState = currentState;
            }
        }

        if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
            float[] values = event.values;
            pressuredataObjects.add(new PressuredataObject(values[0], 0f, System.currentTimeMillis()));
            if (pressuredataObjects.size() > BUFF_SIZE)
                pressuredataObjects.remove(0);

            PressuredataObject lastMeasure = pressuredataObjects.get(pressuredataObjects.size() - 1);
            PressuredataObject medianValue = PressureUtilities.selectMedianValue(pressuredataObjects);
            // Calculate speed and altitude
            float speed = 0f;
            float altitude = 0f;
            if (pdoPrevious == null) {
                medianValue.setSpeed(0);
            } else {
                speed = lastMeasure.getSpeed();
                altitude = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastMeasure.getAirPressure());
            }
            pdoPrevious = medianValue;
        }
    }

И здесь вы можете увидеть функции для акселерометра

  private void setKinematicState(List<Double> buffer, double accelerationY) {
    int zrc = getMagnitudeValues(buffer);
    if (zrc <= 3) {
        currentState = KinematicState.INACTIVE;
    } else if (zrc > 3 && zrc < 6) {
        currentState = KinematicState.ACTIVE;
    }
    else if (zrc > 6) {
        currentState = KinematicState.FALL;
    }
}

private int getMagnitudeValues(List<Double> accelerationFrame) {
    int count = 0;
    for (int i = 1; i < accelerationFrame.size(); i++) {
        if ((accelerationFrame.get(i - 1) - GRAVITY_ACC) < APPROXIMATION_ERROR
                && (accelerationFrame.get(i) - GRAVITY_ACC) > APPROXIMATION_ERROR) {
            count++;
        }
    }
    return count;
}

private double getMagnitude(double accelerationX, double accelerationY, double accelerationZ) {
    return Math.sqrt(accelerationX * accelerationX
            + accelerationY * accelerationY + accelerationZ * accelerationZ);
}

private void pushAcceleration(double acceleration) {
    accelerationFrame.add(acceleration);
    if (accelerationFrame.size() > BUFF_SIZE)
        accelerationFrame.remove(0);
}

Кто-нибудь знает, как сохранить предыдущее значение давления непосредственно перед ударом от акселерометра?

0 ответов

Другие вопросы по тегам