铁路驾驶员多传感器疲劳实测:从模拟器到真实列车——首个真实运营条件下的全传感器部署

论文信息

项目 内容
标题 Multisensor Measurement of Train Driver Mental Fatigue: From Simulation to Reality
作者 Esther Bosch 等
发表 arXiv:2608.23361 (2026年8月)
链接 https://arxiv.org/abs/2608.23361
被试 模拟器14名 + 真实列车6名(职业驾驶员)
传感器 EEG + ECG + EDA + 眼动 + 行为
关键贡献 首个在真实列车运营条件下部署全传感器阵列的研究

核心发现

  1. HRV和呼吸率是唯一在模拟器和真实列车中均一致的疲劳指标:自主神经指标优于神经生理指标
  2. EEG在真实列车环境中失效:theta/alpha/beta功率在真实条件下未显示疲劳相关模式
  3. 真实运营环境的技术挑战:振动、传感器连接、高频数据采集三重难题
  4. 自动化→监督→疲劳链:铁路自动化将驾驶员角色从主动控制转为监督监控,加剧精神疲劳

问题定义

铁路驾驶员疲劳的特殊性

因素 汽车驾驶员 铁路驾驶员
任务类型 主动驾驶 监督监控(自动化后)
疲劳类型 困倦+物理疲劳 精神疲劳(MF)
持续时间 1-4小时 4-8小时
环境刺激 丰富(道路变化) 贫乏(固定轨道)
检测难度 有行为线索 无行为线索
危害后果 个体事故 大规模公共安全

研究空白

维度 现有研究 本研究填补
环境 模拟器为主 真实列车运营
传感器数 1-2种 全传感器阵列
被试 学生非专业 职业列车驾驶员
生态效度

方法详解

1. 实验设计

flowchart LR
    A[基线驾驶] --> B[1小时n-back任务<br/>诱导精神疲劳]
    B --> C[第二次驾驶]
    A --> D[多传感器记录]
    B --> D
    C --> D
    D --> D1[EEG 32通道]
    D --> D2[ECG 心电]
    D --> D3[EDA 皮肤电]
    D --> D4[眼动追踪]
    D --> D5[行为指标]
    D --> D6[主观量表]

2. 传感器配置

传感器 型号/规格 采样率 采集内容
EEG 32通道主动电极帽 500Hz 脑电(theta/alpha/beta)
ECG 胸贴式心电 500Hz HRV、心率、呼吸率
EDA 手腕皮肤电 100Hz 皮肤电导反应
眼动 Tobii Pro Glasses 100Hz 眨眼时长、注视、瞳孔
行为 驾驶日志 - 速度偏差、反应时
主观 NASA-TLX + KSS - 主观疲劳/工作负荷

3. 疲劳诱导协议

阶段 时长 任务 目的
基线驾驶 15min 正常驾驶 建立基线
疲劳诱导 60min 听觉n-back任务 标准化精神疲劳
后驾驶 15min 再次驾驶 检测疲劳效应

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

class FatigueIndicatorAnalyzer:
"""
疲劳指标分析器

按论文方法分析各传感器指标的疲劳敏感性
"""

def analyze_hrv(self, ecg: np.ndarray,
fs: int = 500) -> dict:
"""
ECG→HRV指标
"""
# R峰检测
r_peaks = self._detect_r(ecg, fs)
rr_intervals = np.diff(r_peaks) / fs

# 时域
mean_hr = 60 / np.mean(rr_intervals)
sdnn = np.std(rr_intervals)
rmssd = np.sqrt(np.mean(np.diff(rr_intervals)**2))

# 频域
freqs, power = self._welch_psd(rr_intervals, fs)

lf = np.sum(power[(freqs >= 0.04) & (freqs < 0.15)])
hf = np.sum(power[(freqs >= 0.15) & (freqs <= 0.4)])

return {
'mean_hr': mean_hr,
'sdnn': sdnn,
'rmssd': rmssd,
'lf_hf_ratio': lf / (hf + 1e-8),
'lf_power': lf,
'hf_power': hf,
'breathing_rate': self._extract_breathing(rr_intervals, fs)
}

