军事飞行员纺织传感器监测:ECG+呼吸在极端条件下的信号质量——IMS 座舱生理监测的航空借鉴

论文来源:Frontiers in Physiology, 2026
研究场景:低压缺氧 + 高 G 力训练,纺织传感器 ECG+胸廓运动
关键指标:ECG 信号可用率 93.4%(缺氧)/ 90.4%(G力),呼吸 70.7%/81.3%
IMS 相关性:⭐⭐⭐⭐(座舱非侵入生理监测方案)


论文信息

项目 内容
标题 Monitoring Military Pilots with Textile Sensors: Physiological Responses and Signal Quality Under Extreme Conditions
期刊 Frontiers in Physiology
DOI 10.3389/fphys.2026.1911780
发表日期 2026年8月19日
作者 Annaheim, Renz, Rossi, Stier, Bron, Bauer
关键词 Aerospace, ECG, extreme conditions, Fighter jet pilot, military, signal quality
链接 https://www.frontiersin.org/journals/physiology/articles/10.3389/fphys.2026.1911780/abstract

核心创新

纺织传感器在极端飞行条件下的首次系统验证

该研究使用纺织基监测系统(textile-based monitoring system)在飞行员训练中同步采集:

  • 1 导联 ECG(心电)
  • 胸廓运动(呼吸频率+幅度)

在两种极端条件下测试信号质量:

  1. 低压缺氧(hypobaric hypoxia):模拟高海拔
  2. 高 G 力(high G-force):模拟战斗机机动

关键结果

信号质量统计

条件 ECG 可用率 呼吸可用率 HR 可信 HRV 可信
缺氧训练 93.4% 70.7% ✅ 高 ✅ 中高
G 力训练 90.4% 81.3% ✅ 高 ⚠️ 中
静止基线 ~98% ~95% ✅ 高 ✅ 高

生理变量

变量 缺氧响应 G 力响应 IMS 可用性
心率 (HR) ↑ 代偿性心动过速 ↑↑ 应激性心动过速 ✅ rPPG 可替代
心率变异度 (HRV) ↓ 自主神经失衡 ↓↓ 压力响应 ⚠️ rPPG 精度有限
呼吸频率 ↑ 代偿性过度呼吸 → 无显著变化 ✅ 座椅压力可替代
呼吸幅度 ↑ 胸廓扩张增加 ↓ G 力压缩胸廓 ⚠️ 压力垫可感知

纺织传感器技术

传感器系统

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
208
209
210
211
212
213
214
215
216
"""
纺织传感器座舱生理监测系统

基于 Frontiers in Physiology 2026 论文
适配到汽车 IMS 座舱场景

传感器类型:
1. 纺织 ECG 电极(座椅靠背嵌入)
2. 胸廓运动带(安全带集成)
3. 信号处理单元(座椅下方)

对比传统方案:
- 医疗 ECG: 12导联, AgCl电极, 凝胶 → 不可用于日常
- 纺织 ECG: 1导联, 织物电极, 干电极 → 座椅集成
"""

import numpy as np
from typing import Dict, Tuple
from dataclasses import dataclass

@dataclass
class TextileSensorConfig:
"""纺织传感器配置"""
# ECG 参数
ecg_sample_rate: int = 250 # Hz
ecg_bandwidth: Tuple[float, float] = (0.5, 40) # Hz

# 呼吸参数
resp_sample_rate: int = 50 # Hz
resp_bandwidth: Tuple[float, float] = (0.1, 1.0) # Hz

# 信号质量阈值
min_snr_db: float = 10.0 # 最低信噪比
min_qrs_amplitude_uv: float = 50 # 最低 QRS 幅度


class TextileECGProcessor:
"""
纺织 ECG 信号处理器

处理汽车座舱环境噪声:
- 发动机/路面振动 → 带通滤波
- 运动伪迹 → 自适应滤波
- 安全带压力变化 → 基线校正
"""

def __init__(self, config: TextileSensorConfig):
self.config = config
self.sampling_rate = config.ecg_sample_rate

