Temporary TrackStatistics should also contain gain/loss from barometric sensor.

This commit is contained in:
Dennis Guse
2021-07-02 21:55:26 +02:00
parent c289fd174d
commit 8991d7bf0d
5 changed files with 21 additions and 20 deletions
@@ -778,6 +778,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
tmpLastTrackPoint.setLongitude(lastTrackPoint.getLongitude());
tmpLastTrackPoint.setLatitude(lastTrackPoint.getLatitude());
}
tmpLastTrackPoint.setAltitudeGain(getAltitudeGain_m());
tmpLastTrackPoint.setAltitudeLoss(getAltitudeLoss_m());
SensorDataSet sensorDataSet = fillWithSensorDataSet(tmpLastTrackPoint);
@@ -100,12 +100,13 @@ public class AltitudeSumManager implements SensorEventListener {
return;
}
altitudeGain_m = altitudeGain_m != null ? altitudeGain_m : 0;
altitudeLoss_m = altitudeLoss_m != null ? altitudeLoss_m : 0;
PressureSensorUtils.AltitudeChange altitudeChange = PressureSensorUtils.computeChangesWithSmoothing_m(lastAcceptedPressureValue_hPa, lastSeenSensorValue_hPa, value_hPa);
if (altitudeChange != null) {
altitudeGain_m = altitudeGain_m != null ? altitudeGain_m : 0;
altitudeGain_m = altitudeChange.getAltitudeGain_m();
altitudeGain_m += altitudeChange.getAltitudeGain_m();
altitudeLoss_m = altitudeLoss_m != null ? altitudeLoss_m : 0;
altitudeLoss_m += altitudeChange.getAltitudeLoss_m();
lastAcceptedPressureValue_hPa = altitudeChange.getCurrentSensorValue_hPa();
@@ -2,6 +2,8 @@ package de.dennisguse.opentracks.util;
import android.hardware.SensorManager;
import androidx.annotation.VisibleForTesting;
public class PressureSensorUtils {
//Everything above is considered a meaningful change in altitude.
@@ -9,6 +11,8 @@ public class PressureSensorUtils {
private static final float EXPONENTIAL_SMOOTHING = 0.3f;
private static final float p0 = SensorManager.PRESSURE_STANDARD_ATMOSPHERE;
private PressureSensorUtils() {
}
@@ -46,17 +50,13 @@ public class PressureSensorUtils {
public static AltitudeChange computeChangesWithSmoothing_m(float lastAcceptedSensorValue_hPa, float lastSeenSensorValue_hPa, float currentSensorValue_hPa) {
float nextSensorValue_hPa = EXPONENTIAL_SMOOTHING * currentSensorValue_hPa + (1 - EXPONENTIAL_SMOOTHING) * lastSeenSensorValue_hPa;
return computeChanges_m(lastAcceptedSensorValue_hPa, nextSensorValue_hPa);
return computeChanges(lastAcceptedSensorValue_hPa, nextSensorValue_hPa);
}
/**
* Computes the altitude gain and altitude loss.
*
* @return null if no meaningful altitudeC change occurred.
*/
public static AltitudeChange computeChanges_m(float lastAcceptedSensorValue_hPa, float currentSensorValue_hPa) {
float lastSensorValue_m = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastAcceptedSensorValue_hPa);
float currentSensorValue_m = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentSensorValue_hPa);
@VisibleForTesting
public static AltitudeChange computeChanges(float lastAcceptedSensorValue_hPa, float currentSensorValue_hPa) {
float lastSensorValue_m = SensorManager.getAltitude(p0, lastAcceptedSensorValue_hPa);
float currentSensorValue_m = SensorManager.getAltitude(p0, currentSensorValue_hPa);
float altitudeChange_m = currentSensorValue_m - lastSensorValue_m;
if (Math.abs(altitudeChange_m) < ALTITUDE_CHANGE_DIFF_M) {
@@ -66,9 +66,9 @@ public class PressureSensorUtils {
// Limit altitudeC change by ALTITUDE_CHANGE_DIFF and computes pressure value accordingly.
AltitudeChange altitudeChange = new AltitudeChange(currentSensorValue_hPa, altitudeChange_m);
if (altitudeChange.getAltitudeChange_m() > 0) {
return new AltitudeChange(getBarometricPressure(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastSensorValue_m + ALTITUDE_CHANGE_DIFF_M), ALTITUDE_CHANGE_DIFF_M);
return new AltitudeChange(getBarometricPressure(lastSensorValue_m + ALTITUDE_CHANGE_DIFF_M), ALTITUDE_CHANGE_DIFF_M);
} else {
return new AltitudeChange(getBarometricPressure(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastSensorValue_m - ALTITUDE_CHANGE_DIFF_M), -1 * ALTITUDE_CHANGE_DIFF_M);
return new AltitudeChange(getBarometricPressure(lastSensorValue_m - ALTITUDE_CHANGE_DIFF_M), -1 * ALTITUDE_CHANGE_DIFF_M);
}
}
@@ -77,7 +77,7 @@ public class PressureSensorUtils {
* https://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Internationale_H%C3%B6henformel
* {\color{White} p(h)} = p_0 \cdot \left( 1 - \frac{0{,}0065 \frac{\mathrm K}{\mathrm m} \cdot h}{T_0\ } \right)^{5{,}255}
*/
private static float getBarometricPressure(float p0, float altitude_m) {
private static float getBarometricPressure(float altitude_m) {
return (float) (p0 * Math.pow(1.0 - 0.0065 * altitude_m / 288.15, 5.255f));
}
}
@@ -163,10 +163,8 @@ public class IntervalStatistics {
time = time.plus(trackStatistics.getTotalTime());
gain_m = trackStatistics.hasTotalAltitudeGain() ? trackStatistics.getTotalAltitudeGain() : gain_m;
loss_m = trackStatistics.hasTotalAltitudeLoss() ? trackStatistics.getTotalAltitudeLoss() : loss_m;
if (gain_m != null && lastTrackPoint != null && lastTrackPoint.hasAltitudeGain()) {
if (hasGain() && lastTrackPoint != null && lastTrackPoint.hasAltitudeGain()) {
gain_m = gain_m - lastTrackPoint.getAltitudeGain();
}
if (loss_m != null && lastTrackPoint != null && lastTrackPoint.hasAltitudeLoss()) {
loss_m = loss_m - lastTrackPoint.getAltitudeLoss();
}
}