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: 是否检测到儿童 """ range_doppler = np.fft.fft2(radar_data, axes=(1 , 2 )) static_clutter = np.mean(range_doppler, axis=0 ) range_doppler_clean = range_doppler - static_clutter micro_doppler = extract_micro_doppler(range_doppler_clean) heart_rate = estimate_heart_rate(micro_doppler) respiration_rate = estimate_respiration(micro_doppler) 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 timefrom enum import Enumfrom dataclasses import dataclassfrom 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 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:.1 f} 秒" ) else : print (f"[CPD] ✗ 检测超时: {elapsed:.1 f} 秒 > {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 actionsif __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 ]:.4 f} , {location[1 ]:.4 f} 时间: {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要求的核心要点:
直接检测 :不接受间接推断方法
快速响应 :锁车后15秒内警告
全座覆盖 :所有座椅位置
干预措施 :气候控制/解锁车门
IMS开发建议 :优先实现60GHz雷达方案,满足强制要求后再增加热成像辅助。
参考文档:
Euro NCAP 2026 Assessment Protocol v1.1
Smart Eye CPD技术白皮书
TI 60GHz雷达CPD应用笔记