diff --git a/cereal/log.capnp b/cereal/log.capnp index 9db3e1d8c..a0f51acf5 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -2166,14 +2166,12 @@ struct DriverStateV2 { facePosition @2 :List(Float32); facePositionStd @3 :List(Float32); faceProb @4 :Float32; - eyesVisibleProb @14 :Float32; - eyesClosedProb @15 :Float32; + leftEyeProb @5 :Float32; + rightEyeProb @6 :Float32; + leftBlinkProb @7 :Float32; + rightBlinkProb @8 :Float32; + sunglassesProb @9 :Float32; phoneProb @13 :Float32; - leftEyeProbDEPRECATED @5 :Float32; - rightEyeProbDEPRECATED @6 :Float32; - leftBlinkProbDEPRECATED @7 :Float32; - rightBlinkProbDEPRECATED @8 :Float32; - sunglassesProbDEPRECATED @9 :Float32; notReadyProbDEPRECATED @12 :List(Float32); occludedProbDEPRECATED @10 :Float32; readyProbDEPRECATED @11 :List(Float32); diff --git a/opendbc_repo/opendbc/car/hyundai/interface.py b/opendbc_repo/opendbc/car/hyundai/interface.py index e265fb2d9..1f7e77e1b 100644 --- a/opendbc_repo/opendbc/car/hyundai/interface.py +++ b/opendbc_repo/opendbc/car/hyundai/interface.py @@ -201,9 +201,10 @@ class CarInterface(CarInterfaceBase): ret.vEgoStopping = 0.8 if candidate == CAR.HYUNDAI_PALISADE_2023: - ret.stopAccel = -1.5 - ret.stoppingDecelRate = 0.55 - ret.vEgoStopping = 0.7 + ret.startAccel = 1.1 + ret.stopAccel = -1.2 + ret.stoppingDecelRate = 0.45 + ret.vEgoStopping = 0.5 if candidate == CAR.KIA_NIRO_PHEV_2022: ret.stopAccel = -1.5 diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 1621346e7..1f60feded 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -175,9 +175,10 @@ class TestHyundaiFingerprint: toggles = get_test_toggles() CP = CarInterface.get_params(CAR.HYUNDAI_PALISADE_2023, gen_empty_fingerprint(), [], True, False, False, toggles) - assert CP.stopAccel == pytest.approx(-1.5) - assert CP.vEgoStopping == pytest.approx(0.7) - assert CP.stoppingDecelRate == pytest.approx(0.55) + assert CP.startAccel == pytest.approx(1.1) + assert CP.stopAccel == pytest.approx(-1.2) + assert CP.vEgoStopping == pytest.approx(0.5) + assert CP.stoppingDecelRate == pytest.approx(0.45) def test_kia_niro_phev_2022_longitudinal_params_soften_final_stop_hold(self): toggles = get_test_toggles() diff --git a/selfdrive/assets/icons_mici/onroad/glasses.png b/selfdrive/assets/icons_mici/onroad/glasses.png new file mode 100644 index 000000000..e1b080ab4 Binary files /dev/null and b/selfdrive/assets/icons_mici/onroad/glasses.png differ diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index 0812afa79..556b4dc92 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -49,7 +49,7 @@ MIN_LATERAL_CONTROL_SPEED = 0.3 CIVIC_BOSCH_MODIFIED_B_FIXED_FRICTION_THRESHOLD = 0.30 CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT = 1.20 CIVIC_BOSCH_MODIFIED_A_VARIANT_LAT_ACCEL_FACTOR_MULT = 1.00 -CIVIC_BOSCH_MODIFIED_B_VARIANT_LAT_ACCEL_FACTOR_MULT = 1.16 +CIVIC_BOSCH_MODIFIED_B_VARIANT_LAT_ACCEL_FACTOR_MULT = 1.26 CIVIC_BOSCH_MODIFIED_B_TRANSITION_SPEED = 12.0 CIVIC_BOSCH_MODIFIED_B_PHASE_SCALE = 0.10 CIVIC_BOSCH_MODIFIED_B_FF_ONSET = 0.18 @@ -76,16 +76,16 @@ CIVIC_BOSCH_MODIFIED_A_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.00 CIVIC_BOSCH_MODIFIED_A_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.00 CIVIC_BOSCH_MODIFIED_A_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.03 CIVIC_BOSCH_MODIFIED_A_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.07 -CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_LEFT = 0.19 -CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_RIGHT = 0.28 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.12 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.12 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 0.92 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 1.18 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.06 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.06 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.72 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 1.04 +CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_LEFT = 0.24 +CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_RIGHT = 0.34 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.06 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.06 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 1.18 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 1.48 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.03 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.03 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.88 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 1.20 BOLT_2022_2023_CARS = ( GM_CAR.CHEVROLET_BOLT_ACC_2022_2023, @@ -163,29 +163,29 @@ BOLT_2018_2021_UNWIND_FRICTION_REDUCTION_LEFT = 0.17 BOLT_2018_2021_UNWIND_FRICTION_REDUCTION_RIGHT = 0.27 BOLT_2022_2023_LATERAL_TESTING_GROUND_ID = testing_ground.id_5 -BOLT_2022_2023_FF_GAIN_LEFT = 0.13 -BOLT_2022_2023_FF_GAIN_RIGHT = 0.07 +BOLT_2022_2023_FF_GAIN_LEFT = 0.11 +BOLT_2022_2023_FF_GAIN_RIGHT = 0.06 BOLT_2022_2023_FF_ONSET = 0.12 BOLT_2022_2023_FF_ONSET_WIDTH = 0.07 BOLT_2022_2023_FF_CUTOFF = 1.35 BOLT_2022_2023_FF_CUTOFF_WIDTH = 0.28 BOLT_2022_2023_TRANSITION_SPEED = 9.0 BOLT_2022_2023_PHASE_SCALE = 0.12 -BOLT_2022_2023_TURN_IN_BOOST_LEFT = 0.12 -BOLT_2022_2023_TURN_IN_BOOST_RIGHT = 0.06 -BOLT_2022_2023_UNWIND_TAPER_LEFT = 0.28 -BOLT_2022_2023_UNWIND_TAPER_RIGHT = 0.24 -BOLT_2022_2023_FRICTION_MULT = 1.15 +BOLT_2022_2023_TURN_IN_BOOST_LEFT = 0.15 +BOLT_2022_2023_TURN_IN_BOOST_RIGHT = 0.09 +BOLT_2022_2023_UNWIND_TAPER_LEFT = 0.38 +BOLT_2022_2023_UNWIND_TAPER_RIGHT = 0.34 +BOLT_2022_2023_FRICTION_MULT = 1.13 BOLT_2022_2023_FRICTION_LAT_RISE = 0.22 BOLT_2022_2023_FRICTION_JERK_RISE = 0.26 BOLT_2022_2023_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.14 BOLT_2022_2023_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.08 -BOLT_2022_2023_UNWIND_THRESHOLD_INCREASE_LEFT = 0.20 -BOLT_2022_2023_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.16 +BOLT_2022_2023_UNWIND_THRESHOLD_INCREASE_LEFT = 0.26 +BOLT_2022_2023_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.22 BOLT_2022_2023_TURN_IN_FRICTION_BOOST_LEFT = 0.08 BOLT_2022_2023_TURN_IN_FRICTION_BOOST_RIGHT = 0.04 -BOLT_2022_2023_UNWIND_FRICTION_REDUCTION_LEFT = 0.21 -BOLT_2022_2023_UNWIND_FRICTION_REDUCTION_RIGHT = 0.17 +BOLT_2022_2023_UNWIND_FRICTION_REDUCTION_LEFT = 0.27 +BOLT_2022_2023_UNWIND_FRICTION_REDUCTION_RIGHT = 0.23 VOLT_STANDARD_LATERAL_TESTING_GROUND_ID = testing_ground.id_3 VOLT_STANDARD_FF_GAIN_LEFT = 0.09 @@ -218,29 +218,29 @@ VOLT_STANDARD_CENTER_TAPER_SPEED = 20.0 VOLT_STANDARD_CENTER_TAPER_SPEED_WIDTH = 2.5 GENESIS_G90_LATERAL_TESTING_GROUND_ID = testing_ground.id_4 -GENESIS_G90_FF_GAIN_LEFT = 0.17 -GENESIS_G90_FF_GAIN_RIGHT = 0.16 +GENESIS_G90_FF_GAIN_LEFT = 0.20 +GENESIS_G90_FF_GAIN_RIGHT = 0.10 GENESIS_G90_FF_ONSET = 0.10 GENESIS_G90_FF_ONSET_WIDTH = 0.05 -GENESIS_G90_FF_CUTOFF = 1.75 -GENESIS_G90_FF_CUTOFF_WIDTH = 0.36 +GENESIS_G90_FF_CUTOFF = 2.10 +GENESIS_G90_FF_CUTOFF_WIDTH = 0.42 GENESIS_G90_TRANSITION_SPEED = 8.5 GENESIS_G90_PHASE_SCALE = 0.12 -GENESIS_G90_TURN_IN_BOOST_LEFT = 0.34 -GENESIS_G90_TURN_IN_BOOST_RIGHT = 0.42 -GENESIS_G90_UNWIND_TAPER_LEFT = 0.24 -GENESIS_G90_UNWIND_TAPER_RIGHT = 0.34 +GENESIS_G90_TURN_IN_BOOST_LEFT = 0.42 +GENESIS_G90_TURN_IN_BOOST_RIGHT = 0.34 +GENESIS_G90_UNWIND_TAPER_LEFT = 0.18 +GENESIS_G90_UNWIND_TAPER_RIGHT = 0.48 GENESIS_G90_FRICTION_MULT = 1.02 GENESIS_G90_FRICTION_LAT_RISE = 0.22 GENESIS_G90_FRICTION_JERK_RISE = 0.24 -GENESIS_G90_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.14 -GENESIS_G90_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.18 -GENESIS_G90_UNWIND_THRESHOLD_INCREASE_LEFT = 0.16 -GENESIS_G90_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.26 -GENESIS_G90_TURN_IN_FRICTION_BOOST_LEFT = 0.09 -GENESIS_G90_TURN_IN_FRICTION_BOOST_RIGHT = 0.12 -GENESIS_G90_UNWIND_FRICTION_REDUCTION_LEFT = 0.14 -GENESIS_G90_UNWIND_FRICTION_REDUCTION_RIGHT = 0.22 +GENESIS_G90_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.18 +GENESIS_G90_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.15 +GENESIS_G90_UNWIND_THRESHOLD_INCREASE_LEFT = 0.10 +GENESIS_G90_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.32 +GENESIS_G90_TURN_IN_FRICTION_BOOST_LEFT = 0.11 +GENESIS_G90_TURN_IN_FRICTION_BOOST_RIGHT = 0.10 +GENESIS_G90_UNWIND_FRICTION_REDUCTION_LEFT = 0.10 +GENESIS_G90_UNWIND_FRICTION_REDUCTION_RIGHT = 0.30 IONIQ_6_FF_GAIN_LEFT = 0.045 IONIQ_6_FF_GAIN_RIGHT = 0.015 diff --git a/selfdrive/controls/tests/test_latcontrol.py b/selfdrive/controls/tests/test_latcontrol.py index 4293ae874..6b66146fe 100644 --- a/selfdrive/controls/tests/test_latcontrol.py +++ b/selfdrive/controls/tests/test_latcontrol.py @@ -227,7 +227,8 @@ class TestLatControl: left_unwind = get_genesis_g90_friction_threshold(6.0, 0.7, -0.8) right_unwind = get_genesis_g90_friction_threshold(6.0, -0.7, 0.8) assert left_turn_in < base - assert right_turn_in < left_turn_in + assert right_turn_in < base + assert left_turn_in < right_turn_in assert left_unwind > base assert right_unwind > left_unwind @@ -237,7 +238,7 @@ class TestLatControl: right_turn_in = get_genesis_g90_friction_scale(6.0, -0.7, -0.8) left_unwind = get_genesis_g90_friction_scale(6.0, 0.7, -0.8) right_unwind = get_genesis_g90_friction_scale(6.0, -0.7, 0.8) - assert right_turn_in > left_turn_in > base + assert left_turn_in > right_turn_in > base assert base > left_unwind > right_unwind def test_ioniq_6_ff_scale_curve(self): @@ -440,7 +441,7 @@ class TestLatControl: monkeypatch.setattr(latcontrol_torque, "civic_bosch_modified_lateral_testing_ground_active", lambda: True) variant_controller = LatControlTorque(CP.as_reader(), CI, DT_CTRL) - assert variant_controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.20 * 1.16) + assert variant_controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.20 * 1.26) def test_modified_civic_b_torque_ff_scale_curve(self): steady_left = get_civic_bosch_modified_b_ff_scale(0.5, 0.0, 12.0) diff --git a/selfdrive/modeld/dmonitoringmodeld.py b/selfdrive/modeld/dmonitoringmodeld.py index 1445e9bb3..4bfd43a02 100755 --- a/selfdrive/modeld/dmonitoringmodeld.py +++ b/selfdrive/modeld/dmonitoringmodeld.py @@ -78,7 +78,7 @@ def parse_model_output(model_output): face_descs = model_output[f'face_descs_{ds_suffix}'] parsed[f'face_descs_{ds_suffix}'] = face_descs[:, :-6] parsed[f'face_descs_{ds_suffix}_std'] = safe_exp(face_descs[:, -6:]) - for key in ['face_prob', 'eyes_visible_prob', 'eyes_closed_prob', 'using_phone_prob']: + for key in ['face_prob', 'left_eye_prob', 'right_eye_prob', 'left_blink_prob', 'right_blink_prob', 'sunglasses_prob', 'using_phone_prob']: parsed[f'{key}_{ds_suffix}'] = sigmoid(model_output[f'{key}_{ds_suffix}']) return parsed @@ -89,8 +89,11 @@ def fill_driver_data(msg, model_output, ds_suffix): msg.facePosition = model_output[f'face_descs_{ds_suffix}'][0, 3:5].tolist() msg.facePositionStd = model_output[f'face_descs_{ds_suffix}_std'][0, 3:5].tolist() msg.faceProb = model_output[f'face_prob_{ds_suffix}'][0, 0].item() - msg.eyesVisibleProb = model_output[f'eyes_visible_prob_{ds_suffix}'][0, 0].item() - msg.eyesClosedProb = model_output[f'eyes_closed_prob_{ds_suffix}'][0, 0].item() + msg.leftEyeProb = model_output[f'left_eye_prob_{ds_suffix}'][0, 0].item() + msg.rightEyeProb = model_output[f'right_eye_prob_{ds_suffix}'][0, 0].item() + msg.leftBlinkProb = model_output[f'left_blink_prob_{ds_suffix}'][0, 0].item() + msg.rightBlinkProb = model_output[f'right_blink_prob_{ds_suffix}'][0, 0].item() + msg.sunglassesProb = model_output[f'sunglasses_prob_{ds_suffix}'][0, 0].item() msg.phoneProb = model_output[f'using_phone_prob_{ds_suffix}'][0, 0].item() diff --git a/selfdrive/modeld/models/dmonitoring_model.onnx b/selfdrive/modeld/models/dmonitoring_model.onnx index 1cc4613bc..7d59ce24e 100644 Binary files a/selfdrive/modeld/models/dmonitoring_model.onnx and b/selfdrive/modeld/models/dmonitoring_model.onnx differ diff --git a/selfdrive/modeld/models/dmonitoring_model_metadata.pkl b/selfdrive/modeld/models/dmonitoring_model_metadata.pkl index a007b081a..71e4b289c 100644 Binary files a/selfdrive/modeld/models/dmonitoring_model_metadata.pkl and b/selfdrive/modeld/models/dmonitoring_model_metadata.pkl differ diff --git a/selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl b/selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl index 2cdadbc47..299065b59 100644 Binary files a/selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl and b/selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl differ diff --git a/selfdrive/monitoring/helpers.py b/selfdrive/monitoring/helpers.py index 891f62e4a..0761b3460 100644 --- a/selfdrive/monitoring/helpers.py +++ b/selfdrive/monitoring/helpers.py @@ -32,8 +32,9 @@ class DRIVER_MONITOR_SETTINGS: self._DISTRACTED_PROMPT_TIME_TILL_TERMINAL = 6. self._FACE_THRESHOLD = 0.7 - self._EYE_THRESHOLD = 0.5 - self._BLINK_THRESHOLD = 0.5 + self._EYE_THRESHOLD = 0.65 + self._SG_THRESHOLD = 0.9 + self._BLINK_THRESHOLD = 0.865 self._PHONE_THRESH = 0.5 self._POSE_PITCH_THRESHOLD = 0.3133 @@ -108,6 +109,13 @@ class DriverProb: self.prob_offseter = RunningStatFilter(raw_priors=raw_priors, max_trackable=max_trackable) self.prob_calibrated = False + +class DriverBlink: + def __init__(self): + self.left = 0. + self.right = 0. + + # model output refers to center of undistorted+leveled image EFL = 598.0 # focal length in K cam = DEVICE_CAMERAS[("tici", "ar0231")] # corrected image has same size as raw @@ -141,7 +149,7 @@ class DriverMonitoring: wheelpos_filter_raw_priors = (self.settings._WHEELPOS_DATA_AVG, self.settings._WHEELPOS_DATA_VAR, 2) self.wheelpos = DriverProb(raw_priors=wheelpos_filter_raw_priors, max_trackable=self.settings._WHEELPOS_MAX_COUNT) self.pose = DriverPose(settings=self.settings) - self.blink_prob = 0. + self.blink = DriverBlink() self.phone_prob = 0. self.always_on = always_on @@ -244,7 +252,7 @@ class DriverMonitoring: if pitch_error > pitch_threshold or yaw_error > yaw_threshold: distracted_types.append(DistractedType.DISTRACTED_POSE) - if self.blink_prob > self.settings._BLINK_THRESHOLD: + if (self.blink.left + self.blink.right) * 0.5 > self.settings._BLINK_THRESHOLD: distracted_types.append(DistractedType.DISTRACTED_BLINK) if self.phone_prob > self.settings._PHONE_THRESH: @@ -284,7 +292,10 @@ class DriverMonitoring: self.pose.yaw_std = driver_data.faceOrientationStd[1] model_std_max = max(self.pose.pitch_std, self.pose.yaw_std) self.pose.low_std = model_std_max < self.settings._POSESTD_THRESHOLD - self.blink_prob = driver_data.eyesClosedProb * (driver_data.eyesVisibleProb > self.settings._EYE_THRESHOLD) + self.blink.left = driver_data.leftBlinkProb * (driver_data.leftEyeProb > self.settings._EYE_THRESHOLD) \ + * (driver_data.sunglassesProb < self.settings._SG_THRESHOLD) + self.blink.right = driver_data.rightBlinkProb * (driver_data.rightEyeProb > self.settings._EYE_THRESHOLD) \ + * (driver_data.sunglassesProb < self.settings._SG_THRESHOLD) self.phone_prob = driver_data.phoneProb self.distracted_types = self._get_distracted_types() diff --git a/selfdrive/monitoring/test_monitoring.py b/selfdrive/monitoring/test_monitoring.py index 73f3dbadc..ffbb9e68a 100644 --- a/selfdrive/monitoring/test_monitoring.py +++ b/selfdrive/monitoring/test_monitoring.py @@ -19,8 +19,10 @@ def make_msg(face_detected, distracted=False, model_uncertain=False): ds.leftDriverData.faceOrientation = [0., 0., 0.] ds.leftDriverData.facePosition = [0., 0.] ds.leftDriverData.faceProb = 1. * face_detected - ds.leftDriverData.eyesVisibleProb = 1. - ds.leftDriverData.eyesClosedProb = 1. * distracted + ds.leftDriverData.leftEyeProb = 1. + ds.leftDriverData.rightEyeProb = 1. + ds.leftDriverData.leftBlinkProb = 1. * distracted + ds.leftDriverData.rightBlinkProb = 1. * distracted ds.leftDriverData.faceOrientationStd = [1.*model_uncertain, 1.*model_uncertain, 1.*model_uncertain] ds.leftDriverData.facePositionStd = [1.*model_uncertain, 1.*model_uncertain] # TODO: test both separately when e2e is used diff --git a/selfdrive/test/process_replay/model_replay.py b/selfdrive/test/process_replay/model_replay.py index 8c29f6540..9ba599bac 100755 --- a/selfdrive/test/process_replay/model_replay.py +++ b/selfdrive/test/process_replay/model_replay.py @@ -76,7 +76,7 @@ def generate_report(proposed, master, tmp, commit): (lambda x: get_idx_if_non_empty(x.wheelOnRightProb), "wheelOnRightProb"), (lambda x: get_idx_if_non_empty(x.leftDriverData.faceProb), "leftDriverData.faceProb"), (lambda x: get_idx_if_non_empty(x.leftDriverData.faceOrientation, 0), "leftDriverData.faceOrientation0"), - (lambda x: get_idx_if_non_empty(x.leftDriverData.eyesClosedProb), "leftDriverData.eyesClosedProb"), + (lambda x: get_idx_if_non_empty(x.leftDriverData.leftBlinkProb), "leftDriverData.leftBlinkProb"), (lambda x: get_idx_if_non_empty(x.leftDriverData.phoneProb), "leftDriverData.phoneProb"), (lambda x: get_idx_if_non_empty(x.rightDriverData.faceProb), "rightDriverData.faceProb"), ], "driverStateV2") diff --git a/selfdrive/ui/mici/onroad/driver_camera_dialog.py b/selfdrive/ui/mici/onroad/driver_camera_dialog.py index e8b8abb7f..764861e13 100644 --- a/selfdrive/ui/mici/onroad/driver_camera_dialog.py +++ b/selfdrive/ui/mici/onroad/driver_camera_dialog.py @@ -39,6 +39,8 @@ class BaseDriverCameraDialog(Widget): self._eye_fill_texture = None self._eye_orange_texture = None self._eye_size = 74 + self._glasses_texture = None + self._glasses_size = 171 self._load_eye_textures() @@ -152,6 +154,8 @@ class BaseDriverCameraDialog(Widget): self._eye_fill_texture = gui_app.texture("icons_mici/onroad/eye_fill.png", self._eye_size, self._eye_size) if self._eye_orange_texture is None: self._eye_orange_texture = gui_app.texture("icons_mici/onroad/eye_orange.png", self._eye_size, self._eye_size) + if self._glasses_texture is None: + self._glasses_texture = gui_app.texture("icons_mici/onroad/glasses.png", self._glasses_size, self._glasses_size) def _draw_face_detection(self, rect: rl.Rectangle): dm_state = ui_state.sm["driverMonitoringState"] @@ -198,21 +202,28 @@ class BaseDriverCameraDialog(Widget): eye_offset_x = 10 eye_offset_y = 10 eye_spacing = self._eye_size + 15 - eyes_prob = driver_data.eyesVisibleProb left_eye_x = rect.x + eye_offset_x left_eye_y = rect.y + eye_offset_y + left_eye_prob = driver_data.leftEyeProb right_eye_x = rect.x + eye_offset_x + eye_spacing right_eye_y = rect.y + eye_offset_y + right_eye_prob = driver_data.rightEyeProb # Draw eyes with opacity based on probability - fill_opacity = eyes_prob - orange_opacity = 1.0 - eyes_prob - for eye_x, eye_y in [(left_eye_x, left_eye_y), (right_eye_x, right_eye_y)]: + for eye_x, eye_y, eye_prob in [(left_eye_x, left_eye_y, left_eye_prob), (right_eye_x, right_eye_y, right_eye_prob)]: + fill_opacity = eye_prob + orange_opacity = 1.0 - eye_prob rl.draw_texture_v(self._eye_orange_texture, (eye_x, eye_y), rl.Color(255, 255, 255, int(255 * orange_opacity))) rl.draw_texture_v(self._eye_fill_texture, (eye_x, eye_y), rl.Color(255, 255, 255, int(255 * fill_opacity))) + glasses_x = rect.x + eye_offset_x - 4 + glasses_y = rect.y + glasses_pos = rl.Vector2(glasses_x, glasses_y) + glasses_prob = driver_data.sunglassesProb + rl.draw_texture_v(self._glasses_texture, glasses_pos, rl.Color(70, 80, 161, int(255 * glasses_prob))) + class DriverCameraDialog(NavWidget, BaseDriverCameraDialog): def __init__(self):