Euro NCAP 2026 CPD儿童存在检测:完整实现指南

Euro NCAP 2026 CPD儿童存在检测:完整实现指南

法规来源: Euro NCAP 2026 Assessment Protocol
核心指标: 锁车后15秒内检测到儿童并发出警告
最高得分: 5分(乘员监控类别)


CPD法规背景

每年美国平均有37名儿童因被留在停放车辆中死于热射病。Euro NCAP 2026协议强化了儿童存在检测(CPD)要求,要求系统不仅能检测儿童,还要在关键时刻采取行动。

Euro NCAP 2026 CPD评分

评分项 分值 要求
基础检测 2分 检测儿童存在
全座覆盖 1分 所有座位位置
快速响应 1分 15秒内警告
干预措施 1分 气候控制/解锁

CPD核心功能要求

1. 检测场景

场景 描述 时限
儿童遗留 锁车后儿童留在车内 锁车后15秒警告
儿童误入 儿童进入未锁车辆被困 关门后10分钟警告

2. 覆盖区域

  • ✅ 所有座椅位置(含可选座椅)
  • ✅ 脚部空间
  • ✅ 驾驶员座椅
  • ❌ 行李箱(不要求)

3. 检测对象

  • 年龄范围: ≤6岁儿童
  • 检测方法: 直接感知(运动/呼吸/心跳)
  • 默认状态: 每次行程开始时自动开启

4. 为什么后排提醒不算CPD

后排座椅提醒系统通常基于间接推断:

  • 后门是否在行程前打开
  • 使用模式假设

Euro NCAP 2026明确不接受间接方法,要求直接检测儿童生理特征。


警告时序要求

锁车场景时序

1
2
3
4
5
6
7
锁车 → 检测儿童(≤15秒) → 初始警告(≥3秒)

驾驶员延迟(最多10分钟)

升级警告(90秒内开始,每分钟重复,持续≥20分钟)

干预措施(≤10分钟)

未锁车场景时序

1
2
3
关门 → 检测儿童(≤10分钟) → 初始警告(≥3秒)

升级警告流程同上

技术实现方案

方案一:60GHz毫米波雷达

优势:

  • 穿透遮挡检测
  • 检测心跳/呼吸微动
  • 低功耗(<100mW)
  • 全天候工作

传感器配置:

参数 规格 说明
频率 60GHz ISM频段,免许可
带宽 4GHz 高分辨率
发射天线 2Tx 覆盖全车
接收天线 4Rx 多普勒检测
刷新率 10Hz 实时监测

检测原理:

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
# 心跳/呼吸微多普勒检测
def detect_vital_signs(radar_data):
"""
从雷达信号提取心跳/呼吸特征

Args:
radar_data: 雷达ADC数据 (frames, rx_channels, samples)

Returns:
heart_rate: 心率 (bpm)
respiration_rate: 呼吸率 (bpm)
child_detected: 是否检测到儿童
"""
# 1. 距离-多普勒FFT
range_doppler = np.fft.fft2(radar_data, axes=(1, 2))

# 2. 静态杂波抑制
static_clutter = np.mean(range_doppler, axis=0)
range_doppler_clean = range_doppler - static_clutter

# 3. 微动检测(心跳/呼吸)
# 心跳:0.8-2Hz,呼吸:0.1-0.5Hz
micro_doppler = extract_micro_doppler(range_doppler_clean)

# 4. 特征提取
heart_rate = estimate_heart_rate(micro_doppler)
respiration_rate = estimate_respiration(micro_doppler)

# 5. 儿童判定(呼吸+心跳)
child_detected = (respiration_rate > 0.1) and (heart_rate > 60)

return heart_rate, respiration_rate, child_detected

方案二:热成像摄像头

优势:

  • 直观显示儿童位置
  • 不受光照影响
  • 可检测体温

配置:

参数 规格
分辨率 80×60 或 160×120
帧率 9Hz
温度精度 ±0.5°C
波段 8-14μm

方案三:雷达+摄像头融合

最优方案:

