BSENSE:单雷达+合成反射器实现车内盲区儿童检测

BSENSE:单雷达+合成反射器实现车内盲区儿童检测

论文信息

  • 标题: BSENSE: In-vehicle Child Detection and Vital Sign Monitoring with a Single mmWave Radar and Synthetic Reflectors
  • 作者: Mingyue Tang, Pranshu Teckchandani, Jizheng He, Hanbo Guo, Elahe Soltanaghai
  • 机构: University of Illinois Urbana-Champaign (UIUC)
  • 会议: ACM SenSys 2024, Hangzhou, China
  • DOI: 10.1145/3666025.3699352

核心创新

首次提出合成反射器(Synthetic Reflectors)方案,通过在车内角落部署低成本反射器,将雷达信号引导至盲区,实现单雷达全舱覆盖,解决了传统mmWave雷达的遮挡问题。


一、问题定义:车内雷达盲区

1.1 传统方案的致命缺陷

graph LR
    A[传统雷达部署] --> B[顶棚中央]
    B --> C{视场覆盖}
    C -->|Line-of-Sight| D[前排座椅 ✅]
    C -->|部分遮挡| E[后排外侧 ⚠️]
    C -->|完全遮挡| F[后排内侧 ❌]
    C -->|完全遮挡| G[地板区域 ❌]

遮挡场景分析:

场景 盲区原因 儿童风险
安全座椅后排 头枕遮挡 🔴 高(最常见场景)
地板区域 座椅遮挡 🔴 高(爬离座椅)
脚部空间 座椅底部遮挡 🟡 中
被毯子覆盖 信号衰减 🟡 中

1.2 现有方案对比

方案 优点 缺点 成本
多雷达部署 全覆盖 成本高、数据融合复杂 $200+
UWB穿透 部分穿透 SNR低、功耗高 $150+
压力传感器 简单 无法检测生命体征 $50
BSENSE合成反射器 全覆盖+低成本 需额外安装 $5

二、合成反射器原理

2.1 工作机制

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

class SyntheticReflector:
"""
合成反射器仿真模型

工作原理:
1. 接收雷达发射信号
2. 放大并重新发射(主动反射)
3. 引导信号至盲区
"""

def __init__(self, position, gain=3.0, phase_shift=0):
"""
Args:
position: 反射器位置 (x, y, z)
gain: 信号放大倍数 (dB)
phase_shift: 相位偏移 (rad)
"""
self.position = np.array(position)
self.gain = 10 ** (gain / 20) # dB转线性
self.phase_shift = phase_shift

def reflect(self, tx_signal, tx_position):
"""
反射雷达信号

Args:
tx_signal: 发射信号
tx_position: 雷达位置

Returns:
reflected_signal: 反射后信号
"""
# 计算距离衰减
distance = np.linalg.norm(self.position - tx_position)
attenuation = 1 / (distance ** 2) # 距离平方衰减

# 反射信号
reflected = tx_signal * self.gain * attenuation
reflected = reflected * np.exp(1j * self.phase_shift)

return reflected

# 测试:在车内4角部署反射器
reflectors = [
SyntheticReflector(position=[-0.5, -1.5, 0.0], gain=3.0, phase_shift=0), # 左后角
SyntheticReflector(position=[-0.5, 1.5, 0.0], gain=3.0, phase_shift=np.pi/2), # 右后角
SyntheticReflector(position=[1.5, -1.0, 0.0], gain=3.0, phase_shift=np.pi), # 右前角
SyntheticReflector(position=[1.5, 1.0, 0.0], gain=3.0, phase_shift=-np.pi/2), # 左前角
]

# 雷达位置(顶棚中央)
radar_pos = np.array([0.0, 0.0, 0.8])

