Save speed/height values from 128 samples ago and subtract them from
the current value. This reduces the effect of systematic accelerometer
error causing these values to slowly creep when there's no barometric
sensor to keep them in check.
Signed-off-by: Keith Packard <keithp@keithp.com>
if (ao_height > AO_M_TO_HEIGHT(20)
#if HAS_ACCEL
|| (ao_accel > AO_MSS_TO_ACCEL(20)
-#if HAS_BARO
- && ao_speed > AO_MS_TO_SPEED(5)
-#endif
-)
+ && ao_speed > AO_MS_TO_SPEED(5))
#endif
)
{
#endif /* else FORCE_ACCEL */
#endif /* HAS_ACCEL */
+#if !HAS_BARO
+static ao_k_t ao_k_height_prev;
+static ao_k_t ao_k_speed_prev;
+
+/*
+ * While in pad mode without a barometric sensor, remove accumulated
+ * speed and height values to reduce the effect of systematic sensor
+ * error
+ */
+void
+ao_kalman_reset_accumulate(void)
+{
+ ao_k_height -= ao_k_height_prev;
+ ao_k_speed -= ao_k_speed_prev;
+ ao_k_height_prev = ao_k_height;
+ ao_k_speed_prev = ao_k_speed;
+}
+#endif
+
void
ao_kalman(void)
{
++nsamples;
else
ao_sample_preflight_set();
+#if !HAS_BARO
+ if ((nsamples & 0x7f) == 0)
+ ao_kalman_reset_accumulate();
+#endif
}
#if 0
void ao_kalman(void);
+#if !HAS_BARO
+void ao_kalman_reset_accumulate(void);
+#endif
+
#endif /* _AO_SAMPLE_H_ */