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 np
from scipy import signal

class 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(), # 0-1, 越高越警觉
'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)

# 模拟正常 EEG (30秒, 4通道, 250Hz)
normal_eeg = np.random.randn(4, 7500) * 50 # 50μV

# 模拟困倦 EEG (theta 增加)
t = np.arange(7500) / 250
drowsy_eeg = normal_eeg + np.sin(2 * np.pi * 6 * t) * 80 # 6Hz theta

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 np

class 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
)

# FFT
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 间期
rr_alert = np.random.exponential(0.8, 300) * 0.9 + 0.5 # HR ~75bpm, 高变异

# 模拟疲劳状态 RR 间期
rr_fatigue = np.random.exponential(0.95, 300) * 0.5 + 0.8 # HR ~63bpm, 低变异

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 # 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):.1f}%")
saccade_alert = et.compute_saccade_pattern(alert_gaze_x, alert_gaze_y)
print(f" 扫视熵: {saccade_alert['gaze_entropy']:.2f}")
print(f" 警觉等级: {saccade_alert['vigilance_level']}")

print("\n疲劳状态:")
print(f" PERCLOS: {et.compute_perclos(fatigue_openness):.1f}%")
saccade_fatigue = et.compute_saccade_pattern(fatigue_gaze_x, fatigue_gaze_y)
print(f" 扫视熵: {saccade_fatigue['gaze_entropy']:.2f}")
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. 警觉性递减检测框架

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
# 航空 EEG+ECG 融合方案 → 汽车简化版
# 挑战:汽车场景无法使用 EEG(不实用)
# 替代方案:用 rPPG(远程光电容积)替代 ECG

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不实用 全部用非接触传感器
闭合回路 只有检测无干预 检测→干预→验证

参考文献

  1. 系统综述: Frontiers in Neuroergonomics, 2026
  2. EEG+ECG 飞行员疲劳: Frontiers in Human Neuroscience, 2026-02
  3. ATC 警觉性递减: Wahlgren 2023, Pothana 2025
  4. 航空疲劳: Flynn-Evans 2026 (短途航线昼夜节律)
  5. PRISMA 2020: 系统综述标准

发布时间: 2026-08-25 04:45
标签: ATC警觉性, 航空安全, EEG, ECG, 眼动, 机器学习, 跨领域, 高速公路催眠, IMS, 多模态融合