60GHz 雷达与 ToF 相机传感器融合:车内监测系统架构详解

60GHz 雷达与 ToF 相机传感器融合:车内监测系统架构详解

背景

Euro NCAP 2026 对车内监测提出多维度要求,单一传感器难以满足所有场景。60GHz 雷达与 ToF(飞行时间)相机的融合成为主流方案。


传感器对比

60GHz 雷达特性

特性 参数 优势 劣势
工作频率 60GHz 高分辨率、抗干扰 覆盖范围有限
测距精度 ±5cm 适合检测微小运动 无法识别物体类型
测速精度 ±0.1m/s 精确检测呼吸/心跳 -
穿透性 可穿透毛毯 适合遮挡场景 -
隐私保护 无图像 高隐私性 -
成本 中等 - 高于普通摄像头

ToF 相机特性

特性 参数 优势 劣势
分辨率 VGA (640x480) 高空间分辨率 计算量大
深度精度 ±1cm 精确 3D 信息 受光照影响
帧率 30-60fps 实时性 -
工作距离 0.5-5m 适合车内场景 -
隐私保护 无纹理图像 中等隐私性 -
成本 - 最贵

RGB 摄像头特性

特性 参数 优势 劣势
分辨率 2-5MP 高分辨率图像 隐私问题
帧率 30-60fps 实时性 受光照影响
信息丰富度 视觉细节 可识别面部表情 夜间需红外补光
成本 最经济 -

融合架构设计

系统架构

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
┌─────────────────────────────────────────────────────────┐
│ 车内监测系统 │
├─────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │60GHz雷达 │ │ToF相机 │ │RGB/IR相机│ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │雷达DSP │ │深度处理 │ │视觉推理 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └─────────────┼─────────────┘ │
│ ▼ │
│ ┌───────────────┐ │
│ │ 传感器融合层 │ │
│ └───────┬───────┘ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 应用层 │ │
│ ├──────────────────────────────────┤ │
│ │ • CPD 儿童存在检测 │ │
│ │ • OOP 异常姿态检测 │ │
│ │ • 乘员分类 │ │
│ │ • DMS 驾驶员监测 │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

数据流设计

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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
from dataclasses import dataclass
from typing import List, Tuple, Optional
import numpy as np

@dataclass
class RadarPoint:
"""雷达点云数据"""
x: float # 米
y: float
z: float
velocity: float # m/s
snr: float # 信噪比
timestamp: float


@dataclass
class ToFDepthFrame:
"""ToF 深度帧"""
depth_map: np.ndarray # shape=(H, W), 单位:米
amplitude: np.ndarray # 振幅图
timestamp: float


@dataclass
class RGBFrame:
"""RGB/IR 图像帧"""
image: np.ndarray # shape=(H, W, 3)
is_infrared: bool
timestamp: float


@dataclass
class FusedOccupantData:
"""融合后的乘员数据"""
position_3d: Tuple[float, float, float]
velocity: Optional[float]
depth_map_roi: np.ndarray
visual_features: Optional[np.ndarray]
detection_confidence: float
timestamp: float


class SensorFusionPipeline:
"""
传感器融合管线

整合雷达、ToF、视觉数据
"""

def __init__(self, config: dict):
self.config = config

# 传感器标定参数
self.radar_to_camera_extrinsics = config.get('radar_to_camera_extrinsics', np.eye(4))
self.tof_to_camera_extrinsics = config.get('tof_to_camera_extrinsics', np.eye(4))

# 同步缓冲
self.radar_buffer = []
self.tof_buffer = []
self.rgb_buffer = []

# 时间同步阈值
self.sync_threshold_ms = 33 # ~30fps

def process_frame(
self,
radar_data: List[RadarPoint],
tof_frame: ToFDepthFrame,
rgb_frame: RGBFrame
) -> List[FusedOccupantData]:
"""
处理一帧数据

Args:
radar_data: 雷达点云
tof_frame: ToF 深度帧
rgb_frame: RGB 图像

Returns:
occupants: 检测到的乘员列表
"""
# 1. 时间同步检查
if not self._check_temporal_sync(radar_data, tof_frame, rgb_frame):
return []

# 2. 雷达数据处理
radar_clusters = self._cluster_radar_points(radar_data)

# 3. ToF 深度处理
tof_occupants = self._detect_from_tof(tof_frame)

# 4. RGB 视觉检测
visual_detections = self._detect_from_rgb(rgb_frame)

# 5. 融合
fused_occupants = self._fuse_detections(
radar_clusters, tof_occupants, visual_detections
)

return fused_occupants

def _check_temporal_sync(
self,
radar_data: List[RadarPoint],
tof_frame: ToFDepthFrame,
rgb_frame: RGBFrame
) -> bool:
"""检查时间同步"""
if not radar_data or tof_frame is None or rgb_frame is None:
return False

radar_time = radar_data[0].timestamp
tof_time = tof_frame.timestamp
rgb_time = rgb_frame.timestamp

