0

我正在编写跌倒检测应用程序作为研究项目。我使用加速度计检测跌落、跳跃和摇晃等冲击,然后使用气压计检查高度。如果撞击后站立姿势和卧姿之间的高度大于0.5m,则应检测为跌倒。我在从加速度计影响之前保存气压计的压力值并将其与当前压力进行比较以查看差异时遇到问题。现在我在检测到影响时保存压力值,然后在当前状态处于活动或非活动状态时保存。我需要这个来检查高度,看看跌倒是否真的发生了。这是代码:

     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);
}

有谁知道如何在加速度计撞击之前保存以前的压力值?

4

0 回答 0