BSENSE:单毫米波雷达车内儿童检测+生命体征监测(ACM SenSys 2024)

BSENSE:单毫米波雷达车内儿童检测+生命体征监测

论文来源: ACM SenSys 2024
会议: ACM Conference on Embedded Networked Sensor Systems
核心创新: 单雷达+合成反射器 → 解决遮挡和多乘员场景


论文信息

项目 内容
标题 BSENSE: In-vehicle Child Detection and Vital Sign Monitoring with a Single mmWave Radar and Synthetic Reflectors
会议 ACM SenSys 2024
创新 合成反射器增强信号,解决车内遮挡问题

核心问题:车内雷达检测的遮挡挑战

传统毫米波雷达痛点:

1
2
3
4
5
6
7
8
9
10
车内环境复杂:
- 座椅遮挡信号
- 多乘员信号混叠
- 金属反射干扰
- 深色玻璃衰减

传统方案局限:
- 多雷达方案成本高
- 单雷达易漏检
- 遮挡场景失效

BSENSE创新方案

合成反射器设计

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
import numpy as np

class SyntheticReflector:
"""
合成反射器设计

论文核心:
在车内布置低成本反射器,增强雷达信号覆盖

反射器类型:
1. 角反射器(Corner Reflector)
2. 金属箔贴片
3. 雷达增强标签
"""

def __init__(self,
num_reflectors: int = 4,
reflector_positions: list = None):
self.num_reflectors = num_reflectors
self.positions = reflector_positions or [
(0.5, 0.3, 1.2), # 左侧A柱
(-0.5, 0.3, 1.2), # 右侧A柱
(0.0, 0.5, 0.5), # 车顶中部
(0.3, 0.1, 0.8), # 座椅侧面
]

# 反射器参数
self.rcs = 0.1 # 雷达散射截面(m²)

def compute_enhanced_signal(self,
radar_pos: np.ndarray,
target_pos: np.ndarray,
reflector_gain: float = 3.0) -> float:
"""
计算增强后的信号强度

Args:
radar_pos: 雷达位置, shape=(3,)
target_pos: 目标位置, shape=(3,)
reflector_gain: 反射器增益

Returns:
enhanced_signal: 增强后的信号强度
"""
# 直射路径
direct_distance = np.linalg.norm(target_pos - radar_pos)
direct_signal = 1.0 / (direct_distance ** 2)

# 反射路径(通过每个反射器)
reflected_signal = 0.0
for ref_pos in self.positions:
ref_pos = np.array(ref_pos)

# 雷达 → 反射器 → 目标
distance1 = np.linalg.norm(ref_pos - radar_pos)
distance2 = np.linalg.norm(target_pos - ref_pos)

reflected_path = (self.rcs * reflector_gain) / (distance1 * distance2) ** 2
reflected_signal += reflected_path

# 总信号
enhanced_signal = direct_signal + reflected_signal

return enhanced_signal

def optimize_placement(self,
coverage_area: list) -> list:
"""
优化反射器放置位置

目标:最大化覆盖区域信号强度

Args:
coverage_area: 需覆盖的区域坐标列表

Returns:
optimized_positions: 优化后的位置
"""
# 简化:网格搜索
best_positions = []

# 对每个覆盖点计算最佳反射器位置
for target in coverage_area:
best_pos = self._find_best_reflector_position(
np.array(target)
)
best_positions.append(best_pos)

return best_positions

def _find_best_reflector_position(self,
target: np.ndarray) -> np.ndarray:
"""找到最佳反射器位置"""
# 简化实现
return target + np.array([0.1, 0.1, 0.1])


# 测试示例
if __name__ == "__main__":
reflector = SyntheticReflector()

# 雷达位置(车顶)
radar_pos = np.array([0.0, 0.6, 0.8])

# 目标位置(后排座椅)
target_pos = np.array([0.3, 0.1, 0.3])

# 计算增强信号
signal = reflector.compute_enhanced_signal(radar_pos, target_pos)
print(f"增强后信号强度: {signal:.4f}")
print(f"使用 {len(reflector.positions)} 个反射器")

多目标分离算法

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

class MultiTargetSeparation:
"""
多目标分离算法

论文方法:
使用距离-角度聚类分离多个乘员

应用场景:
- 多儿童检测
- 成人+儿童混合
- 宠物区分
"""

def __init__(self,
range_resolution: float = 0.04,
angle_resolution: float = 2.0):
self.range_res = range_resolution
self.angle_res = angle_resolution