max_diff = max(abs(radar_time - tof_time),
abs(radar_time - rgb_time),
abs(tof_time - rgb_time))

return max_diff < self.sync_threshold_ms / 1000.0

def _cluster_radar_points(
self,
points: List[RadarPoint]
) -> List[dict]:
"""雷达点云聚类"""
if not points:
return []

# 简单 DBSCAN 聚类
from sklearn.cluster import DBSCAN

positions = np.array([[p.x, p.y, p.z] for p in points])

clustering = DBSCAN(eps=0.3, min_samples=5).fit(positions)
labels = clustering.labels_

clusters = []
for label in set(labels):
if label == -1:
continue # 噪声点

cluster_points = [p for i, p in enumerate(points) if labels[i] == label]

# 计算聚类中心
center = np.mean([[p.x, p.y, p.z] for p in cluster_points], axis=0)

# 计算平均速度
avg_velocity = np.mean([p.velocity for p in cluster_points])

# 判断是否为呼吸运动
is_breathing = self._detect_breathing(cluster_points)

clusters.append({
'center': center,
'point_count': len(cluster_points),
'avg_velocity': avg_velocity,
'is_breathing': is_breathing,
'points': cluster_points
})

return clusters

def _detect_breathing(self, points: List[RadarPoint]) -> bool:
"""检测呼吸运动"""
velocities = [abs(p.velocity) for p in points]

# 呼吸运动特征:低速周期性运动
avg_velocity = np.mean(velocities)

# 呼吸速度范围:0.01-0.05 m/s
return 0.005 < avg_velocity < 0.1

def _detect_from_tof(self, frame: ToFDepthFrame) -> List[dict]:
"""ToF 深度检测"""
depth_map = frame.depth_map

# 阈值分割
valid_mask = (depth_map > 0.3) & (depth_map < 3.0)

# 聚类
from scipy.ndimage import label

labeled, num_features = label(valid_mask)

detections = []
for i in range(1, num_features + 1):
mask = labeled == i

# 计算质心
ys, xs = np.where(mask)
depths = depth_map[mask]

center_x = np.mean(xs)
center_y = np.mean(ys)
center_z = np.mean(depths)

# 计算边界框
bbox = [min(xs), min(ys), max(xs), max(ys)]

detections.append({
'position': (center_x, center_y, center_z),
'bbox': bbox,
'pixel_count': len(xs),
'depth_map_roi': depth_map[bbox[1]:bbox[3], bbox[0]:bbox[2]]
})

return detections

def _detect_from_rgb(self, frame: RGBFrame) -> List[dict]:
"""视觉检测"""
# 实际实现会使用深度学习模型
# 这里返回模拟结果
return []

def _fuse_detections(
self,
radar_clusters: List[dict],
tof_detections: List[dict],
visual_detections: List[dict]
) -> List[FusedOccupantData]:
"""融合检测结果"""

fused = []

# 以 ToF 检测为主,雷达补充信息
for tof_det in tof_detections:
tof_pos = tof_det['position']

# 查找匹配的雷达聚类
matched_radar = None
min_dist = float('inf')

for radar_cluster in radar_clusters:
radar_pos = radar_cluster['center']

# 计算距离
dist = np.linalg.norm(np.array(tof_pos) - np.array(radar_pos))

if dist < min_dist and dist < 0.5: # 50cm 阈值
min_dist = dist
matched_radar = radar_cluster

# 构建融合结果
occupant = FusedOccupantData(
position_3d=tof_pos,
velocity=matched_radar['avg_velocity'] if matched_radar else None,
depth_map_roi=tof_det['depth_map_roi'],
visual_features=None,
detection_confidence=0.9 if matched_radar else 0.7,
timestamp=0.0
)

fused.append(occupant)

return fused

应用场景实现

1. 儿童存在检测(CPD)

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
class CPDDetector:
"""
儿童存在检测

融合雷达呼吸检测和 ToF 深度检测
"""

def __init__(self):
self.breathing_velocity_range = (0.005, 0.1) # m/s
self.child_size_range = (0.3, 1.0) # 米

def detect(
self,
fused_data: List[FusedOccupantData],
radar_clusters: List[dict]
) -> dict:
"""
检测儿童

Returns:
result: {
'child_detected': bool,
'breathing_detected': bool,
'position': tuple,
'confidence': float
}
"""
for occupant in fused_data:
# 检查尺寸
depth_roi = occupant.depth_map_roi
if depth_roi.size == 0:
continue

# 估算尺寸
height = np.max(depth_roi) - np.min(depth_roi)

# 检查呼吸
is_breathing = False
if occupant.velocity is not None:
is_breathing = (
self.breathing_velocity_range[0] <
abs(occupant.velocity) <
self.breathing_velocity_range[1]
)

# 判断是否为儿童
is_child = (
self.child_size_range[0] < height < self.child_size_range[1] and
is_breathing
)

if is_child:
return {
'child_detected': True,
'breathing_detected': is_breathing,
'position': occupant.position_3d,
'confidence': occupant.detection_confidence
}