def process(self, raw_ecg: np.ndarray) -> Dict:
"""
ECG 信号处理流水线

Args:
raw_ecg: 原始 ECG 信号 (N,)

Returns:
dict with 'hr', 'hrv', 'quality', 'rr_intervals'
"""
# 1. 带通滤波 (0.5-40 Hz)
from scipy.signal import butter, filtfilt
b, a = butter(4, [0.5 / (self.sampling_rate/2),
40 / (self.sampling_rate/2)], btype='band')
filtered = filtfilt(b, a, raw_ecg)

# 2. 基线漂移校正
baseline = np.convolve(filtered, np.ones(500)/500, mode='same')
corrected = filtered - baseline

# 3. QRS 检测(简化版)
# 使用阈值法检测 R 峰
threshold = np.std(corrected) * 2
r_peaks = self._detect_r_peaks(corrected, threshold)

# 4. 计算心率和 HRV
if len(r_peaks) > 2:
rr_intervals = np.diff(r_peaks) / self.sampling_rate # seconds
hr = 60 / np.mean(rr_intervals)
hrv_rmssd = np.sqrt(np.mean(np.diff(rr_intervals)**2))
hrv_sdnn = np.std(rr_intervals)
else:
hr = 0
rr_intervals = np.array([])
hrv_rmssd = 0
hrv_sdnn = 0

# 5. 信号质量评估
snr = self._compute_snr(corrected, r_peaks)
quality = 'good' if snr > self.config.min_snr_db else 'poor'

return {
'hr': hr,
'hrv_rmssd': hrv_rmssd,
'hrv_sdnn': hrv_sdnn,
'quality': quality,
'snr_db': snr,
'rr_intervals': rr_intervals,
'r_peaks': r_peaks
}

def _detect_r_peaks(self, signal: np.ndarray, threshold: float) -> np.ndarray:
"""简化版 R 峰检测"""
peaks = []
for i in range(1, len(signal)-1):
if signal[i] > threshold and signal[i] > signal[i-1] and signal[i] > signal[i+1]:
peaks.append(i)
return np.array(peaks)

def _compute_snr(self, signal: np.ndarray, peaks: np.ndarray) -> float:
"""计算信噪比"""
if len(peaks) < 2:
return 0.0
# 信号功率(QRS 附近)
signal_power = np.mean(signal[peaks]**2)
# 噪声功率(非 QRS 区域)
noise_mask = np.ones(len(signal), dtype=bool)
for p in peaks:
noise_mask[max(0,p-50):min(len(signal),p+50)] = False
noise_power = np.mean(signal[noise_mask]**2)
if noise_power == 0:
return 100.0
return 10 * np.log10(signal_power / noise_power)


class RespiratoryProcessor:
"""呼吸信号处理器"""

def __init__(self, sample_rate: int = 50):
self.sample_rate = sample_rate

def process(self, raw_resp: np.ndarray) -> Dict:
"""
处理胸廓运动信号

Args:
raw_resp: 原始呼吸信号 (N,)
Returns:
dict with 'frequency', 'amplitude', 'quality'
"""
# 带通滤波 (0.1-1.0 Hz = 6-60 breaths/min)
from scipy.signal import butter, filtfilt
b, a = butter(4, [0.1 / (self.sample_rate/2),
1.0 / (self.sample_rate/2)], btype='band')
filtered = filtfilt(b, a, raw_resp)

# FFT 分析呼吸频率
fft = np.fft.rfft(filtered)
freqs = np.fft.rfftfreq(len(filtered), 1/self.sample_rate)
power = np.abs(fft)**2

# 主频 = 呼吸频率
resp_freq_idx = np.argmax(power[1:]) + 1
resp_freq_hz = freqs[resp_freq_idx]
resp_rate = resp_freq_hz * 60 # breaths per minute

# 呼吸幅度
amplitude = np.std(filtered)

