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
| """ AR-HUD 导航符号注意力影响分析 基于 Sustainability 18(18):9238 (2026)
核心方法:横向注视转换分析 - 将注视点分为:道路中心、左方、右方 - 分析符号呈现前后的转换模式 - 评估不同符号对注意力分布的影响 """
import numpy as np
class LateralFixationAnalyzer: """ 横向注视转换分析器 研究发现: - 箭头型符号 → 最少注视离开道路(78%道路注视) - 路径型符号 → 良好(72%) - 文字型符号 → 最差(65%,文字需要更多注视时间) 设计指导: - 优先使用箭头+路径组合 - 避免纯文字导航 - 关键信息在3秒内可吸收 """ ZONES = { 'road_center': (0.4, 0.6), 'left': (0.0, 0.4), 'right': (0.6, 1.0), } SYMBOL_TYPES = { 'arrow': {'road_attention': 0.78, 'transition_rate': 2.5, 'safety': 'best'}, 'path': {'road_attention': 0.72, 'transition_rate': 2.0, 'safety': 'good'}, 'text': {'road_attention': 0.65, 'transition_rate': 1.5, 'safety': 'caution'}, 'icon': {'road_attention': 0.70, 'transition_rate': 2.2, 'safety': 'acceptable'}, } def classify_fixation_zone(self, gaze_x: float) -> str: """将注视点x坐标分类为区域""" for zone, (low, high) in self.ZONES.items(): if low <= gaze_x < high: return zone return 'road_center' def compute_transition_matrix(self, gaze_sequence: np.ndarray) -> np.ndarray: """ 计算注视区域转移矩阵 返回 3×3 矩阵: [center→center, center→left, center→right, left→center, left→left, left→right, right→center, right→left, right→right] """ zones = [self.classify_fixation_zone(x) for x in gaze_sequence[:, 0]] zone_idx = {'road_center': 0, 'left': 1, 'right': 2} transitions = np.zeros((3, 3)) for i in range(1, len(zones)): from_zone = zone_idx[zones[i-1]] to_zone = zone_idx[zones[i]] transitions[from_zone, to_zone] += 1 row_sums = transitions.sum(axis=1, keepdims=True) transitions = transitions / (row_sums + 1e-8) return transitions def evaluate_safety(self, transition_matrix: np.ndarray, symbol_type: str) -> dict: """ 评估符号类型对安全的影响 Args: transition_matrix: 3×3 转移矩阵 symbol_type: 'arrow'/'path'/'text'/'icon' Returns: safety_assessment """ road_retention = transition_matrix[0, 0] departure_rate = transition_matrix[0, 1] + transition_matrix[0, 2] return_rate = (transition_matrix[1, 0] + transition_matrix[2, 0]) / 2 symbol_data = self.SYMBOL_TYPES.get(symbol_type, {}) expected_road_attention = symbol_data.get('road_attention', 0.7) return { 'symbol_type': symbol_type, 'road_retention': road_retention, 'departure_rate': departure_rate, 'return_rate': return_rate, 'expected_road_attention': expected_road_attention, 'safety_rating': symbol_data.get('safety', 'unknown'), }
|