def analyze_eeg(self, eeg: np.ndarray,
fs: int = 500) -> dict:
"""
EEG频域指标
"""
channels, n = eeg.shape
freqs, power = self._welch_psd(eeg, fs, axis=1)

theta = np.sum(power[(freqs >= 4) & (freqs < 8)], axis=1)
alpha = np.sum(power[(freqs >= 8) & (freqs < 13)], axis=1)
beta = np.sum(power[(freqs >= 13) & (freqs <= 30)], axis=1)

return {
'theta_power': theta,
'alpha_power': alpha,
'beta_power': beta,
'theta_alpha_ratio': theta / (alpha + 1e-8),
}

def analyze_eye(self, eye_data: np.ndarray,
fs: int = 100) -> dict:
"""
眼动指标
"""
blink_dur = self._detect_blinks(eye_data, fs)
pupil_diam = eye_data[:, 2] # 第3列为瞳孔直径

return {
'blink_duration': np.mean(blink_dur),
'blink_rate': len(blink_dur) / (len(eye_data)/fs/60),
'pupil_diameter': np.mean(pupil_diam),
'perclos': self._compute_perclos(eye_data, fs)
}

def _detect_r(self, ecg, fs):
"""Pan-Tompkins R峰检测(简化版)"""
from scipy.signal import find_peaks
# 带通滤波
b, a = sig.butter(2, [5/(fs/2), 15/(fs/2)], btype='band')
filtered = sig.filtfilt(b, a, ecg)
# 微分+平方
diff = np.diff(filtered) ** 2
# 移动平均
window = int(0.15 * fs)
smoothed = np.convolve(diff, np.ones(window)/window, mode='same')
# 峰值检测
peaks, _ = find_peaks(smoothed, distance=0.3*fs,
height=0.3*np.max(smoothed))
return peaks

def _welch_psd(self, data, fs, axis=-1):
"""Welch法功率谱估计"""
from scipy.signal import welch
if data.ndim == 1:
return welch(data, fs=fs, nperseg=min(256, len(data)))
else:
return welch(data, fs=fs, nperseg=min(256, data.shape[1]),
axis=axis)

def _detect_blinks(self, eye_data, fs):
"""眨眼检测"""
ear = eye_data[:, 3] # Eye Aspect Ratio
threshold = 0.2
below = ear < threshold
durations = []
i = 0
while i < len(below):
if below[i]:
start = i
while i < len(below) and below[i]:
i += 1
durations.append((i - start) / fs * 1000)
else:
i += 1
return durations

def _compute_perclos(self, eye_data, fs):
"""PERCLOS计算"""
ear = eye_data[:, 3]
threshold = 0.25
window = int(60 * fs) # 60秒窗口
perclos_values = []
for i in range(0, len(ear) - window, window):
segment = ear[i:i+window]
closed_ratio = np.mean(segment < threshold)
perclos_values.append(closed_ratio * 100)
return np.mean(perclos_values)

def _extract_breathing(self, rr_intervals, fs):
"""从RR间期提取呼吸率"""
rr = np.array(rr_intervals)
rr_interp = np.interp(
np.arange(0, len(rr), 0.01),
np.arange(len(rr)),
rr
)
freqs, power = self._welch_psd(rr_interp, 100)
resp_mask = (freqs >= 0.1) & (freqs <= 0.5)
if np.any(resp_mask):
peak_freq = freqs[resp_mask][np.argmax(power[resp_mask])]
return peak_freq * 60
return 0

实验结果

模拟器 vs 真实列车:指标一致性

指标 模拟器结果 真实列车结果 一致性 结论
HRV (SDNN) ↓25% (疲劳后) ↓22% (疲劳后) ✅ 一致 推荐
呼吸率 ↑1.8次/min ↑2.1次/min ✅ 一致 推荐
LF/HF比值 ↓18% ↓15% ✅ 一致 推荐
EEG theta功率 ↑30% 无显著变化 ❌ 不一致 需验证
EEG alpha功率 ↓20% 无显著变化 ❌ 不一致 需验证
EDA ↑15% 无显著趋势 ❌ 不一致 不推荐
眨眼时长 ↑12% 无显著趋势 ❌ 不一致 不推荐
PERCLOS ↑8% 无显著趋势 ❌ 不一致 不推荐

