altoslib: Clip accelerometer-based speed to >= 0
authorKeith Packard <keithp@keithp.com>
Sat, 17 Oct 2020 22:29:11 +0000 (15:29 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 22 Oct 2020 04:33:59 +0000 (21:33 -0700)
Negative vertical speeds computed by axial acceleration aren't
sensible, so just clip them to zero so that plots are more useful.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosFlightSeries.java
altoslib/AltosTimeSeries.java

index 38256f0e4ca515d73eadc88c0866b7c7c73e96a0..d9d59f1bbf25ab5afc4d3ed7a614737f88569d75 100644 (file)
@@ -348,8 +348,12 @@ public class AltosFlightSeries extends AltosDataListener {
                        else
                                accel_series.integrate(temp_series);
 
+                       AltosTimeSeries clip_series = make_series(speed_name, AltosConvert.speed);
+
+                       temp_series.clip(clip_series, 0, Double.POSITIVE_INFINITY);
+
                        accel_speed_series = make_series(speed_name, AltosConvert.speed);
-                       temp_series.filter(accel_speed_series, 0.1);
+                       clip_series.filter(accel_speed_series, 0.1);
                }
 
                if (alt_speed_series != null && accel_speed_series != null) {
index 80720f152c3bf3d232d6c8ae33d768fe1f1478fd..d12fbe701d67b83741010d29df4d6a53969f4dad 100644 (file)
@@ -342,6 +342,16 @@ public class AltosTimeSeries implements Iterable<AltosTimeValue>, Comparable<Alt
                return f;
        }
 
+       public AltosTimeSeries clip(AltosTimeSeries clip, double min, double max) {
+               for (AltosTimeValue v: values) {
+                       double value = v.value;
+                       if (value < min) value = min;
+                       if (value > max) value = max;
+                       clip.add(v.time, value);
+               }
+               return clip;
+       }
+
        public AltosTimeSeries(String label, AltosUnits units) {
                this.label = label;
                this.units = units;