车载多模态心率检测:方向盘ECG+PPG+RGB-IR+热成像融合方案

论文信息

项目 内容
标题 Reliable multimodal signals for in-vehicle heartbeat detection
期刊 Scientific Reports (Nature)
DOI 10.1038/s41598-026-74069-3
发表 2026年10月
机构 德国研究团队(大众Tiguan实车测试)
测试车辆 VW Tiguan 2022

核心问题

心血管疾病与驾驶安全

数据 来源
CVD是全球首位死因 WHO, 17.9M死亡/年(32%)
德国CVD占全部死亡的34% 2023年统计
85%的CVD死亡源于心梗和中风 WHO
房颤是中风主要风险因素 早期检测可显著降低风险

核心洞察: 德国人日均驾驶约45分钟,这是持续心脏监测的天然窗口。但车载环境下的心率检测面临严峻挑战。

车载心率检测的挑战

传感器 原理 车载挑战
方向盘ECG 双手接触电极 手部运动、接触压力变化、汗水
方向盘PPG 光学体积描记 接触不稳定、环境光干扰
摄像头rPPG (RGB) 面部肤色变化 光照变化、运动伪影、遮挡
摄像头rPPG (IR) 红外波段 红外补光强度、距离限制
热成像rPPG 面部温度脉动 分辨率低、成本高

多模态融合方案

传感器架构

方向盘ECG电极创新

论文的关键硬件创新是改进型蛇形(meander-shaped)电极设计:

参数 旧设计 新设计
形状 简直线状 蛇形24波
长度 ~100mm 270mm
宽度 20mm 40mm
接触面积 有限 大幅增加
安装方式 粘贴 碳基翼形夹具
重复性 差 固定位置可重复
材料 PU+银浆 PU+银浆(改进工艺)

多模态融合算法

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
217
218
219
220
221
222
223
224
225
import numpy as np
from scipy import signal
from typing import Dict, List, Tuple, Optional

class MultimodalHeartbeatDetector:
"""
车载多模态心率检测融合器

基于 Nature Scientific Reports 2026 论文
支持5种模态: ECG, PPG, iPPG-RGB, iPPG-IR, iPPG-Thermal

融合策略:
1. 各模态独立心跳检测
2. 信号质量评估(SQA)
3. 质量加权融合
4. R-R间期一致性检查
"""

def __init__(self, fs: int = 500):
self.fs = fs
self.modalities = {}

def add_ecg_signal(self, ecg: np.ndarray):
"""方向盘ECG信号"""
self.modalities['ecg'] = ecg

def add_ppg_signal(self, ppg: np.ndarray):
"""方向盘PPG信号"""
self.modalities['ppg'] = ppg

def add_ippg_rgb(self, rgb_signal: np.ndarray):
"""RGB摄像头rPPG信号"""
self.modalities['ippg_rgb'] = rgb_signal

def add_ippg_ir(self, ir_signal: np.ndarray):
"""红外摄像头rPPG信号"""
self.modalities['ippg_ir'] = ir_signal

def add_ippg_thermal(self, thermal_signal: np.ndarray):
"""热成像rPPG信号"""
self.modalities['ippg_thermal'] = thermal_signal

def assess_quality(self, sig: np.ndarray, modality: str) -> float:
"""
信号质量评估 (SQA)

Returns:
quality: 0-1, 越高越好
"""
if len(sig) == 0:
return 0.0

# 1. 信噪比估计
# 心率频段: 0.7-4.0 Hz (42-240 bpm)
nyq = self.fs / 2
low = 0.7 / nyq
high = 4.0 / nyq

# 带通滤波
b, a = signal.butter(4, [low, high], btype='band')
filtered = signal.filtfilt(b, a, sig)

# 信号功率 vs 噪声功率
signal_power = np.var(filtered)
noise_power = np.var(sig - filtered)

if noise_power < 1e-10:
snr = 10.0
else:
snr = 10 * np.log10(signal_power / noise_power)

