1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
| """ Euro NCAP 2026 DMS-ADAS融合感知 上下文感知分心判定引擎
判定逻辑: DMS注视检测 + ADAS状态 + 车速 + 驾驶模式 → 分心判定
合理分心场景: - 城市道路低速驾驶(车速<30km/h) - 高速公路自动驾驶模式(L2+激活) - FCW触发后的注视检查 - 车辆静止 - 倒车模式
不合理分心场景: - 高速公路高速驾驶(车速>80km/h) - 城市道路中等速度(车速30-50km/h) - L2+未激活的手动驾驶 """
import numpy as np from typing import Dict, Tuple from dataclasses import dataclass from enum import Enum
class DistractionLevel(Enum): """分心等级""" NO_DISTRACTION = 0 REASONABLE_DISTRACTION = 1 MILD_DISTRACTION = 2 SEVERE_DISTRACTION = 3
@dataclass class DMSState: """DMS状态""" gaze_forward: bool gaze_deviation_deg: float eyes_closed: bool eyes_closed_duration_sec: float
@dataclass class ADASState: """ADAS状态""" vehicle_speed_kmh: float l2_plus_active: bool fcw_triggered: bool driving_mode: str reverse_mode: bool
class ContextAwareDistractionClassifier: """ 上下文感知分心分类器 Euro NCAP判定逻辑: 合理分心(不警告): - 车速<30km/h:城市低速驾驶,注视偏离不警告 - L2+激活:自动驾驶模式,注视偏离不警告 - FCW触发后注视检查:驾驶员响应FCW,注视偏离不警告 - 倒车模式:驾驶员查看后视镜,注视偏离不警告 - 车辆静止:车速=0,注视偏离不警告 不合理分心(警告): - 车速>80km/h:高速驾驶,注视偏离>3秒警告 - 车速30-50km/h:城市中等速度,注视偏离>10秒警告 - L2+未激活手动驾驶:注视偏离>3秒警告 """ def __init__(self): self.low_speed_threshold_kmh = 30 self.high_speed_threshold_kmh = 80 self.long_distraction_threshold_sec = 3 self.short_distraction_threshold_sec = 10 def classify_distraction(self, dms_state: DMSState, adas_state: ADASState) -> Tuple[DistractionLevel, str]: """ 分类分心等级 Args: dms_state: DMS状态 adas_state: ADAS状态 Returns: (level, reason): 分心等级,判定原因 """ if dms_state.gaze_forward and not dms_state.eyes_closed: return DistractionLevel.NO_DISTRACTION, "注视前方道路" if adas_state.vehicle_speed_kmh < self.low_speed_threshold_kmh: return DistractionLevel.REASONABLE_DISTRACTION, \ "低速城市驾驶(车速<30km/h)" if adas_state.l2_plus_active: return DistractionLevel.REASONABLE_DISTRACTION, \ "L2+自动驾驶模式激活" if adas_state.fcw_triggered and not dms_state.gaze_forward: return DistractionLevel.REASONABLE_DISTRACTION, \ "FCW触发后注视检查" if adas_state.reverse_mode: return DistractionLevel.REASONABLE_DISTRACTION, \ "倒车模式(查看后视镜)" if adas_state.vehicle_speed_kmh == 0: return DistractionLevel.REASONABLE_DISTRACTION, \ "车辆静止状态" if adas_state.vehicle_speed_kmh > self.high_speed_threshold_kmh: if dms_state.gaze_deviation_deg > 15: return DistractionLevel.SEVERE_DISTRACTION, \ "高速驾驶重度分心(车速>80km/h)" else: return DistractionLevel.MILD_DISTRACTION, \ "高速驾驶轻度分心(车速>80km/h)" if adas_state.vehicle_speed_kmh >= self.low_speed_threshold_kmh: if dms_state.gaze_deviation_deg > 15: return DistractionLevel.MILD_DISTRACTION, \ "城市道路分心(车速30-80km/h)" return DistractionLevel.NO_DISTRACTION, "默认判定" def generate_warning_command(self, distraction_level: DistractionLevel, dms_state: DMSState, adas_state: ADASState) -> Dict: """ 生成警告指令 Args: distraction_level: 分心等级 dms_state: DMS状态 adas_state: ADAS状态 Returns: warning_command: 警告指令 """ if distraction_level == DistractionLevel.NO_DISTRACTION: return {'action': 'clear_warning'} if distraction_level == DistractionLevel.REASONABLE_DISTRACTION: return {'action': 'no_warning', 'reason': '合理分心'} warning_command = { 'level': distraction_level.value, 'dms_state': { 'gaze_forward': dms_state.gaze_forward, 'gaze_deviation_deg': dms_state.gaze_deviation_deg, 'eyes_closed': dms_state.eyes_closed }, 'adas_state': { 'vehicle_speed_kmh': adas_state.vehicle_speed_kmh, 'l2_plus_active': adas_state.l2_plus_active }, 'visual': None, 'audible': None, 'adas_adjustment': None } if distraction_level == DistractionLevel.MILD_DISTRACTION: warning_command['visual'] = { 'icon': 'distraction_warning_yellow', 'text': 'KEEP EYES ON ROAD - Distraction detected', 'duration': '5_sec' } elif distraction_level == DistractionLevel.SEVERE_DISTRACTION: warning_command['visual'] = { 'icon': 'distraction_danger_red', 'text': 'SEVERE DISTRACTION - Focus on driving immediately', 'duration': 'persistent' } warning_command['audible'] = { 'type': 'urgent_beep', 'duration_sec': 3 } warning_command['adas_adjustment'] = { 'fcw_sensitivity_boost': 0.5, 'aeb_threshold_reduction': 0.2 } return warning_command
if __name__ == "__main__": classifier = ContextAwareDistractionClassifier() print("=== DMS-ADAS融合感知测试 ===") dms1 = DMSState(gaze_forward=False, gaze_deviation_deg=30, eyes_closed=False, eyes_closed_duration_sec=0) adas1 = ADASState(vehicle_speed_kmh=20, l2_plus_active=False, fcw_triggered=False, driving_mode="manual", reverse_mode=False) level1, reason1 = classifier.classify_distraction(dms1, adas1) print(f"\n场景1(低速城市驾驶):") print(f" 车速:{adas1.vehicle_speed_kmh} km/h") print(f" 注视偏离:{dms1.gaze_deviation_deg}°") print(f" 分心等级:{level1.name}") print(f" 判定原因:{reason1}") dms2 = DMSState(gaze_forward=False, gaze_deviation_deg=20, eyes_closed=False, eyes_closed_duration_sec=0) adas2 = ADASState(vehicle_speed_kmh=100, l2_plus_active=True, fcw_triggered=False, driving_mode="auto", reverse_mode=False) level2, reason2 = classifier.classify_distraction(dms2, adas2) print(f"\n场景2(L2+自动驾驶):") print(f" 车速:{adas2.vehicle_speed_kmh} km/h") print(f" L2+激活:{adas2.l2_plus_active}") print(f" 注视偏离:{dms2.gaze_deviation_deg}°") print(f" 分心等级:{level2.name}") print(f" 判定原因:{reason2}") dms3 = DMSState(gaze_forward=False, gaze_deviation_deg=40, eyes_closed=False, eyes_closed_duration_sec=0) adas3 = ADASState(vehicle_speed_kmh=120, l2_plus_active=False, fcw_triggered=False, driving_mode="manual", reverse_mode=False) level3, reason3 = classifier.classify_distraction(dms3, adas3) warning3 = classifier.generate_warning_command(level3, dms3, adas3) print(f"\n场景3(高速手动驾驶):") print(f" 车速:{adas3.vehicle_speed_kmh} km/h") print(f" L2+激活:{adas3.l2_plus_active}") print(f" 注视偏离:{dms3.gaze_deviation_deg}°") print(f" 分心等级:{level3.name}") print(f" 判定原因:{reason3}") print(f" 警告指令:{warning3['visual']['text']}") print(f" ADAS调整:{warning3['adas_adjustment']}")
|