# 信号质量
snr = power[resp_freq_idx] / (np.sum(power) - power[resp_freq_idx] + 1e-10)
quality = 'good' if snr > 5 else 'poor'

return {
'frequency': resp_rate,
'amplitude': amplitude,
'quality': quality,
'snr': snr
}


# ==================== 测试代码 ====================
if __name__ == "__main__":
import time

config = TextileSensorConfig()
ecg_processor = TextileECGProcessor(config)
resp_processor = RespiratoryProcessor(config.resp_sample_rate)

# 模拟 30 秒 ECG 信号
t = np.arange(0, 30, 1/250)
hr_true = 72 # bpm
ecg_sim = 0.5 * np.sin(2 * np.pi * hr_true/60 * t) # 简化 ECG
ecg_sim += 0.1 * np.random.randn(len(t)) # 噪声

# 模拟 30 秒呼吸信号
t_resp = np.arange(0, 30, 1/50)
resp_rate_true = 16 # breaths/min
resp_sim = 0.8 * np.sin(2 * np.pi * resp_rate_true/60 * t_resp)
resp_sim += 0.2 * np.random.randn(len(t_resp))

# 处理
ecg_result = ecg_processor.process(ecg_sim)
resp_result = resp_processor.process(resp_sim)

print("=" * 60)
print("纺织传感器座舱生理监测测试")
print("=" * 60)
print(f"\nECG 结果:")
print(f" 心率: {ecg_result['hr']:.1f} bpm (真实: {hr_true})")
print(f" HRV (RMSSD): {ecg_result['hrv_rmssd']:.3f} s")
print(f" HRV (SDNN): {ecg_result['hrv_sdnn']:.3f} s")
print(f" 信号质量: {ecg_result['quality']} (SNR: {ecg_result['snr_db']:.1f} dB)")
print(f" R 峰数: {len(ecg_result['r_peaks'])}")

print(f"\n呼吸结果:")
print(f" 呼吸频率: {resp_result['frequency']:.1f} /min (真实: {resp_rate_true})")
print(f" 呼吸幅度: {resp_result['amplitude']:.3f}")
print(f" 信号质量: {resp_result['quality']} (SNR: {resp_result['snr']:.1f})")

print("\n" + "=" * 60)
print("IMS 座舱部署可行性:")
print(f" ECG 信号可用率目标: 90%+ (论文: 93.4%)")
print(f" 呼吸信号可用率目标: 75%+ (论文: 70.7-81.3%)")
print(f" 心率检测误差: <5 bpm")
print(f" 呼吸频率误差: <2 /min")

极端条件下的生理响应

缺氧 (Hypobaric Hypoxia)

生理变量 基线 缺氧响应 变化幅度 检测时间
心率 70 bpm 95-110 bpm +35-55% 30-60s
HRV (SDNN) 50ms 25-35ms -30-50% 60s
呼吸频率 14/min 18-22/min +30-55% 60-120s
呼吸幅度 基线 +40% +40% 60s
SpO₂ 98% 75-85% -15-25% 10s

高 G 力 (High G-Force)

生理变量 1G 基线 4-6G 响应 变化幅度 恢复时间
心率 70 bpm 120-150 bpm +70-110% 30-60s
HRV 50ms 15-25ms -50-70% 60-120s
呼吸频率 14/min 14-16/min 不显著 —
呼吸幅度 基线 -30% (G力压胸) -30% 10-30s
血压 120/80 160/100+ +30-40% 30-60s

IMS 座舱适配方案

纺织传感器集成位置

传感器 集成位置 信号类型 干扰因素 信号可用率
ECG 电极 座椅靠背 心电 衣物厚度/材质 85-93%
胸廓带 安全带 呼吸运动 安全带松紧 75-85%
替代方案 方向盘 心电(手持) 手部接触 70-80%
非接触 rPPG DMS 摄像头 心率(光学) 光照/肤色 80-90%

纺织 ECG vs rPPG 对比