# 2. 模态特定质量因子
if modality == 'ecg':
# ECG: 检查R波是否存在
quality = min(1.0, max(0.0, (snr + 5) / 20))
elif modality == 'ppg':
# PPG: 检查脉动成分
quality = min(1.0, max(0.0, (snr + 3) / 15))
elif modality.startswith('ippg'):
# rPPG: 更严格的质量要求
quality = min(1.0, max(0.0, (snr + 2) / 12))
else:
quality = 0.0

return quality

def detect_heartbeats(self, sig: np.ndarray,
modality: str) -> Tuple[np.ndarray, float]:
"""
单模态心跳检测

Returns:
beat_times: R波/峰值时间点
confidence: 检测置信度
"""
if len(sig) == 0:
return np.array([]), 0.0

# 带通滤波
nyq = self.fs / 2
b, a = signal.butter(4,
[0.7/nyq, 4.0/nyq],
btype='band')
filtered = signal.filtfilt(b, a, sig)

# 模态特定的峰值检测
if modality == 'ecg':
# ECG: 使用Pan-Tompkins算法的简化版
# 微分 + 平方 + 滑动窗口积分
diff = np.diff(filtered)
squared = diff ** 2
window = int(0.15 * self.fs)
integrated = np.convolve(squared,
np.ones(window)/window,
mode='same')
peaks, _ = signal.find_peaks(integrated,
height=0.3*np.max(integrated),
distance=0.3*self.fs)
else:
# PPG/rPPG: 直接峰值检测
peaks, _ = signal.find_peaks(filtered,
height=0.3*np.max(filtered),
distance=0.3*self.fs)

# 置信度
quality = self.assess_quality(sig, modality)

return peaks, quality

def fuse(self, duration_sec: float = 10.0) -> Dict:
"""
多模态融合心率检测

Returns:
result: 包含心率、HRV、各模态贡献的字典
"""
all_beats = {} # modality -> (beat_times, quality)

# 各模态独立检测
for modality, sig in self.modalities.items():
beats, quality = self.detect_heartbeats(sig, modality)
all_beats[modality] = (beats, quality)

if not all_beats:
return {'hr': 0, 'hrv': 0, 'modalities': {}}

# 质量加权融合
total_weight = sum(q for _, q in all_beats.values())
if total_weight < 0.01:
return {'hr': 0, 'hrv': 0, 'modalities': all_beats}

# 加权平均心率
weighted_hr = 0
for modality, (beats, quality) in all_beats.items():
if len(beats) > 1:
rr_intervals = np.diff(beats) / self.fs
hr = 60 / np.median(rr_intervals)
weight = quality / total_weight
weighted_hr += hr * weight

# 融合HRV (使用最高质量模态的RR间期)
best_modality = max(all_beats,
key=lambda m: all_beats[m][1])
best_beats, _ = all_beats[best_modality]
if len(best_beats) > 2:
rr = np.diff(best_beats) / self.fs
hrv = np.std(rr) * 1000 # ms
else:
hrv = 0

return {
'hr': weighted_hr,
'hrv': hrv,
'best_modality': best_modality,
'modalities': {m: {'beats': len(b), 'quality': q}
for m, (b, q) in all_beats.items()}
}


# 测试
if __name__ == "__main__":
print("=" * 60)
print("车载多模态心率检测融合器 - 测试")
print("=" * 60)

detector = MultimodalHeartbeatDetector(fs=500)

# 模拟信号
t = np.arange(0, 10, 1/500)
heart_rate = 72 # bpm
beat_interval = 60 / heart_rate # seconds

# ECG模拟 (R波)
ecg = np.zeros_like(t)
for i, beat_time in enumerate(np.arange(0, 10, beat_interval)):
idx = int(beat_time * 500)
if idx < len(ecg):
ecg[max(0,idx-5):idx+5] = 1.0 # R波
ecg += np.random.normal(0, 0.1, len(ecg))

# PPG模拟
ppg = 0.5 + 0.3 * np.sin(2 * np.pi * heart_rate/60 * t)
ppg += np.random.normal(0, 0.05, len(ppg))

# rPPG模拟 (弱信号)
rppg = 0.1 * np.sin(2 * np.pi * heart_rate/60 * t)
rppg += np.random.normal(0, 0.08, len(rppg))