graph LR
    A[60GHz雷达] --> D[融合模块]
    B[热成像摄像头] --> D
    C[RGB摄像头] --> D
    D --> E{儿童检测}
    E -->|是| F[警告系统]
    E -->|否| G[休眠]
    F --> H[气候控制]
    F --> I[车门解锁]
    F --> J[APP通知]

完整实现代码

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
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
"""
Euro NCAP 2026 CPD状态机实现
"""
import time
from enum import Enum
from dataclasses import dataclass
from typing import Optional

class CPDState(Enum):
"""CPD状态"""
IDLE = 0 # 车辆运行中
MONITORING = 1 # 锁车后监测
DETECTED = 2 # 检测到儿童
WARNING_INITIAL = 3 # 初始警告
WARNING_ESCALATION = 4 # 升级警告
INTERVENTION = 5 # 干预措施
FALSE_ALARM = 6 # 误报(驾驶员取消)

@dataclass
class CPDConfig:
"""CPD配置参数"""
detection_timeout_sec: float = 15.0 # 锁车后检测时限
initial_warning_sec: float = 3.0 # 初始警告时长
driver_delay_max_sec: float = 600.0 # 驾驶员最大延迟(10分钟)
escalation_start_sec: float = 90.0 # 升级警告开始时间
escalation_interval_sec: float = 60.0 # 升级警告间隔
escalation_duration_sec: float = 15.0 # 每次升级警告时长
intervention_timeout_sec: float = 600.0 # 干预措施时限

class CPDStateMachine:
"""CPD状态机"""

def __init__(self, config: CPDConfig):
self.config = config
self.state = CPDState.IDLE
self.lock_time: Optional[float] = None
self.detection_time: Optional[float] = None
self.warning_start_time: Optional[float] = None
self.driver_delay_count: int = 0
self.child_detected: bool = False

def on_vehicle_locked(self):
"""车辆锁定事件"""
self.state = CPDState.MONITORING
self.lock_time = time.time()
print(f"[CPD] 进入监测模式,开始检测儿童...")

def on_child_detected(self, sensor_data: dict):
"""检测到儿童"""
if self.state not in [CPDState.MONITORING, CPDState.DETECTED]:
return

self.child_detected = True
self.detection_time = time.time()

# 检查检测时限
if self.lock_time:
elapsed = self.detection_time - self.lock_time
if elapsed <= self.config.detection_timeout_sec:
self.state = CPDState.DETECTED
print(f"[CPD] ✓ 儿童检测成功,耗时: {elapsed:.1f}秒")
else:
print(f"[CPD] ✗ 检测超时: {elapsed:.1f}秒 > {self.config.detection_timeout_sec}秒")

def on_child_left(self):
"""儿童离开"""
self.child_detected = False
if self.state in [CPDState.DETECTED, CPDState.WARNING_INITIAL]:
self.state = CPDState.FALSE_ALARM
print(f"[CPD] 儿童已离开,取消警告")

def on_driver_cancel(self):
"""驾驶员取消警告"""
if self.state != CPDState.WARNING_INITIAL:
return

if self.driver_delay_count < 1: # 只允许延迟一次
self.driver_delay_count += 1
print(f"[CPD] 驾驶员延迟警告(仅允许一次)")
return

self.state = CPDState.FALSE_ALARM
print(f"[CPD] 驾驶员取消,视为误报")

def update(self) -> dict:
"""更新状态机,返回当前状态和动作"""
current_time = time.time()
actions = {
"state": self.state.name,
"warning": False,
"escalation": False,
"intervention": False,
"message": ""
}

if self.state == CPDState.DETECTED:
# 立即开始初始警告
self.state = CPDState.WARNING_INITIAL
self.warning_start_time = current_time
actions["warning"] = True
actions["message"] = "检测到儿童!请检查车辆!"
print(f"[CPD] 触发初始警告")

elif self.state == CPDState.WARNING_INITIAL:
# 检查初始警告时长
elapsed = current_time - self.warning_start_time
if elapsed >= self.config.initial_warning_sec:
self.state = CPDState.WARNING_ESCALATION
print(f"[CPD] 进入升级警告模式")

elif self.state == CPDState.WARNING_ESCALATION:
actions["escalation"] = True
actions["message"] = "儿童仍在车内!紧急通知!"