def separate_targets(self,
range_profile: np.ndarray,
angle_profile: np.ndarray,
doppler_profile: np.ndarray) -> list:
"""
分离多个目标

Args:
range_profile: 距离剖面, shape=(num_range_bins,)
angle_profile: 角度剖面, shape=(num_angle_bins,)
doppler_profile: 多普勒剖面, shape=(num_range_bins, num_angle_bins)

Returns:
targets: 目标列表 [{range, angle, velocity, intensity}]
"""
# 1. 距离域峰值检测
range_peaks, _ = find_peaks(range_profile,
height=np.mean(range_profile) * 2,
distance=3)

targets = []

for range_idx in range_peaks:
# 2. 对每个距离峰值,检测角度
angle_slice = doppler_profile[range_idx, :]
angle_peaks, _ = find_peaks(angle_slice,
height=np.mean(angle_slice) * 1.5)

for angle_idx in angle_peaks:
# 3. 提取速度信息
velocity_slice = doppler_profile[range_idx, angle_idx]

target = {
"range_m": range_idx * self.range_res,
"angle_deg": angle_idx * self.angle_res,
"intensity": range_profile[range_idx],
"velocity_mps": self._estimate_velocity(velocity_slice)
}

targets.append(target)

return targets

def classify_target(self,
target: dict,
vital_signs: dict) -> str:
"""
分类目标类型

Args:
target: 目标信息
vital_signs: 生命体征信息

Returns:
target_type: "child", "adult", "pet", "static_object"
"""
# 1. 检查是否有生命体征
if not vital_signs.get("presence_detected", False):
# 无生命体征 → 静态物体
return "static_object"

# 2. 基于生命体征频率判断
breathing_rate = vital_signs.get("breathing_rate", 0)
heart_rate = vital_signs.get("heart_rate", 0)

# 儿童:呼吸频率高(20-30 bpm),心率高(80-120 bpm)
if breathing_rate > 20 and heart_rate > 90:
return "child"

# 成人:呼吸频率中等(12-20 bpm),心率中等(60-100 bpm)
if 12 <= breathing_rate <= 20 and 60 <= heart_rate <= 100:
return "adult"

# 宠物:呼吸频率高(20-40 bpm),心率高(100-160 bpm)
if breathing_rate > 25 and heart_rate > 100:
return "pet"

return "unknown"

def _estimate_velocity(self, velocity_slice: np.ndarray) -> float:
"""估计速度"""
# 简化:使用多普勒峰值
peak_idx = np.argmax(np.abs(velocity_slice))

# 转换为速度(假设已知多普勒频率到速度的映射)
velocity = peak_idx * 0.1 # 简化

return velocity


# 测试示例
if __name__ == "__main__":
separator = MultiTargetSeparation()

# 模拟雷达数据
num_range_bins = 256
num_angle_bins = 64

range_profile = np.random.randn(num_range_bins)
range_profile[50] = 5.0 # 模拟目标1
range_profile[100] = 4.0 # 模拟目标2

angle_profile = np.random.randn(num_angle_bins)

doppler_profile = np.random.randn(num_range_bins, num_angle_bins)
doppler_profile[50, 30] = 3.0
doppler_profile[100, 20] = 2.5

# 分离目标
targets = separator.separate_targets(range_profile, angle_profile, doppler_profile)

print(f"检测到 {len(targets)} 个目标:")
for i, target in enumerate(targets):
print(f"目标{i+1}: 距离 {target['range_m']:.2f}m, 角度 {target['angle_deg']:.1f}°")

Euro NCAP CPD性能

场景 传统雷达 BSENSE方案
单儿童遮挡 65%检出 92%检出
多儿童分离 混叠 清晰分离
深色玻璃 70%检出 88%检出
座椅后方 50%检出 85%检出

IMS开发启示

反射器布置方案

位置 反射器类型 增益 成本
A柱 角反射器 3dB $0.5
座椅侧面 金属箔贴片 2dB $0.1
车顶 雷达标签 4dB $1.0

总成本估算

1
2
3
4
雷达芯片(TI AWRL6844): $15
反射器(4个): $2
PCB + 天线: $3
总成本: $20

参考资料

  1. ACM SenSys 2024 - BSENSE
  2. Nature 2025 - Vital Signs Detection
  3. Euro NCAP 2026 CPD Protocol

总结

BSENSE核心:

  1. 合成反射器:低成本增强信号覆盖
  2. 多目标分离:距离-角度聚类
  3. 遮挡鲁棒:85%+检出率

IMS开发优先级:

  • 🔴 高:合成反射器布置方案
  • 🟡 中:多目标分离算法
  • 🟢 低:儿童/成人/宠物分类

下一步行动:

  • 设计车内反射器布局
  • 实现多目标分离算法
  • 对齐Euro NCAP CPD测试场景

BSENSE:单毫米波雷达车内儿童检测+生命体征监测(ACM SenSys 2024)
https://dapalm.com/2026/07/09/2026-07-09-bsense-mmwave-cpd-reflectors-sensys-2024/
作者
Mars
发布于
2026年7月9日
许可协议