核心发现

自主神经指标(HRV/呼吸率)在两个环境中一致,神经生理指标(EEG)和外围指标(EDA/眼动)在真实环境中失效。

真实环境技术挑战

挑战 描述 影响 量化
振动 列车振动3-15Hz EEG/EDA传感器松动 15%数据丢失
传感器连接 长时间佩戴后电极脱落 数据中断 8%数据丢失
高频采集 多传感器同步 时间戳偏差 ±50ms抖动
电磁干扰 牵引电机/信号系统 EEG 50Hz工频 信噪比降3dB
空间限制 驾驶舱空间 传感器安装受限 -

IMS开发启示

1. 汽车vs铁路vs航空:疲劳指标选择

领域 推荐主指标 推荐辅指标 不推荐
汽车DMS PERCLOS+眼动 rPPG(HRV) EEG
铁路DMS HRV+呼吸率 眼动(辅助) EEG/EDA
航空DMS HRV+眼动融合 EEG(选配) EDA
船舶DMS HRV+眼动 行为指标 -

2. 为什么汽车PERCLOS在铁路不适用

原因 汽车 铁路
视觉负荷 高(频繁扫视) 低(固定轨道)
闭眼容忍 低(2秒闭眼危险) 高(可短暂闭眼)
PERCLOS阈值 15-30% 需调整
疲劳类型 困倦为主 精神疲劳为主
PERCLOS敏感度

3. 铁路DMS部署建议

指标 传感器 安装位置 采样率 成本
HRV ECG胸贴/腕带 驾驶员身上 250Hz $20-50
呼吸率 ECG衍生 同上 同上 免费
心率 同上 同上 同上 免费
眼动 红外摄像头 仪表台 30fps $50
行为 操作日志 列车系统 - $0

铁路DMS最小可行方案:ECG胸贴/腕带 + 红外摄像头,BOM<$100

4. 从铁路到汽车的逆向启示

启示 铁路发现 汽车应用
HRV是生态鲁棒指标 真实列车验证 加强DMS rPPG→HRV模块
EEG在振动环境失效 列车振动致EEG无效 汽车路面振动同理,EEG不可靠
自动化加剧疲劳 铁路监督任务→精神疲劳 L3/L4自动驾驶同样:驾驶员监督比驾驶更累
呼吸率被低估 从RR间期提取,无需额外传感器 ECG/rPPG均可衍生呼吸率

5. Euro NCAP 2026关联

ENCAP功能 铁路启示 优先级
疲劳检测 HRV是核心鲁棒指标 P0
分心检测 眼动在铁路中不敏感 保持但降权
健康监测 HRV+呼吸率一体化 P1
干预策略 精神疲劳≠困倦,干预方式不同 P2

跨领域疲劳检测对比

领域 主指标 辅指标 环境挑战 量产方案
汽车 PERCLOS rPPG→HRV 光照/遮挡 摄像头DMS
铁路 HRV 眼动 振动/空间 ECG+摄像头
航空 HRV+眼动 EEG 低光/噪声 胸贴+摄像头
船舶 HRV 行为 摇晃/潮湿 腕带+摄像头
矿区 PERCLOS HRV 粉尘/振动 头盔+腕带

总结

这是首个在真实列车运营条件下部署全传感器阵列的研究,其核心结论对IMS跨领域部署有重大指导意义:

  1. HRV和呼吸率是唯一生态鲁棒的疲劳指标:模拟器和真实列车一致,推荐作为铁路/航空/船舶DMS的核心指标
  2. EEG在振动环境中不可靠:汽车路面振动同理,可穿戴EEG的量产化需更多验证
  3. 自动化转变驾驶角色→精神疲劳成为主要威胁:L3/L4自动驾驶同样面临”监督比驾驶更累”的悖论
  4. 最小可行方案:ECG传感器+红外摄像头,BOM<$100,可覆盖铁路/航空/船舶
  5. 汽车DMS启示:加强rPPG→HRV模块,呼吸率从rPPG衍生无需额外传感器

https://dapalm.com/2026/09/21/2026-09-21-20-train-driver-multisensor-fatigue-sim-to-reality-ims/
作者
Mars
发布于
2026年9月21日
许可协议