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
| """ 触觉警告模态注意力转移序列分析 基于 MDPI Systems 14(3):328 (2026)
核心方法: 1. 记录警告前后的注视点序列 2. 将注视分类为:道路/仪表/中控/手机/其他 3. 分析警告后的注视转移模式 4. 序列分析评估注意力回归速度
关键发现: - 触觉警告 → 道路注视恢复最快(0.6s) - 听觉警告 → 检测率最高但用户体验差 - 视觉警告 → 最慢(1.2s),分心时可能看不到 - 触觉+听觉 → 最佳综合表现 """
import numpy as np from typing import List, Tuple, Optional from dataclasses import dataclass
@dataclass class AlertModalityResult: """警告模态实验结果""" modality: str detection_rate: float response_time_ms: int road_fixation_recovery: float user_preference: float false_alarm_rate: float
class AttentionTransitionAnalyzer: """ 注意力转移序列分析器 将注视点序列编码为状态序列, 分析警告后的状态转移模式 状态定义: R = Road(道路) D = Dashboard(仪表) C = Center console(中控) P = Phone(手机) O = Other(其他) """ STATES = ['R', 'D', 'C', 'P', 'O'] MODALITY_RESULTS = { 'visual_only': AlertModalityResult( modality='visual_only', detection_rate=85.0, response_time_ms=1200, road_fixation_recovery=0.72, user_preference=0.55, false_alarm_rate=0.08 ), 'auditory_only': AlertModalityResult( modality='auditory_only', detection_rate=95.0, response_time_ms=800, road_fixation_recovery=0.85, user_preference=0.40, false_alarm_rate=0.12 ), 'haptic_only': AlertModalityResult( modality='haptic_only', detection_rate=90.0, response_time_ms=600, road_fixation_recovery=0.91, user_preference=0.75, false_alarm_rate=0.05 ), 'haptic_auditory': AlertModalityResult( modality='haptic_auditory', detection_rate=98.0, response_time_ms=500, road_fixation_recovery=0.96, user_preference=0.60, false_alarm_rate=0.06 ), } def analyze_transition_sequence(self, gaze_sequence: List[str], alert_time: int) -> dict: """ 分析警告前后的注视转移序列 Args: gaze_sequence: 注视状态序列 ['R', 'P', 'C', 'R', ...] alert_time: 警告触发时刻(序列索引) Returns: analysis: 转移模式分析 """ pre_alert = gaze_sequence[:alert_time] post_alert = gaze_sequence[alert_time:] pre_road_ratio = sum(1 for s in pre_alert if s == 'R') / max(len(pre_alert), 1) recovery_time = 0 for i, state in enumerate(post_alert): if state == 'R': recovery_time = i break post_10 = post_alert[:10] post_road_ratio = sum(1 for s in post_10 if s == 'R') / max(len(post_10), 1) transitions = {} for i in range(len(gaze_sequence) - 1): pair = (gaze_sequence[i], gaze_sequence[i+1]) transitions[pair] = transitions.get(pair, 0) + 1 road_return_transitions = { k: v for k, v in transitions.items() if k[1] == 'R' and k[0] != 'R' } return { 'pre_alert_road_ratio': pre_road_ratio, 'post_alert_road_ratio': post_road_ratio, 'recovery_time_frames': recovery_time, 'recovery_time_ms': recovery_time * 100, 'road_return_transitions': road_return_transitions, 'improvement': post_road_ratio - pre_road_ratio, } def compare_modalities(self) -> dict: """对比各警告模态""" results = {} for modality, result in self.MODALITY_RESULTS.items(): results[modality] = { 'detection_rate': result.detection_rate, 'response_time_ms': result.response_time_ms, 'road_recovery': result.road_fixation_recovery, 'user_preference': result.user_preference, 'false_alarm_rate': result.false_alarm_rate, } return results def recommend_modality(self, scenario: str) -> str: """ 根据场景推荐最佳警告模态 Args: scenario: 'visual_distraction'/'cognitive_distraction'/'fatigue'/'emergency' """ recommendations = { 'visual_distraction': 'haptic_only', 'cognitive_distraction': 'haptic_auditory', 'fatigue': 'haptic_auditory', 'emergency': 'haptic_auditory', 'normal': 'haptic_only', } return recommendations.get(scenario, 'haptic_only')
if __name__ == "__main__": analyzer = AttentionTransitionAnalyzer() print("=== 警告模态对比 ===") results = analyzer.compare_modalities() print(f"{'模态':<20} {'检测率%':<10} {'响应ms':<10} {'道路恢复%':<12} {'偏好':<8} {'误报%':<8}") print("-" * 70) for modality, data in results.items(): print(f"{modality:<20} {data['detection_rate']:<10.1f} " f"{data['response_time_ms']:<10} {data['road_recovery']:<12.2f} " f"{data['user_preference']:<8.2f} {data['false_alarm_rate']:<8.2f}") np.random.seed(42) distracted_gaze = ['R', 'R', 'P', 'P', 'P', 'C', 'P', 'P', 'R', 'R', 'R', 'R', 'R'] analysis = analyzer.analyze_transition_sequence(distracted_gaze, alert_time=8) print(f"\n=== 模拟分心→警告→恢复 ===") print(f"警告前道路注视: {analysis['pre_alert_road_ratio']:.2f}") print(f"警告后道路注视(10帧): {analysis['post_alert_road_ratio']:.2f}") print(f"恢复时间: {analysis['recovery_time_ms']}ms") print(f"改善: {analysis['improvement']:.2f}") print(f"\n=== 场景推荐 ===") for scenario in ['visual_distraction', 'cognitive_distraction', 'fatigue', 'emergency', 'normal']: rec = analyzer.recommend_modality(scenario) print(f" {scenario}: {rec}") print(f"\n=== 触觉反馈技术实现 ===") print(f" 方向盘振动电机: LRA线性谐振执行器") print(f" 振动频率: 150-250 Hz(最佳皮肤感知)") print(f" 振动模式: 单脉冲/双脉冲/连续/渐强") print(f" 定位精度: 左右分离(左右手感知不同方向)") print(f" 延迟: <50ms(从触发到振动)") print(f" 成本: $3-8/方向盘")
|