# 模拟反射
tx_signal = np.exp(1j * 2 * np.pi * 60e9 * 1e-6) # 60GHz信号
for i, ref in enumerate(reflectors):
reflected = ref.reflect(tx_signal, radar_pos)
print(f"反射器{i+1} 增益: {np.abs(reflected):.4f}, 相位: {np.angle(reflected):.2f} rad")

2.2 反射器硬件设计

方案A:角反射器(被动式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def corner_reflector_design():
"""
角反射器设计参数

优点:无源、低成本
缺点:增益固定、无相位控制
"""
design = {
'材料': '金属板(铝/铜)',
'形状': '三面角锥形',
'尺寸': '10cm × 10cm × 10cm',
'增益': '6-12 dBi',
'角度范围': '±30°',
'成本': '$2-5'
}
return design

方案B:主动反射器(有源)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def active_reflector_design():
"""
主动反射器设计参数

优点:可调增益/相位、定向增强
缺点:需供电、成本稍高
"""
design = {
'组件': [
'接收天线:60GHz贴片天线',
'放大器:LNA + PA(20dB增益)',
'发射天线:定向天线',
'控制:简单MCU(相位控制)'
],
'功耗': '10-50 mW',
'延迟': '< 1 ns',
'增益': '10-20 dB(可调)',
'成本': '$10-20'
}
return design

print("方案A(被动式):", corner_reflector_design())
print("\n方案B(主动式):", active_reflector_design())

2.3 反射路径仿真

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
def simulate_nlos_detection():
"""
仿真NLoS检测场景

场景:儿童在后排座椅被前排遮挡
"""
# 坐标定义(相对车辆坐标系)
radar_pos = np.array([0.0, 0.0, 0.8]) # 顶棚中央
child_pos = np.array([-1.2, 0.5, 0.2]) # 后排右侧(被遮挡)
reflector_pos = np.array([-0.5, -1.5, 0.0]) # 左后角反射器

# LoS路径(被遮挡)
los_path = child_pos - radar_pos
los_blocked = True # 前排座椅遮挡

# NLoS路径(通过反射器)
path1 = reflector_pos - radar_pos # 雷达→反射器
path2 = child_pos - reflector_pos # 反射器→儿童
nlos_distance = np.linalg.norm(path1) + np.linalg.norm(path2)

print(f"LoS路径:{np.linalg.norm(los_path):.2f}m(被遮挡:{los_blocked})")
print(f"NLoS路径:{nlos_distance:.2f}m(经反射器)")
print(f"路径增加:{(nlos_distance/np.linalg.norm(los_path)-1)*100:.1f}%")

# 信号强度估算
los_power = -30 # dBm(假设)
nlos_power = los_power + 6 # 反射器增益6dB
nloss_power -= 2 * 10 * np.log10(nlos_distance / np.linalg.norm(los_path))

print(f"\nLoS信号功率:{los_power:.1f} dBm(被遮挡=0)")
print(f"NLoS信号功率:{nlos_power:.1f} dBm(可用)")

simulate_nlos_detection()

三、系统架构

3.1 整体流程

sequenceDiagram
    participant R as 60GHz雷达
    participant S1 as 反射器1
    participant S2 as 反射器2
    participant C as 儿童
    participant A as 算法模块
    
    R->>C: LoS直射(被遮挡❌)
    R->>S1: 发射信号
    S1->>C: 反射至盲区
    C->>S1: 呼吸微动回波
    S1->>R: 反射回波
    R->>A: 原始数据
    A->>A: 距离-方位解算
    A->>A: NLoS路径识别
    A->>A: 生命体征提取
    A->>A: 儿童存在判断

3.2 信号处理流程

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
def bsense_pipeline(raw_adc_data, reflector_positions):
"""
BSENSE完整处理流程

Args:
raw_adc_data: ADC原始数据 (N_chirps, N_samples)
reflector_positions: 反射器位置列表

Returns:
detection_result: 检测结果
"""
# 1. Range FFT
range_profile = np.fft.fft(raw_adc_data, axis=1)

# 2. 识别反射器峰值(已知位置)
reflector_peaks = []
for pos in reflector_positions:
expected_range = np.linalg.norm(pos - radar_pos)
peak_idx = int(expected_range / range_resolution)
reflector_peaks.append(peak_idx)

# 3. 分析NLoS区域(反射器后方)
nlos_signals = []
for peak_idx in reflector_peaks:
# 反射器后方一定距离为NLoS区域
nlos_start = peak_idx + 10
nlos_end = peak_idx + 50
nlos_signal = range_profile[:, nlos_start:nlos_end]
nlos_signals.append(nlos_signal)

# 4. 相位提取(生命体征)
vital_signs = []
for signal in nlos_signals:
phase = np.angle(signal)
phase_unwrapped = np.unwrap(phase, axis=0)

# FFT提取呼吸/心跳
spectrum = np.fft.fft(phase_unwrapped, axis=0)
breathing_freq = np.argmax(np.abs(spectrum[5:30])) + 5 # 0.1-0.5 Hz
heartbeat_freq = np.argmax(np.abs(spectrum[40:100])) + 40 # 0.8-2.0 Hz

vital_signs.append({
'breathing_rate': breathing_freq * 0.02, # 转换为Hz
'heartbeat_rate': heartbeat_freq * 0.02,
'signal_strength': np.max(np.abs(spectrum))
})

# 5. 儿童检测判断
detection_result = {
'child_detected': any(vs['signal_strength'] > threshold for vs in vital_signs),
'vital_signs': vital_signs,
'nlos_coverage': len(reflector_positions)
}

return detection_result

四、关键技术细节

4.1 反射器位置优化

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
def optimize_reflector_positions(vehicle_dims, n_reflectors=4):
"""
优化反射器部署位置

目标:最大化盲区覆盖

Args:
vehicle_dims: 车辆尺寸 (length, width, height)
n_reflectors: 反射器数量

Returns:
optimal_positions: 最优位置坐标
"""
L, W, H = vehicle_dims

# 初始候选位置(车内角落)
corners = [
[-L/2, -W/2, 0], # 左后角
[-L/2, W/2, 0], # 右后角
[L/2, -W/2, 0], # 右前角
[L/2, W/2, 0], # 左前角
[-L/2, 0, H/2], # 后排中央
[0, -W/2, 0], # 右侧中央
[0, W/2, 0], # 左侧中央
]

# 盲区定义(高优先级)
blind_spots = [
[-L*0.4, W*0.3, 0.2], # 后排右后座椅(被遮挡)
[-L*0.4, -W*0.3, 0.2], # 后排左后座椅(被遮挡)
[-L*0.4, 0, 0], # 后排地板
]

# 贪心选择:每次选覆盖最多盲区的位置
optimal_positions = []
covered_blind_spots = set()

for _ in range(n_reflectors):
best_corner = None
best_coverage = 0

for corner in corners:
if corner in optimal_positions:
continue

# 计算该反射器能覆盖的盲区
coverage = 0
for i, blind_spot in enumerate(blind_spots):
if i in covered_blind_spots:
continue

# 检查反射路径是否可达
if is_reachable(radar_pos, corner, blind_spot):
coverage += 1

if coverage > best_coverage:
best_coverage = coverage
best_corner = corner

if best_corner:
optimal_positions.append(best_corner)
# 更新已覆盖盲区
for i, blind_spot in enumerate(blind_spots):
if is_reachable(radar_pos, best_corner, blind_spot):
covered_blind_spots.add(i)

return optimal_positions

def is_reachable(radar_pos, reflector_pos, target_pos):
"""
检查反射路径是否可达
"""
# 简化:计算角度是否在范围内
path1 = reflector_pos - radar_pos
path2 = target_pos - reflector_pos

# 反射角计算(简化)
angle1 = np.arctan2(path1[1], path1[0])
angle2 = np.arctan2(path2[1], path2[0])

# 反射器视场范围(±30°)
if abs(angle2 - angle1) < np.pi / 6:
return True
return False

# 测试
vehicle_dims = (4.5, 1.8, 1.5) # 中型SUV
optimal_pos = optimize_reflector_positions(vehicle_dims, n_reflectors=4)
print("最优反射器位置:")
for i, pos in enumerate(optimal_pos):
print(f" 反射器{i+1}: x={pos[0]:.2f}m, y={pos[1]:.2f}m, z={pos[2]:.2f}m")

4.2 NLoS信号分离

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
def separate_los_nlos(range_profile, reflector_peaks):
"""
分离LoS和NLoS信号

Args:
range_profile: 距离剖面 (N_azimuth, N_range)
reflector_peaks: 反射器峰值索引

Returns:
los_signal: LoS区域信号
nlos_signals: NLoS区域信号列表
"""
# LoS区域:距离 < 最近反射器
los_end = min(reflector_peaks) - 5
los_signal = range_profile[:, :los_end]

# NLoS区域:每个反射器后方
nlos_signals = []
for peak in reflector_peaks:
# 反射器后方一定距离
nlos_start = peak + 10
nlos_end = peak + 100 # 约1.5m范围
nlos_signal = range_profile[:, nlos_start:nlos_end]
nlos_signals.append(nlos_signal)

return los_signal, nlos_signals

4.3 多反射器干扰消除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def cancel_interference(nlos_signals, reflector_phases):
"""
消除多反射器间干扰

方法:相位编码 + 正交分离

Args:
nlos_signals: NLoS信号列表
reflector_phases: 各反射器相位偏移

Returns:
separated_signals: 分离后的信号
"""
separated_signals = []

for i, (signal, phase) in enumerate(zip(nlos_signals, reflector_phases)):
# 相位补偿
compensated = signal * np.exp(-1j * phase)

# 时域滤波(分离不同反射器信号)
# 基于不同的时延特征
separated_signals.append(compensated)

return separated_signals

五、实验结果

5.1 测试环境

参数
雷达型号 TI IWR6843AOP (60GHz)
反射器类型 被动角反射器(铝制)
反射器尺寸 10cm × 10cm × 10cm
反射器数量 4个
测试车辆 中型SUV(途观L)
测试时长 120秒/场景

5.2 覆盖范围对比

区域 无反射器 4反射器 提升
前排座椅 -
后排外侧 ⚠️ +40%
后排内侧 +100%
地板区域 ⚠️ +80%
总覆盖率 60% 95% +35%

5.3 检测精度

场景 LoS检测 NLoS检测 差异
呼吸率MAE 0.5 bpm 1.2 bpm +0.7
心跳率MAE 1.0 bpm 2.5 bpm +1.5
儿童检测准确率 98% 92% -6%
误报率 2% 5% +3%

六、IMS部署指南

6.1 硬件清单

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
def bsense_hardware_bom():
"""
BSENSE方案硬件清单
"""
bom = {
'雷达': {
'型号': 'TI IWR6843AOP',
'单价': '$80',
'数量': 1,
'说明': '60GHz AOP封装,集成天线'
},
'反射器': {
'型号': '定制角反射器',
'单价': '$3',
'数量': 4,
'材料': '铝板(2mm厚)',
'尺寸': '10cm × 10cm × 10cm'
},
'安装': {
'雷达支架': '$5',
'反射器支架': '$8(4个)',
'线束': '$3'
},
'总成本': '$80 + $12 + $16 = $108'
}

return bom

6.2 安装位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
车辆俯视图:

前挡风玻璃
┌─────────────────┐
│ [Radar] 中央 │
│ ● │
│ │
│ ◥ S1 S2 ◤ │ ← 反射器(左后/右后角)
│ │
│ │
│ ◣ S4 S3 ◢ │ ← 反射器(左前/右前角)
│ │
└─────────────────┘
后备箱

6.3 算法集成

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
def integrate_bsense_to_ims():
"""
将BSENSE集成到IMS系统
"""
integration_plan = {
'输入': {
'源': 'IWR6843AOP雷达ADC数据',
'格式': '(N_chirps, N_samples, N_rx)',
'频率': '10 Hz(CPD模式)'
},
'处理': {
'模块1': 'Range FFT + CFAR检测',
'模块2': '反射器峰值识别(预标定)',
'模块3': 'NLoS区域相位提取',
'模块4': 'VMD降噪 + FFT生命体征',
'模块5': '多反射器数据融合'
},
'输出': {
'child_detected': 'bool',
'position': '(azimuth, range)',
'vital_signs': '(HR, BR)',
'confidence': 'float [0-1]'
},
'时延': '< 500 ms(满足Euro NCAP)'
}

return integration_plan

6.4 与Euro NCAP对接

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
def euroncap_cpd_compliance():
"""
Euro NCAP CPD合规性检查
"""
compliance = {
'检测能力': {
'呼吸检测': '✅ 0.1-0.5 Hz(12-30次/分)',
'心跳检测': '✅ 0.8-2.0 Hz(48-120次/分)',
'微动检测': '✅ > 0.1 mm(穿透毯子)'
},
'覆盖区域': {
'要求': '所有座椅位置',
'BSENSE方案': '95%覆盖(反射器补充盲区)',
'未覆盖': '后备箱/极端角落'
},
'警告逻辑': {
'一级': '检测到儿童 → 车内显示',
'二级': '90秒后 → 手机推送',
'三级': '温度>40°C → 紧急呼叫',
'BSENSE支持': '✅ 全部支持'
},
'成本': {
'要求': '无明确成本限制',
'BSENSE方案': '$108(雷达$80+反射器$12+安装$16)',
'优势': '比多雷达方案节省50%'
}
}

return compliance

七、局限与改进

7.1 当前局限

问题 原因 解决方案
反射器需手动标定 位置固定 出厂自动标定流程
极端遮挡失效 多层座椅阻挡 增加反射器数量
运动伪影 车辆振动 自适应滤波
反射器污损 长期使用 自清洁涂层/定期维护

7.2 未来工作

  1. 自适应反射器:可调相位/增益的主动反射器
  2. 深度学习:CNN识别NLoS信号特征
  3. 多车适配:自动学习反射器最优位置
  4. OTA更新:远程优化反射器参数

八、总结

BSENSE通过合成反射器巧妙解决了mmWave雷达的遮挡问题,以**$12的额外成本实现95%舱内覆盖**,为Euro NCAP CPD要求提供了高性价比方案

核心价值:

  • 单雷达全覆盖:无需多雷达融合
  • 低成本:反射器仅$3/个
  • 隐私友好:无视觉传感器
  • 穿透性强:穿透毯子/安全座椅

IMS应用优先级:

  1. 立即落地:CPD儿童检测(满足Euro NCAP 2026)
  2. 中期规划:后排乘员健康监测
  3. 长期研究:多模态融合(雷达+视觉+座椅传感器)

论文资源:

  • DOI: 10.1145/3666025.3699352
  • 会议:ACM SenSys 2024
  • 机构:UIUC

参考文献:

  1. Tang et al., “BSENSE: In-vehicle Child Detection and Vital Sign Monitoring with a Single mmWave Radar and Synthetic Reflectors”, ACM SenSys 2024.
  2. Euro NCAP, “Child Presence Detection Test and Assessment Protocol v1.3”, 2025.
  3. TI, “IWR6843AOP 60GHz mmWave Sensor”, Product Brief, 2024.

BSENSE:单雷达+合成反射器实现车内盲区儿童检测
https://dapalm.com/2026/08/18/2026-08-18-bsense-nlos-child-detection/
作者
Mars
发布于
2026年8月18日
许可协议