指标 纺织 ECG rPPG (摄像头) IMU 方向盘
精度 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
HRV ✅ 精确 ⚠️ 有限 ❌ 不可用
呼吸 ✅ 可测 ❌ 不可测 ❌ 不可测
隐私 ✅ 无图像 ❌ 面部图像 ✅ 无图像
穿戴要求 ⚠️ 需接触 ✅ 无需 ⚠️ 需握手
成本 ¥200-500 ¥0 (已有) ¥0 (已有)
部署难度 中 低 低

推荐方案:三层融合


关键学发现

1. 信号质量是生命线

发现 含义 IMS 行动
ECG 可用率 93.4%(缺氧) 7% 数据不可用 需要降级策略
呼吸可用率 70.7%(缺氧) 30% 数据不可用 rPPG 补充
G 力影响呼吸幅度 胸廓被压缩 安全带张力需补偿
多信号组合更可靠 交叉验证 三层融合方案

2. 个体差异显著

变异来源 影响 需要的校准
体型差异 ECG 幅度差 2-3x 个性化基线
衣物层数 信号衰减 10-40% 自适应增益
汗水量 电极接触变化 动态阻抗匹配
安全带松紧 呼吸信号幅度 张力传感器

与汽车场景的对比

维度 军事航空 汽车 IMS 差异影响
G 力 4-9G <1G 信号质量更好
缺氧 高海拔 无 不需要缺氧检测
振动 强(战斗机) 中(路面) 振动噪声类似
温度 极端 温和 信号稳定性更好
时长 1-2h 任务 2-8h 驾驶 疲劳累积不同
衣物 飞行服 日常衣物 ECG 接触更难

IMS 开发启示

启示 建议行动 优先级
纺织 ECG 可用于座舱 评估座椅靠背嵌入 ECG 电极 🟡 中
HRV 是认知负荷敏感指标 结合 rPPG 做 HRV 分析 🔴 高
呼吸频率可测 安全带集成呼吸带 🟢 低
多信号融合优于单信号 ECG+rPPG+行为三层融合 🔴 高
信号质量评估是必须的 建立信号质量分级和降级策略 🔴 高

信号质量降级策略

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
"""
信号质量降级策略

当某传感器信号质量下降时,自动切换到备用方案
"""

class SignalDegradationStrategy:
"""信号质量降级策略"""

def __init__(self):
self.strategies = {
'ecg_good': ['ecg'], # ECG 质量好 → 用 ECG
'ecg_poor': ['rppg', 'behavior'], # ECG 差 → 切 rPPG + 行为
'rppg_good': ['rppg'], # rPPG 好 → 用 rPPG
'rppg_poor': ['behavior'], # rPPG 差 → 仅用行为
'all_poor': ['behavior'], # 全差 → 仅用行为(最低保证)
}

def select_strategy(self, ecg_quality: str, rppg_quality: str) -> list:
"""根据信号质量选择策略"""
if ecg_quality == 'good':
return ['ecg', 'rppg', 'behavior'] # 全融合
elif rppg_quality == 'good':
return ['rppg', 'behavior'] # 降级到 rPPG
else:
return ['behavior'] # 仅行为(最低保证)

总结

军事飞行员纺织传感器研究为 IMS 座舱生理监测提供了:

  1. 信号可用率基准:ECG 90%+,呼吸 70-85% → 汽车场景预期更高
  2. 多信号融合策略:ECG+呼吸+行为 三层优于任何单一信号
  3. 信号质量评估方法:必须建立质量分级和降级策略
  4. 个体差异处理:需要个性化基线校准

对 IMS 的直接建议:优先实现 rPPG HRV 分析(已有 DMS 摄像头),评估座椅纺织 ECG 的可行性作为精度补充。三层融合(ECG+rPPG+行为)是认知负荷检测的理想方案。


论文链接:https://www.frontiersin.org/journals/physiology/articles/10.3389/fphys.2026.1911780/abstract
DOI:10.3389/fphys.2026.1911780
期刊:Frontiers in Physiology, Section: Environmental, Aviation and Space Physiology