dmonitoringd.py 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/env python3
  2. import gc
  3. import cereal.messaging as messaging
  4. from cereal import car
  5. from common.params import Params, put_bool_nonblocking
  6. from common.realtime import set_realtime_priority
  7. from selfdrive.controls.lib.events import Events
  8. from selfdrive.locationd.calibrationd import Calibration
  9. from selfdrive.monitoring.driver_monitor import DriverStatus
  10. def dmonitoringd_thread(sm=None, pm=None):
  11. gc.disable()
  12. set_realtime_priority(2)
  13. if pm is None:
  14. pm = messaging.PubMaster(['driverMonitoringState'])
  15. if sm is None:
  16. sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'controlsState', 'modelV2'], poll=['driverStateV2'])
  17. driver_status = DriverStatus(rhd_saved=Params().get_bool("IsRhdDetected"))
  18. sm['liveCalibration'].calStatus = Calibration.INVALID
  19. sm['liveCalibration'].rpyCalib = [0, 0, 0]
  20. sm['carState'].buttonEvents = []
  21. sm['carState'].standstill = True
  22. v_cruise_last = 0
  23. driver_engaged = False
  24. # 10Hz <- dmonitoringmodeld
  25. while True:
  26. sm.update()
  27. if not sm.updated['driverStateV2']:
  28. continue
  29. # Get interaction
  30. if sm.updated['carState']:
  31. v_cruise = sm['carState'].cruiseState.speed
  32. driver_engaged = len(sm['carState'].buttonEvents) > 0 or \
  33. v_cruise != v_cruise_last or \
  34. sm['carState'].steeringPressed or \
  35. sm['carState'].gasPressed
  36. v_cruise_last = v_cruise
  37. if sm.updated['modelV2']:
  38. driver_status.set_policy(sm['modelV2'], sm['carState'].vEgo)
  39. # Get data from dmonitoringmodeld
  40. events = Events()
  41. driver_status.update_states(sm['driverStateV2'], sm['liveCalibration'].rpyCalib, sm['carState'].vEgo, sm['controlsState'].enabled)
  42. # Block engaging after max number of distrations
  43. if driver_status.terminal_alert_cnt >= driver_status.settings._MAX_TERMINAL_ALERTS or \
  44. driver_status.terminal_time >= driver_status.settings._MAX_TERMINAL_DURATION:
  45. events.add(car.CarEvent.EventName.tooDistracted)
  46. # Update events from driver state
  47. driver_status.update_events(events, driver_engaged, sm['controlsState'].enabled, sm['carState'].standstill)
  48. # build driverMonitoringState packet
  49. dat = messaging.new_message('driverMonitoringState')
  50. dat.driverMonitoringState = {
  51. "events": events.to_msg(),
  52. "faceDetected": driver_status.face_detected,
  53. "isDistracted": driver_status.driver_distracted,
  54. "distractedType": sum(driver_status.distracted_types),
  55. "awarenessStatus": driver_status.awareness,
  56. "posePitchOffset": driver_status.pose.pitch_offseter.filtered_stat.mean(),
  57. "posePitchValidCount": driver_status.pose.pitch_offseter.filtered_stat.n,
  58. "poseYawOffset": driver_status.pose.yaw_offseter.filtered_stat.mean(),
  59. "poseYawValidCount": driver_status.pose.yaw_offseter.filtered_stat.n,
  60. "stepChange": driver_status.step_change,
  61. "awarenessActive": driver_status.awareness_active,
  62. "awarenessPassive": driver_status.awareness_passive,
  63. "isLowStd": driver_status.pose.low_std,
  64. "hiStdCount": driver_status.hi_stds,
  65. "isActiveMode": driver_status.active_monitoring_mode,
  66. "isRHD": driver_status.wheel_on_right,
  67. }
  68. pm.send('driverMonitoringState', dat)
  69. # save rhd virtual toggle every 5 mins
  70. if (sm['driverStateV2'].frameId % 6000 == 0 and
  71. driver_status.wheelpos_learner.filtered_stat.n > driver_status.settings._WHEELPOS_FILTER_MIN_COUNT and
  72. driver_status.wheel_on_right == (driver_status.wheelpos_learner.filtered_stat.M > driver_status.settings._WHEELPOS_THRESHOLD)):
  73. put_bool_nonblocking("IsRhdDetected", driver_status.wheel_on_right)
  74. def main(sm=None, pm=None):
  75. dmonitoringd_thread(sm, pm)
  76. if __name__ == '__main__':
  77. main()