|
|
@ -55,6 +55,7 @@ class DRIVER_MONITOR_SETTINGS(): |
|
|
|
self._POSESTD_THRESHOLD = 0.3 |
|
|
|
self._POSESTD_THRESHOLD = 0.3 |
|
|
|
self._HI_STD_FALLBACK_TIME = int(10 / self._DT_DMON) # fall back to wheel touch if model is uncertain for 10s |
|
|
|
self._HI_STD_FALLBACK_TIME = int(10 / self._DT_DMON) # fall back to wheel touch if model is uncertain for 10s |
|
|
|
self._DISTRACTED_FILTER_TS = 0.25 # 0.6Hz |
|
|
|
self._DISTRACTED_FILTER_TS = 0.25 # 0.6Hz |
|
|
|
|
|
|
|
self._ALWAYS_ON_ALERT_MIN_SPEED = 7 |
|
|
|
|
|
|
|
|
|
|
|
self._POSE_CALIB_MIN_SPEED = 13 # 30 mph |
|
|
|
self._POSE_CALIB_MIN_SPEED = 13 # 30 mph |
|
|
|
self._POSE_OFFSET_MIN_COUNT = int(60 / self._DT_DMON) # valid data counts before calibration completes, 1min cumulative |
|
|
|
self._POSE_OFFSET_MIN_COUNT = int(60 / self._DT_DMON) # valid data counts before calibration completes, 1min cumulative |
|
|
@ -302,7 +303,7 @@ class DriverStatus(): |
|
|
|
elif self.face_detected and self.pose.low_std: |
|
|
|
elif self.face_detected and self.pose.low_std: |
|
|
|
self.hi_stds = 0 |
|
|
|
self.hi_stds = 0 |
|
|
|
|
|
|
|
|
|
|
|
def update_events(self, events, driver_engaged, ctrl_active, standstill, wrong_gear): |
|
|
|
def update_events(self, events, driver_engaged, ctrl_active, standstill, wrong_gear, car_speed): |
|
|
|
always_on_valid = self.always_on and not wrong_gear |
|
|
|
always_on_valid = self.always_on and not wrong_gear |
|
|
|
if (driver_engaged and self.awareness > 0 and not self.active_monitoring_mode) or \ |
|
|
|
if (driver_engaged and self.awareness > 0 and not self.active_monitoring_mode) or \ |
|
|
|
(not always_on_valid and not ctrl_active) or \ |
|
|
|
(not always_on_valid and not ctrl_active) or \ |
|
|
@ -327,14 +328,19 @@ class DriverStatus(): |
|
|
|
if self.awareness > self.threshold_prompt: |
|
|
|
if self.awareness > self.threshold_prompt: |
|
|
|
return |
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
standstill_exemption = standstill and self.awareness - self.step_change <= self.threshold_prompt |
|
|
|
_reaching_audible = self.awareness - self.step_change <= self.threshold_prompt |
|
|
|
always_on_red_exemption = always_on_valid and not ctrl_active and self.awareness - self.step_change <= 0 |
|
|
|
_reaching_terminal = self.awareness - self.step_change <= 0 |
|
|
|
|
|
|
|
standstill_exemption = standstill and _reaching_audible |
|
|
|
|
|
|
|
always_on_red_exemption = always_on_valid and not ctrl_active and _reaching_terminal |
|
|
|
|
|
|
|
always_on_lowspeed_exemption = always_on_valid and not ctrl_active and car_speed < self.settings._ALWAYS_ON_ALERT_MIN_SPEED and _reaching_audible |
|
|
|
|
|
|
|
|
|
|
|
certainly_distracted = self.driver_distraction_filter.x > 0.63 and self.driver_distracted and self.face_detected |
|
|
|
certainly_distracted = self.driver_distraction_filter.x > 0.63 and self.driver_distracted and self.face_detected |
|
|
|
maybe_distracted = self.hi_stds > self.settings._HI_STD_FALLBACK_TIME or not self.face_detected |
|
|
|
maybe_distracted = self.hi_stds > self.settings._HI_STD_FALLBACK_TIME or not self.face_detected |
|
|
|
|
|
|
|
|
|
|
|
if certainly_distracted or maybe_distracted: |
|
|
|
if certainly_distracted or maybe_distracted: |
|
|
|
# should always be counting if distracted unless at standstill and reaching orange |
|
|
|
# should always be counting if distracted unless at standstill (lowspeed for always-on) and reaching orange |
|
|
|
# also will not be reaching 0 if DM is active when not engaged |
|
|
|
# also will not be reaching 0 if DM is active when not engaged |
|
|
|
if not standstill_exemption and not always_on_red_exemption: |
|
|
|
if not (standstill_exemption or always_on_red_exemption or always_on_lowspeed_exemption): |
|
|
|
self.awareness = max(self.awareness - self.step_change, -0.1) |
|
|
|
self.awareness = max(self.awareness - self.step_change, -0.1) |
|
|
|
|
|
|
|
|
|
|
|
alert = None |
|
|
|
alert = None |
|
|
|