Skip to content

Commit fa56d53

Browse files
dm: phone offseter class + log stats (#36656)
* dm: phone offseter class + log stats * lint:/
1 parent 5c10e7f commit fa56d53

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

cereal/log.capnp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,6 +2226,8 @@ struct DriverMonitoringState @0xb83cda094a1da284 {
22262226
isActiveMode @16 :Bool;
22272227
isRHD @4 :Bool;
22282228
uncertainCount @19 :UInt32;
2229+
phoneProbOffset @20 :Float32;
2230+
phoneProbalidCount @21 :UInt32;
22292231

22302232
isPreviewDEPRECATED @15 :Bool;
22312233
rhdCheckedDEPRECATED @5 :Bool;

selfdrive/monitoring/helpers.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ def __init__(self, max_trackable):
9898
self.cfactor_pitch = 1.
9999
self.cfactor_yaw = 1.
100100

101+
class DriverPhone:
102+
def __init__(self, max_trackable):
103+
self.prob = 0.
104+
self.prob_offseter = RunningStatFilter(max_trackable=max_trackable)
105+
self.prob_calibrated = False
106+
101107
class DriverBlink:
102108
def __init__(self):
103109
self.left = 0.
@@ -136,10 +142,8 @@ def __init__(self, rhd_saved=False, settings=None, always_on=False):
136142
# init driver status
137143
self.wheelpos_learner = RunningStatFilter()
138144
self.pose = DriverPose(self.settings._POSE_OFFSET_MAX_COUNT)
145+
self.phone = DriverPhone(self.settings._POSE_OFFSET_MAX_COUNT)
139146
self.blink = DriverBlink()
140-
self.phone_prob = 0.
141-
self.phone_offseter = RunningStatFilter(max_trackable=self.settings._POSE_OFFSET_MAX_COUNT)
142-
self.phone_calibrated = False
143147

144148
self.always_on = always_on
145149
self.distracted_types = []
@@ -237,11 +241,11 @@ def _get_distracted_types(self):
237241
if (self.blink.left + self.blink.right)*0.5 > self.settings._BLINK_THRESHOLD:
238242
distracted_types.append(DistractedType.DISTRACTED_BLINK)
239243

240-
if self.phone_calibrated:
241-
using_phone = self.phone_prob > max(min(self.phone_offseter.filtered_stat.M, self.settings._PHONE_MAX_OFFSET), self.settings._PHONE_MIN_OFFSET) \
242-
* self.settings._PHONE_THRESH2
244+
if self.phone.prob_calibrated:
245+
using_phone = self.phone.prob > max(min(self.phone_offseter.filtered_stat.M, self.settings._PHONE_MAX_OFFSET), self.settings._PHONE_MIN_OFFSET) \
246+
* self.settings._PHONE_THRESH2
243247
else:
244-
using_phone = self.phone_prob > self.settings._PHONE_THRESH
248+
using_phone = self.phone.prob > self.settings._PHONE_THRESH
245249
if using_phone:
246250
distracted_types.append(DistractedType.DISTRACTED_PHONE)
247251

@@ -275,14 +279,15 @@ def _update_states(self, driver_state, cal_rpy, car_speed, op_engaged, standstil
275279
model_std_max = max(self.pose.pitch_std, self.pose.yaw_std)
276280
self.pose.low_std = model_std_max < self.settings._POSESTD_THRESHOLD
277281
self.blink.left = driver_data.leftBlinkProb * (driver_data.leftEyeProb > self.settings._EYE_THRESHOLD) \
278-
* (driver_data.sunglassesProb < self.settings._SG_THRESHOLD)
282+
* (driver_data.sunglassesProb < self.settings._SG_THRESHOLD)
279283
self.blink.right = driver_data.rightBlinkProb * (driver_data.rightEyeProb > self.settings._EYE_THRESHOLD) \
280-
* (driver_data.sunglassesProb < self.settings._SG_THRESHOLD)
281-
self.phone_prob = driver_data.phoneProb
284+
* (driver_data.sunglassesProb < self.settings._SG_THRESHOLD)
285+
self.phone.prob = driver_data.phoneProb
282286

283287
self.distracted_types = self._get_distracted_types()
284-
self.driver_distracted = (DistractedType.DISTRACTED_PHONE in self.distracted_types or DistractedType.DISTRACTED_POSE in self.distracted_types
285-
or DistractedType.DISTRACTED_BLINK in self.distracted_types) \
288+
self.driver_distracted = (DistractedType.DISTRACTED_PHONE in self.distracted_types
289+
or DistractedType.DISTRACTED_POSE in self.distracted_types
290+
or DistractedType.DISTRACTED_BLINK in self.distracted_types) \
286291
and driver_data.faceProb > self.settings._FACE_THRESHOLD and self.pose.low_std
287292
self.driver_distraction_filter.update(self.driver_distracted)
288293

@@ -291,11 +296,11 @@ def _update_states(self, driver_state, cal_rpy, car_speed, op_engaged, standstil
291296
if self.face_detected and car_speed > self.settings._POSE_CALIB_MIN_SPEED and self.pose.low_std and (not op_engaged or not self.driver_distracted):
292297
self.pose.pitch_offseter.push_and_update(self.pose.pitch)
293298
self.pose.yaw_offseter.push_and_update(self.pose.yaw)
294-
self.phone_offseter.push_and_update(self.phone_prob)
299+
self.phone.prob_offseter.push_and_update(self.phone.prob)
295300

296301
self.pose.calibrated = self.pose.pitch_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT and \
297-
self.pose.yaw_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT
298-
self.phone_calibrated = self.phone_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT
302+
self.pose.yaw_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT
303+
self.phone.prob_calibrated = self.phone.prob_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT
299304

300305
if self.face_detected and not self.driver_distracted:
301306
if model_std_max > self.settings._DCAM_UNCERTAIN_ALERT_THRESHOLD:
@@ -401,6 +406,8 @@ def get_state_packet(self, valid=True):
401406
"posePitchValidCount": self.pose.pitch_offseter.filtered_stat.n,
402407
"poseYawOffset": self.pose.yaw_offseter.filtered_stat.mean(),
403408
"poseYawValidCount": self.pose.yaw_offseter.filtered_stat.n,
409+
"phoneProbOffset": self.phone.prob_offseter.filtered_stat.mean(),
410+
"phoneProbalidCount": self.phone.prob_offseter.filtered_stat.n,
404411
"stepChange": self.step_change,
405412
"awarenessActive": self.awareness_active,
406413
"awarenessPassive": self.awareness_passive,

0 commit comments

Comments
 (0)