|
|
|
@ -69,6 +69,7 @@ class Localizer(): |
|
|
|
|
|
|
|
|
|
self.unix_timestamp_millis = 0 |
|
|
|
|
self.last_gps_fix = 0 |
|
|
|
|
self.device_fell = False |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def msg_from_state(converter, calib_from_device, H, predicted_state, predicted_cov): |
|
|
|
@ -142,21 +143,12 @@ class Localizer(): |
|
|
|
|
|
|
|
|
|
def liveLocationMsg(self): |
|
|
|
|
fix = self.msg_from_state(self.converter, self.calib_from_device, self.H, self.kf.x, self.kf.P) |
|
|
|
|
|
|
|
|
|
#if abs(self.posenet_speed - self.car_speed) > max(0.4 * self.car_speed, 5.0): |
|
|
|
|
# self.posenet_invalid_count += 1 |
|
|
|
|
#else: |
|
|
|
|
# self.posenet_invalid_count = 0 |
|
|
|
|
#fix.posenetOK = self.posenet_invalid_count < 4 |
|
|
|
|
|
|
|
|
|
# experimentally found these values |
|
|
|
|
# experimentally found these values, no false positives in 20k minutes of driving |
|
|
|
|
old_mean, new_mean = np.mean(self.posenet_stds[:POSENET_STD_HIST//2]), np.mean(self.posenet_stds[POSENET_STD_HIST//2:]) |
|
|
|
|
std_spike = new_mean/old_mean > 4 and new_mean > 5 |
|
|
|
|
std_spike = new_mean/old_mean > 4 and new_mean > 7 |
|
|
|
|
|
|
|
|
|
if std_spike and self.car_speed > 5: |
|
|
|
|
fix.posenetOK = False |
|
|
|
|
else: |
|
|
|
|
fix.posenetOK = True |
|
|
|
|
fix.posenetOK = not (std_spike and self.car_speed > 5) |
|
|
|
|
fix.deviceStable = not self.device_fell |
|
|
|
|
|
|
|
|
|
#fix.gpsWeek = self.time.week |
|
|
|
|
#fix.gpsTimeOfWeek = self.time.tow |
|
|
|
@ -251,6 +243,10 @@ class Localizer(): |
|
|
|
|
|
|
|
|
|
# Accelerometer |
|
|
|
|
if sensor_reading.sensor == 1 and sensor_reading.type == 1: |
|
|
|
|
# check if device fell, estimate 10 for g |
|
|
|
|
# 40g is a good filter for falling detection, no false positives in 20k minutes of driving |
|
|
|
|
self.device_fell = abs(sensor_reading.acceleration.v[0] - 10) > 40 |
|
|
|
|
|
|
|
|
|
self.acc_counter += 1 |
|
|
|
|
if self.acc_counter % SENSOR_DECIMATION == 0: |
|
|
|
|
v = sensor_reading.acceleration.v |
|
|
|
|