return {
'child_detected': False,
'breathing_detected': False,
'position': None,
'confidence': 0.0
}

2. 异常姿态检测(OOP)

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
class OOPDetector:
"""
异常姿态检测

使用 ToF 深度信息检测 OOP
"""

def __init__(self):
# 气囊危险区域
self.airbag_danger_zone = {
'x_range': (-0.5, 0.5), # 米
'y_range': (0, 0.5),
'z_range': (0, 0.2) # 距仪表盘 <20cm
}

def detect(
self,
tof_frame: ToFDepthFrame,
occupant: FusedOccupantData
) -> dict:
"""
检测异常姿态

Returns:
result: {
'is_oop': bool,
'oop_type': str,
'distance_to_dashboard': float
}
"""
depth_map = tof_frame.depth_map

# 计算头部距仪表盘距离
head_position = occupant.position_3d
distance_to_dashboard = head_position[2] # z 轴

# 判断是否在危险区域
is_close = distance_to_dashboard < 0.2 # <20cm

# 检测脚踩仪表盘
# 检查深度图上半部分是否有人体
h, w = depth_map.shape
upper_region = depth_map[:h//3, :]

feet_on_dashboard = np.sum(upper_region < 1.0) > (h * w * 0.1)

# 判断 OOP 类型
oop_type = None
if is_close:
oop_type = 'head_close_to_dashboard'
elif feet_on_dashboard:
oop_type = 'feet_on_dashboard'

return {
'is_oop': oop_type is not None,
'oop_type': oop_type,
'distance_to_dashboard': distance_to_dashboard
}

部署架构

硬件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────┐
│ 车内传感器布局 │
├─────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │IR摄像头 │ │IR摄像头 │ │
│ │(驾驶员) │ │(副驾) │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ┌─────┴─────┐ │
│ │ ToF相机 │ │
│ │ (车顶) │ │
│ └─────┬─────┘ │
│ │ │
│ ┌───────────┼───────────┐ │
│ │ │ │ │
│ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │
│ │60GHz雷达│ │60GHz雷达│ │60GHz雷达│ │
│ │ (前排) │ │ (后排) │ │ (后备箱)│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└────────────────────────────────────────────────┘

软件架构

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
class InCabinMonitoringSystem:
"""
车内监测系统完整架构
"""

def __init__(self, config: dict):
# 传感器接口
self.radar_interface = RadarInterface(config['radar'])
self.tof_interface = ToFInterface(config['tof'])
self.camera_interface = CameraInterface(config['camera'])

# 融合管线
self.fusion_pipeline = SensorFusionPipeline(config['fusion'])

# 应用模块
self.cpd_detector = CPDDetector()
self.oop_detector = OOPDetector()
self.dms = DMSModule()
self.occupant_classifier = OccupantClassifier()

# 输出接口
self.output_interface = OutputInterface()

def run_frame(self):
"""运行一帧"""

# 1. 采集数据
radar_data = self.radar_interface.get_points()
tof_frame = self.tof_interface.get_frame()
rgb_frame = self.camera_interface.get_frame()

# 2. 融合
fused_occupants = self.fusion_pipeline.process_frame(
radar_data, tof_frame, rgb_frame
)

# 3. 运行应用
results = {}

# CPD
results['cpd'] = self.cpd_detector.detect(fused_occupants, radar_data)

# OOP
if fused_occupants:
results['oop'] = self.oop_detector.detect(tof_frame, fused_occupants[0])

# DMS (驾驶员)
results['dms'] = self.dms.process(rgb_frame)

# 乘员分类
results['occupants'] = [
self.occupant_classifier.classify(o) for o in fused_occupants
]

# 4. 输出
self.output_interface.publish(results)

return results

性能指标

检测性能

应用 雷达 ToF 融合 要求
CPD 检出率 85% 90% 95% ≥90%
CPD 误报率 8% 5% 3% ≤5%
OOP 检出率 60% 85% 90% ≥85%
乘员分类精度 70% 85% 92% ≥90%

系统性能

指标 数值
帧率 30fps
延迟 <50ms
CPU 占用 <30%
内存占用 <500MB

参考文献

  1. Infineon, “60 GHz radar sensors for automotive”, 2025
  2. MulticoreWare & Cipia, “60GHz Radar and Camera Fusion Powered In-Cabin Monitoring System”, CES 2025
  3. Euro NCAP, “Safe Driving Occupant Monitoring Protocol v1.1”, 2025

总结: 60GHz 雷达与 ToF 相机融合可覆盖 95% 的 Euro NCAP 车内监测场景。雷达擅长检测呼吸运动和遮挡场景,ToF 提供精确 3D 信息,RGB/IR 提供视觉特征。建议采用分层融合架构,以 ToF 为主、雷达补充生命体征、视觉提供语义信息。


60GHz 雷达与 ToF 相机传感器融合:车内监测系统架构详解
https://dapalm.com/2026/06/04/2026-06-04-60GHz雷达与ToF相机传感器融合车内监测系统架构详解/
作者
Mars
发布于
2026年6月4日
许可协议