ATC 警觉性递减的系统综述:从航空管制到 IMS 座舱监控的跨领域启示
当空管员在 6 小时持续监控中失去注意力,没有日志、没有告警、没有可恢复的痕迹。Frontiers 系统综述分析了 34 篇文献,涵盖 EEG/ECG/眼动/机器学习,揭示了从实验室到运营线之间的巨大鸿沟——这对汽车 IMS 开发有直接启示。
论文信息
项目
内容
标题
Vigilance decrements in air traffic control as an aviation safety risk: a systematic review of modeling and prediction approaches
期刊
Frontiers in Neuroergonomics
DOI
10.3389/fnrgo.2026.1874304
发表日期
2026-08
综述范围
PubMed + Scopus + WoS, 34 篇文献, PRISMA 2020
搜索时间
2025-01 初搜, 2026-02 前引更新
核心发现 警觉性递减的双重陷阱 1 2 3 低负载 → 脱离 → 漏检信号 ──┐ ├──→ 事故(无恢复痕迹) 高负载 → 过载 → 分辨率下降 ──┘
状态
原因
表现
检测难度
低负载脱离
任务单调
遗漏冲突告警
极难(无外部表现)
高负载过载
超出能力
分辨率下降
中等(有行为指标)
自动化被动
自动化接管
响应延迟
难(看似正常)
时间压力
紧急任务
协调错误
中等
三类测量方法对比
方法类别
具体手段
灵敏度
部署可行性
实时性
主观评分
KSS, NASA-TLX
高(事后)
极高
差(需中断)
行为指标
反应时, 错误率
中
高
好
生理信号
EEG/ECG/HRV/眼动
高
低-中
好
多模态融合
上述组合
最高
中
好
生理信号详解 1. EEG(脑电图) 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 """ ATC 警觉性 EEG 特征 论文发现的关键 EEG 指标: - Theta 功率增加(4-8Hz)→ 困倦信号 - Alpha 回弹(8-13Hz)→ 注意力脱离 - Alpha/Theta 比率 → 警觉水平 """ import numpy as npfrom scipy import signalclass ATCVigilanceEEG : """ ATC 警觉性 EEG 监测器 关键特征提取: 1. Theta 功率 (4-8 Hz) - 困倦 2. Alpha 功率 (8-13 Hz) - 放松/脱离 3. Alpha/Theta ratio - 警觉指数 4. 事件相关电位 (ERP) - 注意力 """ def __init__ (self, fs: int = 250 ): self .fs = fs self .bands = { 'delta' : (0.5 , 4 ), 'theta' : (4 , 8 ), 'alpha' : (8 , 13 ), 'beta' : (13 , 30 ), 'gamma' : (30 , 100 ) } def extract_features (self, eeg: np.ndarray ) -> dict : """ Args: eeg: (channels, samples) EEG 信号 Returns: features: 警觉性相关特征 """ n_ch, n_s = eeg.shape freqs, psd = signal.welch(eeg, fs=self .fs, nperseg=256 ) band_power = {} for band, (f_low, f_high) in self .bands.items(): mask = (freqs >= f_low) & (freqs < f_high) band_power[band] = np.mean(psd[:, mask], axis=1 ) theta_alpha_ratio = ( band_power['theta' ] / (band_power['alpha' ] + 1e-8 ) ) vigilance_score = 1.0 / (1.0 + theta_alpha_ratio) return { 'theta_power' : band_power['theta' ].mean(), 'alpha_power' : band_power['alpha' ].mean(), 'theta_alpha_ratio' : theta_alpha_ratio.mean(), 'vigilance_score' : vigilance_score.mean(), 'level' : self ._classify_vigilance(vigilance_score.mean()) } def _classify_vigilance (self, score: float ) -> str : if score > 0.7 : return "ALERT" elif score > 0.5 : return "COMPLACENT" elif score > 0.3 : return "DROWSY" else : return "CRITICAL" if __name__ == "__main__" : np.random.seed(42 ) normal_eeg = np.random.randn(4 , 7500 ) * 50 t = np.arange(7500 ) / 250 drowsy_eeg = normal_eeg + np.sin(2 * np.pi * 6 * t) * 80 detector = ATCVigilanceEEG() normal_features = detector.extract_features(normal_eeg) drowsy_features = detector.extract_features(drowsy_eeg) print ("正常状态:" , normal_features['level' ]) print (" 警觉分数: {:.3f}" .format (normal_features['vigilance_score' ])) print (" Theta/Alpha: {:.3f}" .format (normal_features['theta_alpha_ratio' ])) print ("\n困倦状态:" , drowsy_features['level' ]) print (" 警觉分数: {:.3f}" .format (drowsy_features['vigilance_score' ])) print (" Theta/Alpha: {:.3f}" .format (drowsy_features['theta_alpha_ratio' ]))
2. ECG/HRV(心率变异性) 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 """ ATC 警觉性 HRV 特征 关键发现: - LF/HF 比率下降 → 副交感神经主导 → 警觉降低 - RMSSD 增加 → 疲劳信号 - SDNN 与时间在岗负相关 """ import numpy as npclass ATCVigilanceHRV : """ HRV 警觉性监测 特征: 1. LF (0.04-0.15Hz) - 交感+副交感 2. HF (0.15-0.4Hz) - 副交感 3. LF/HF ratio - 自主神经平衡 4. RMSSD - 副交感指标 5. SDNN - 总变异性 """ def __init__ (self ): self .lf_band = (0.04 , 0.15 ) self .hf_band = (0.15 , 0.4 ) def extract_hrv (self, rr_intervals: np.ndarray ) -> dict : """ Args: rr_intervals: RR间期序列 (秒) Returns: hrv_features """ sdnn = np.std(rr_intervals) rmssd = np.sqrt(np.mean(np.diff(rr_intervals) ** 2 )) pnn50 = np.sum (np.abs (np.diff(rr_intervals)) > 50 ) / len (rr_intervals) t = np.cumsum(rr_intervals) rr_interp = np.interp( np.linspace(t[0 ], t[-1 ], len (rr_intervals) * 4 ), t, rr_intervals ) freqs = np.fft.fftfreq(len (rr_interp), d=np.mean(np.diff(t)) / 4 ) power = np.abs (np.fft.fft(rr_interp)) ** 2 lf_mask = (freqs >= self .lf_band[0 ]) & (freqs < self .lf_band[1 ]) hf_mask = (freqs >= self .hf_band[0 ]) & (freqs < self .hf_band[1 ]) lf_power = np.sum (power[lf_mask]) hf_power = np.sum (power[hf_mask]) lf_hf = lf_power / (hf_power + 1e-8 ) return { 'sdnn' : sdnn, 'rmssd' : rmssd, 'pnn50' : pnn50, 'lf_power' : lf_power, 'hf_power' : hf_power, 'lf_hf_ratio' : lf_hf, 'vigilance_indicator' : 'HIGH' if lf_hf > 1.5 else 'MODERATE' if lf_hf > 0.8 else 'LOW' } if __name__ == "__main__" : np.random.seed(42 ) rr_alert = np.random.exponential(0.8 , 300 ) * 0.9 + 0.5 rr_fatigue = np.random.exponential(0.95 , 300 ) * 0.5 + 0.8 hrv = ATCVigilanceHRV() print ("警觉状态:" ) alert_features = hrv.extract_hrv(rr_alert) for k, v in alert_features.items(): print (f" {k} : {v} " ) print ("\n疲劳状态:" ) fatigue_features = hrv.extract_hrv(rr_fatigue) for k, v in fatigue_features.items(): print (f" {k} : {v} " )
3. 眼动指标 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 """ ATC 警觉性眼动特征 关键指标: - PERCLOS → 疲劳标准指标 - 眨眼频率 → 警觉降低时减少 - 瞳孔直径 → 认知负载指标 - 扫视模式 → 注意力分配 - 注视时长 → 固定vs搜索 """ class ATCVigilanceEyeTracking : """ ATC 警觉性眼动监测 从航空到汽车的迁移: - ATC: 雷达屏幕扫描 → 汽车: 道路/后视镜扫描 - ATC: 仪表注视 → 汽车: 仪表盘/HUD注视 - ATC: 冲突检测延迟 → 汽车: 碰撞预警延迟 """ def __init__ (self, fps: int = 30 ): self .fps = fps def compute_perclos ( self, eye_openness: np.ndarray, threshold: float = 0.2 , window_sec: int = 60 ) -> float : """ PERCLOS: 标准疲劳指标 参数: eye_openness: 眼睑开度序列 (0-1), shape=(N,) threshold: 闭眼阈值 window_sec: 计算窗口(秒) """ window = int (window_sec * self .fps) if len (eye_openness) < window: return 0.0 perclos_values = [] for i in range (len (eye_openness) - window): w = eye_openness[i:i+window] closed_ratio = np.sum (w < threshold) / window perclos_values.append(closed_ratio * 100 ) return np.max (perclos_values) if perclos_values else 0.0 def compute_saccade_pattern (self, gaze_x: np.ndarray, gaze_y: np.ndarray ) -> dict : """ 扫视模式分析 ATC: 雷达屏幕扫描模式 → 警觉时系统性扫描, 疲劳时固定 汽车: 道路/后视镜/仪表盘扫描 → 同理 """ dx = np.diff(gaze_x) dy = np.diff(gaze_y) speed = np.sqrt(dx**2 + dy**2 ) saccade_threshold = np.percentile(speed, 90 ) n_saccades = np.sum (speed > saccade_threshold) gaze_entropy = self ._compute_entropy(gaze_x, gaze_y) return { 'mean_saccade_speed' : np.mean(speed), 'n_saccades' : n_saccades, 'gaze_entropy' : gaze_entropy, 'vigilance_level' : 'HIGH' if gaze_entropy > 2.0 else 'LOW' } def _compute_entropy (self, x, y, n_bins=10 ): """二维直方图熵""" hist, _, _ = np.histogram2d(x, y, bins=n_bins) hist = hist / hist.sum () hist = hist[hist > 0 ] return -np.sum (hist * np.log2(hist)) if __name__ == "__main__" : np.random.seed(42 ) n_frames = 30 * 60 et = ATCVigilanceEyeTracking() alert_openness = np.random.normal(0.8 , 0.05 , n_frames) alert_gaze_x = np.random.uniform(-1 , 1 , n_frames) alert_gaze_y = np.random.uniform(-0.5 , 0.5 , n_frames) fatigue_openness = np.random.normal(0.5 , 0.15 , n_frames) fatigue_openness[:100 ] = 0.1 fatigue_gaze_x = np.random.normal(0 , 0.1 , n_frames) fatigue_gaze_y = np.random.normal(0 , 0.1 , n_frames) print ("警觉状态:" ) print (f" PERCLOS: {et.compute_perclos(alert_openness):.1 f} %" ) saccade_alert = et.compute_saccade_pattern(alert_gaze_x, alert_gaze_y) print (f" 扫视熵: {saccade_alert['gaze_entropy' ]:.2 f} " ) print (f" 警觉等级: {saccade_alert['vigilance_level' ]} " ) print ("\n疲劳状态:" ) print (f" PERCLOS: {et.compute_perclos(fatigue_openness):.1 f} %" ) saccade_fatigue = et.compute_saccade_pattern(fatigue_gaze_x, fatigue_gaze_y) print (f" 扫视熵: {saccade_fatigue['gaze_entropy' ]:.2 f} " ) print (f" 警觉等级: {saccade_fatigue['vigilance_level' ]} " )
机器学习模型对比
模型类型
输入
准确率
实时性
个体校准
泛化能力
SVM
统计特征
75-85%
好
需要
弱
Random Forest
统计特征
78-87%
好
需要
弱
CNN
频谱图
82-92%
中
部分
中
LSTM
时序信号
85-93%
中
部分
中
多模态融合
EEG+ECG+眼动
90-95%
中
需要
中
Transformer
多模态序列
92-96%
差
需要
较强
航空到汽车:跨领域映射
航空 ATC
汽车 IMS
共同挑战
差异
雷达屏幕扫描
道路扫描
扫视模式退化
ATC静态 vs 驾驶动态
6小时班次
长途驾驶
时间相关退化
驾驶有物理操作
低流量脱离
高速公路催眠
低负载脱离
触发条件不同
高流量过载
城市复杂路况
高负载过载
ATC纯认知 vs 驾驶有运动
自动化被动
ADAS过度信任
自动化依赖
相同核心问题
冲突检测延迟
碰撞预警延迟
检测能力下降
安全余量不同
无恢复痕迹
无恢复痕迹
事后无证据
相同
IMS 开发启示 1. 警觉性递减检测框架
graph TB
subgraph "感知层"
A[IR 摄像头<br/>PERCLOS/眨眼/瞳孔]
B[ECG 传感器<br/>HRV/LF-HF]
C[方向盘传感器<br/>握力/微动]
D[驾驶行为<br/>车道偏离/反应时]
end
subgraph "特征层"
E[眼动特征<br/>PERCLOS/扫视熵]
F[心电特征<br/>RMSSD/LF-HF]
G[行为特征<br/>操控频率/幅度]
H[车辆特征<br/>车道偏/速度变]
end
subgraph "融合层"
I[多模态 LLM<br/>统一警觉评估]
end
subgraph "决策层"
J{警觉等级}
K[ALERT<br/>正常]
L[COMPLACENT<br/>提醒]
M[DROWSY<br/>一级警告]
N[CRITICAL<br/>二级警告+干预]
end
A --> E
B --> F
C --> G
D --> H
E --> I
F --> I
G --> I
H --> I
I --> J
J --> K
J --> L
J --> M
J --> N
2. 从 ATC 借鉴的关键设计原则
原则
ATC 经验
IMS 落地
双向检测
区分低负载脱离 vs 高负载过载
高速公路 vs 城市路况分别建模
个体校准
每个管制员基线不同
驾驶员基线建模(前10分钟)
实时要求
<1秒延迟
<500ms 延迟
多模态融合
EEG+ECG+眼动最佳
IR摄像头+方向盘+车辆状态
自动化被动
自动化导致脱离
ADAS 导致监控失效
无痕迹问题
事后无证据
需要全程记录
3. EEG+ECG 88.42% 准确率方案
2026年2月《Frontiers in Human Neuroscience》研究:EEG+ECG 融合检测飞行员疲劳准确率 88.42%。
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 cabin_vigilance_config = { "stage_1_2026Q4" : { "sensors" : ["IR摄像头" , "方向盘握力" , "CAN总线" ], "features" : ["PERCLOS" , "眨眼频率" , "扫视模式" , "操控频率" , "车道偏离" ], "model" : "多模态Transformer" , "target_accuracy" : ">85%" , "deployment" : "QCS8255" }, "stage_2_2027Q1" : { "add_sensors" : ["rPPG(RGB-IR摄像头)" ], "add_features" : ["HRV" , "LF/HF ratio" , "RMSSD" ], "target_accuracy" : ">90%" , "note" : "rPPG 替代 ECG,无需接触" }, "stage_3_2027Q3" : { "add_sensors" : ["座椅压电传感器" ], "add_features" : ["呼吸频率" , "体动检测" ], "target_accuracy" : ">92%" , "note" : "多模态融合接近ATC水平" } }
4. 低负载脱离检测(高速公路催眠) 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 """ 高速公路催眠:最危险的警觉递减模式 ATC 经验:低流量时段脱离 → 漏检 汽车对应:高速公路平直路段 → 驾驶员脱离 检测方案: 1. 扫视频率下降(眼动) 2. PERCLOS 缓慢上升 3. 方向盘微调减少 4. 车道偏离频率增加 5. HRV 变化(rPPG) """ highway_hypnosis_detection = { "trigger_conditions" : [ "车速 > 80km/h" , "道路曲率 < 0.01 (平直)" , "持续 > 15 分钟" ], "features" : { "eye" : ["PERCLOS趋势(斜率>0.1%/min)" , "扫视频率<3次/min" ], "vehicle" : ["方向盘微调频率<2次/min" , "车道偏离>15cm" ], "physio" : ["呼吸频率变化" , "rPPG HRV下降" ] }, "alert_logic" : """ IF 扫视频率 < 3次/min AND PERCLOS斜率 > 0.1%/min: ALERT 一级警告(轻度脱离) IF PERCLOS > 15% AND 方向盘微调 < 1次/min: ALERT 二级警告(严重脱离) IF PERCLOS > 30% OR 闭眼 > 2秒: ALERT 三级警告(紧急干预) """ , "intervention" : [ "一级: 轻微座椅振动 + 提示音" , "二级: 强烈警示 + 空调降温 + 建议休息" , "三级: ADAS介入 + 减速靠边 + 紧急呼叫" ] }
系统综述揭示的研究空白
空白
现状
IMS 需要解决的
实时部署
实验室到运营线距离大
车载实时处理
个体校准
多数模型需要
首次驾驶10分钟自动校准
多模态融合
优于单模态但复杂
rPPG+眼动+行为三模态
自动化被动
自动化导致脱离
ADAS信任监控
非侵入性
EEG不实用
全部用非接触传感器
闭合回路
只有检测无干预
检测→干预→验证
参考文献
系统综述: Frontiers in Neuroergonomics, 2026
EEG+ECG 飞行员疲劳: Frontiers in Human Neuroscience, 2026-02
ATC 警觉性递减: Wahlgren 2023, Pothana 2025
航空疲劳: Flynn-Evans 2026 (短途航线昼夜节律)
PRISMA 2020: 系统综述标准
发布时间: 2026-08-25 04:45标签: ATC警觉性, 航空安全, EEG, ECG, 眼动, 机器学习, 跨领域, 高速公路催眠, IMS, 多模态融合