# 检查是否需要干预
if self.lock_time:
elapsed = current_time - self.lock_time
if elapsed >= self.config.intervention_timeout_sec:
self.state = CPDState.INTERVENTION
print(f"[CPD] 触发干预措施")

elif self.state == CPDState.INTERVENTION:
actions["intervention"] = True
actions["message"] = "激活气候控制/解锁车门"

return actions


# 测试代码
if __name__ == "__main__":
config = CPDConfig()
cpd = CPDStateMachine(config)

# 模拟场景
print("\n=== 场景1: 正常检测 ===")
cpd.on_vehicle_locked()
time.sleep(0.1)
cpd.on_child_detected({"radar": "heartbeat detected"})

for _ in range(5):
result = cpd.update()
print(f"状态: {result['state']}, 动作: {result['message']}")
time.sleep(0.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
def activate_climate_control(cabin_temp: float, threshold: float = 35.0):
"""
激活气候控制保护儿童

Args:
cabin_temp: 车内温度 (°C)
threshold: 危险温度阈值

Returns:
dict: 控制命令
"""
if cabin_temp >= threshold:
# 紧急降温
return {
"ac_power": "MAX",
"target_temp": 22.0,
"vent_mode": "FACE", # 面部出风
"fan_speed": 100,
"duration_min": 30
}
else:
# 维持舒适温度
return {
"ac_power": "AUTO",
"target_temp": 24.0,
"vent_mode": "AUTO",
"fan_speed": 50,
"duration_min": 20
}

车门解锁

1
2
3
4
5
6
7
8
9
10
def unlock_doors_for_intervention():
"""解锁车门便于救援"""
return {
"driver_door": True,
"passenger_door": True,
"rear_doors": True,
"trunk": False, # 行李箱可选
"hazard_lights": True, # 危险警示灯
"horn": True # 鸣笛
}

APP通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def send_mobile_notification(driver_phone: str, location: tuple):
"""发送手机APP通知"""
message = f"""
⚠️ 紧急警告:检测到儿童在车内!

位置: {location[0]:.4f}, {location[1]:.4f}
时间: {time.strftime('%Y-%m-%d %H:%M:%S')}

系统已激活气候控制保护儿童。
如需帮助,请联系附近人员或紧急服务。
"""

return {
"push_notification": True,
"sms_backup": True,
"emergency_contact": True, # 同时通知紧急联系人
"message": message
}

IMS开发启示

优先级排序

优先级 功能 原因
P0 60GHz雷达检测 Euro NCAP强制,技术成熟
P0 15秒检测时限 达标硬指标
P1 气候控制干预 获得满分关键
P1 APP通知 提升安全响应
P2 热成像辅助 提高检测置信度
P2 多座位覆盖 获得额外分数

传感器选型建议

传感器 型号 厂商 功耗 价格
60GHz雷达 IWR6843AOP TI 120mW $15
60GHz雷达 BGT60TR13C Infineon 80mW $12
热成像 MLX90640 Melexis 150mW $25
IR摄像头 OV2311 OmniVision 200mW $10

测试场景清单

场景编号 场景描述 通过条件
CPD-01 儿童遗留锁车 ≤15秒警告
CPD-02 儿童误入未锁车 ≤10分钟警告
CPD-03 遮挡检测(毯子) 检测成功
CPD-04 多儿童检测 全部检测
CPD-05 宠物排除 不误报
CPD-06 温度干预 ≥35°C激活AC

总结

Euro NCAP 2026 CPD要求的核心要点:

  1. 直接检测:不接受间接推断方法
  2. 快速响应:锁车后15秒内警告
  3. 全座覆盖:所有座椅位置
  4. 干预措施:气候控制/解锁车门

IMS开发建议:优先实现60GHz雷达方案,满足强制要求后再增加热成像辅助。


参考文档:

  • Euro NCAP 2026 Assessment Protocol v1.1
  • Smart Eye CPD技术白皮书
  • TI 60GHz雷达CPD应用笔记

Euro NCAP 2026 CPD儿童存在检测:完整实现指南
https://dapalm.com/2026/07/29/2026-07-29-euro-ncap-2026-cpd-requirements-implementation/
作者
Mars
发布于
2026年7月29日
许可协议