# 添加信号
detector.add_ecg_signal(ecg)
detector.add_ppg_signal(ppg)
detector.add_ippg_rgb(rppg)
detector.add_ippg_ir(rppg * 1.2) # IR稍好
detector.add_ippg_thermal(rppg * 0.8) # 热成像稍差

# 融合检测
result = detector.fuse(duration_sec=10)

print(f"\n融合结果:")
print(f" 心率: {result['hr']:.1f} bpm (真实: {heart_rate} bpm)")
print(f" HRV: {result['hrv']:.1f} ms")
print(f" 最优模态: {result['best_modality']}")
print(f"\n各模态状态:")
for m, info in result['modalities'].items():
print(f" {m:15s}: {info['beats']:3d} beats, quality={info['quality']:.3f}")

实验结果

测试条件

条件 参数
车辆 VW Tiguan 2022, 自动挡
驾驶条件 真实道路驾驶
ECG采样率 500Hz, 16-bit
摄像头 RGB + RGB-IR + 热成像
方向盘ECG 银浆PU薄片蛇形电极
地面真值 三电极双极胸导联ECG

各模态心率检测性能

模态 接触方式 优势 局限
方向盘ECG 接触 最高信噪比 需双手握盘,手部运动干扰
方向盘PPG 接触 不受运动影响 接触压力敏感
RGB rPPG 非接触 无需接触 光照敏感,遮挡
IR rPPG 非接触 低照度可用 红外补光距离限制
热成像 rPPG 非接触 全黑环境可用 分辨率低,成本高

融合效果

场景 最佳单模态 融合后 提升
白天直行 ECG ECG+PPG+iPPG 心跳覆盖率↑
颠簸路面 iPPG-IR iPPG-IR+iPPG-Thermal 接触传感器失效时仍有信号
隧道(低光) iPPG-IR iPPG-IR+iPPG-Thermal RGB失效
手离开方向盘 iPPG-RGB iPPG-RGB+iPPG-IR ECG/PPG失效
完全黑暗 iPPG-Thermal Thermal alone 仅热成像可用

IMS开发启示

1. 模态优先级策略

2. 部署考量

因素 建议
方向盘ECG 需OEM合作改造方向盘,银浆电极可集成
PPG 可集成到方向盘后方,已有量产方案
RGB-IR摄像头 DMS摄像头已有RGB,增加IR版本即可
热成像 成本高(~$200),建议高端车型或作为冗余
融合算法 信号质量评估是关键,需实时运行

3. 与Euro NCAP的关联

Euro NCAP 2026要求 心率检测的关联
驾驶员无响应干预 心率异常→紧急呼叫,触发干预
健康座舱 持续心率监测→心血管疾病早期预警
驾驶员状态评估 HRV→压力/疲劳的客观生理指标

4. 优先级排序

任务 优先级 可行性
rPPG(RGB)心率检测 🔴 高 软件实现,利用现有DMS摄像头
rPPG(IR)心率检测 🟡 中 需IR版DMS摄像头
方向盘PPG 🟡 中 需OEM方向盘改造
方向盘ECG 🟢 低 工程量大,电极耐久性问题
热成像rPPG 🟢 低 成本高,高端车型可选
多模态融合算法 🔴 高 纯软件,分阶段集成

总结

这篇Nature Scientific Reports论文最重要的贡献是在真实驾驶条件下验证了5种心率检测模态的融合方案,不是实验室仿真,而是大众Tiguan实车测试。

核心发现:

  1. 蛇形电极设计显著提升方向盘ECG的接触质量和重复性
  2. RGB-IR和热成像摄像头补充了传统RGB在低照度下的不足
  3. 多模态融合确保各种驾驶条件下都有心率信号
  4. 信号质量评估是融合的关键决策因子

IMS落地建议: 优先实现RGB rPPG心率检测(纯软件,利用现有DMS摄像头),后续逐步加入IR rPPG和方向盘PPG,最终实现多模态融合。这为Euro NCAP 2026的”驾驶员无响应干预”提供了生理信号基础。

信息来源: Nature Scientific Reports