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
| """ 接管准备度量化模型 参考: Tobii接管准备度研究 """ import numpy as np
class TakeoverReadiness: """ 驾驶员接管准备度评估器 ======================== 输入信号: 1. 视线方向 (az, el) - 注意力恢复指标 2. 眨眼频率 - 认知恢复指标 3. 手在方向盘 - 物理就位指标 4. 头部姿态 - 环境理解指标 5. 历史接管时间 - 个人基线 输出: - readiness_score: 0-100 - estimated_takeover_time: 秒 - confidence: 0-1 决策: - score>80: 可在3s内接管 - score 50-80: 需5s - score 20-50: 需10s - score<20: 无法接管→紧急停车 """ def __init__(self): self.weights = { 'gaze_on_road': 0.30, 'blink_rate': 0.15, 'hands_on_wheel': 0.25, 'head_pose': 0.15, 'cognitive_engagement': 0.15 } def assess(self, dms_data: dict) -> dict: """ 评估接管准备度 Args: dms_data: { 'gaze_direction': (az, el), 'gaze_on_road': bool, 'blink_rate': float, # blinks/min 'hands_on_wheel': bool, 'head_pose': (pitch, yaw, roll), 'eyes_open': bool, 'time_since_alert': float # 秒 } Returns: readiness assessment """ scores = {} gaze_on_road = dms_data.get('gaze_on_road', False) scores['gaze_on_road'] = 100 if gaze_on_road else 0 blink_rate = dms_data.get('blink_rate', 15) if 12 <= blink_rate <= 25: scores['blink_rate'] = 100 elif 8 <= blink_rate < 12 or 25 < blink_rate <= 35: scores['blink_rate'] = 60 else: scores['blink_rate'] = 20 scores['hands_on_wheel'] = 100 if dms_data.get('hands_on_wheel') else 0 pitch, yaw, roll = dms_data.get('head_pose', (0, 0, 0)) if abs(yaw) < 15 and abs(pitch) < 20: scores['head_pose'] = 100 elif abs(yaw) < 30 and abs(pitch) < 30: scores['head_pose'] = 50 else: scores['head_pose'] = 10 cognitive = 50 if gaze_on_road and dms_data.get('eyes_open', True): cognitive = 80 if dms_data.get('time_since_alert', 0) > 2: cognitive = 90 scores['cognitive_engagement'] = cognitive total = sum(scores[k] * self.weights[k] for k in scores) if total >= 80: est_time = 2.5 elif total >= 50: est_time = 5.0 elif total >= 20: est_time = 10.0 else: est_time = -1 return { 'readiness_score': round(total, 1), 'estimated_takeover_time': est_time, 'can_takeover': total >= 20, 'component_scores': scores, 'confidence': min(0.95, total / 100) }
if __name__ == "__main__": readiness = TakeoverReadiness() result = readiness.assess({ 'gaze_direction': (-25, -10), 'gaze_on_road': False, 'blink_rate': 10, 'hands_on_wheel': True, 'head_pose': (-10, -20, 0), 'eyes_open': True, 'time_since_alert': 0 }) print(f"看手机: readiness={result['readiness_score']}, time={result['estimated_takeover_time']}s") result = readiness.assess({ 'gaze_direction': (0, 0), 'gaze_on_road': True, 'blink_rate': 18, 'hands_on_wheel': True, 'head_pose': (0, 5, 0), 'eyes_open': True, 'time_since_alert': 3 }) print(f"已恢复: readiness={result['readiness_score']}, time={result['estimated_takeover_time']}s") result = readiness.assess({ 'gaze_direction': (0, 30), 'gaze_on_road': False, 'blink_rate': 0, 'hands_on_wheel': False, 'head_pose': (20, 0, 5), 'eyes_open': False, 'time_since_alert': 0 }) print(f"睡觉中: readiness={result['readiness_score']}, can_takeover={result['can_takeover']}")
|