Euro NCAP 2026 CPD儿童检测协议详解:测试场景与合规要点

Euro NCAP 2026 CPD儿童检测协议详解:测试场景与合规要点

来源: Euro NCAP Safe Driving Protocol v0.9
发布时间: 2026年4月
核心价值: CPD从2023年评分项变为2026年强制要求


核心洞察

Euro NCAP CPD评分体系:

年份 CPD状态 分值
2023 评分项 0.5分
2024 评分项 1.0分
2025 评分项 1.5分
2026 强制要求 2.0分

检测技术路线:

  • 雷达(推荐):穿透性强、隐私友好
  • 摄像头:成本较低、信息丰富
  • 超声波:成本低、精度有限
  • 压力传感器:间接检测、精度低

一、CPD测试场景

1.1 官方测试场景

场景编号 场景描述 目标位置 检测时限
CPD-01 婴儿座椅-后向 后排座椅 ≤90秒
CPD-02 婴儿座椅-前向 后排座椅 ≤90秒
CPD-03 儿童座椅-增高垫 后排座椅 ≤90秒
CPD-04 儿童躺卧 后排地板 ≤90秒
CPD-05 儿童被毯子覆盖 后排座椅 ≤90秒
CPD-06 儿童在脚部空间 前排脚部 ≤90秒
CPD-07 宠物遗留 后排座椅 ≤90秒

1.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
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
"""
Euro NCAP CPD测试协议
"""

from dataclasses import dataclass
from typing import List, Tuple, Optional
from enum import Enum

class ChildType(Enum):
"""儿童类型"""
INFANT = "infant" # 婴儿 (0-12月)
TODDLER = "toddler" # 幼儿 (1-3岁)
CHILD = "child" # 儿童 (3-8岁)
PET = "pet" # 宠物

class SeatPosition(Enum):
"""座椅位置"""
FRONT_PASSENGER = "front_passenger"
REAR_LEFT = "rear_left"
REAR_CENTER = "rear_center"
REAR_RIGHT = "rear_right"
TRUNK = "trunk" # 不检测

class SeatType(Enum):
"""座椅类型"""
REAR_FACING = "rear_facing" # 后向婴儿座椅
FORWARD_FACING = "forward_facing" # 前向儿童座椅
BOOSTER = "booster" # 增高垫
NONE = "none" # 无座椅

@dataclass
class CPDTestScenario:
"""CPD测试场景"""
scenario_id: str
child_type: ChildType
seat_position: SeatPosition
seat_type: SeatType
covered: bool = False # 是否被毯子覆盖
in_footwell: bool = False # 是否在脚部空间
detection_timeout: int = 90 # 秒

class CPDTestProtocol:
"""
Euro NCAP CPD测试协议

包含所有官方测试场景
"""

def __init__(self):
self.scenarios = self._create_scenarios()

def _create_scenarios(self) -> List[CPDTestScenario]:
"""创建测试场景"""
return [
# 场景CPD-01:后向婴儿座椅
CPDTestScenario(
scenario_id="CPD-01",
child_type=ChildType.INFANT,
seat_position=SeatPosition.REAR_LEFT,
seat_type=SeatType.REAR_FACING,
),

# 场景CPD-02:前向儿童座椅
CPDTestScenario(
scenario_id="CPD-02",
child_type=ChildType.TODDLER,
seat_position=SeatPosition.REAR_LEFT,
seat_type=SeatType.FORWARD_FACING,
),

# 场景CPD-03:增高垫
CPDTestScenario(
scenario_id="CPD-03",
child_type=ChildType.CHILD,
seat_position=SeatPosition.REAR_CENTER,
seat_type=SeatType.BOOSTER,
),

# 场景CPD-04:儿童躺卧地板
CPDTestScenario(
scenario_id="CPD-04",
child_type=ChildType.CHILD,
seat_position=SeatPosition.REAR_LEFT,
seat_type=SeatType.NONE,
in_footwell=True,
),

# 场景CPD-05:毯子覆盖
CPDTestScenario(
scenario_id="CPD-05",
child_type=ChildType.INFANT,
seat_position=SeatPosition.REAR_LEFT,
seat_type=SeatType.REAR_FACING,
covered=True,
),

# 场景CPD-06:前排脚部空间
CPDTestScenario(
scenario_id="CPD-06",
child_type=ChildType.CHILD,
seat_position=SeatPosition.FRONT_PASSENGER,
seat_type=SeatType.NONE,
in_footwell=True,
),

# 场景CPD-07:宠物
CPDTestScenario(
scenario_id="CPD-07",
child_type=ChildType.PET,
seat_position=SeatPosition.REAR_LEFT,
seat_type=SeatType.NONE,
),
]

def get_scenario(self, scenario_id: str) -> Optional[CPDTestScenario]:
"""获取测试场景"""
for s in self.scenarios:
if s.scenario_id == scenario_id:
return s
return None

def print_all_scenarios(self):
"""打印所有场景"""
print("=== Euro NCAP CPD测试场景 ===\n")
for s in self.scenarios:
print(f"{s.scenario_id}:")
print(f" 儿童: {s.child_type.value}")
print(f" 位置: {s.seat_position.value}")
print(f" 座椅: {s.seat_type.value}")
if s.covered:
print(f" ⚠️ 毯子覆盖")
if s.in_footwell:
print(f" ⚠️ 脚部空间")
print()


# 实际测试
if __name__ == "__main__":
protocol = CPDTestProtocol()
protocol.print_all_scenarios()

二、技术要求

2.1 检测性能要求

指标 要求 说明
检测率 ≥90% 各场景平均
误报率 ≤5次/天 空车状态
检测时限 ≤90秒 锁车后启动
工作温度 -40°C to +85°C 全温度范围
电源模式 休眠模式可用 低功耗

2.2 传感器要求

传感器类型 优势 劣势 Euro NCAP推荐
60GHz雷达 穿透性强、隐私友好 成本中等 ⭐⭐⭐⭐⭐
红外摄像头 信息丰富、成本低 隐私问题、遮挡敏感 ⭐⭐⭐⭐
超声波 成本低 精度低、穿透差 ⭐⭐
压力传感器 简单可靠 仅检测重量 ⭐⭐

三、报警系统

3.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
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
"""
CPD报警系统
"""

from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
import time

class AlertType(Enum):
"""报警类型"""
VISUAL = "visual" # 视觉报警(仪表盘)
AUDIBLE = "audible" # 听觉报警(蜂鸣器)
HAPTIC = "haptic" # 触觉报警(振动)
REMOTE = "remote" # 远程报警(手机App)

class AlertLevel(Enum):
"""报警等级"""
INFO = 0 # 信息提示
WARNING = 1 # 警告
CRITICAL = 2 # 严重警告
EMERGENCY = 3 # 紧急

@dataclass
class AlertAction:
"""报警动作"""
alert_type: AlertType
level: AlertLevel
duration: float # 秒
repeat: int = 1 # 重复次数
message: str = ""

class CPDAlertSystem:
"""
CPD报警系统

报警策略:
1. 锁车后90秒内检测
2. 检测到儿童后多级报警
3. 本地报警+远程通知
"""

def __init__(self):
# 报警配置
self.alert_sequence = [
# 第一级:视觉提示
AlertAction(
alert_type=AlertType.VISUAL,
level=AlertLevel.INFO,
duration=5.0,
message="检查后座"
),

# 第二级:视觉+听觉警告
AlertAction(
alert_type=AlertType.AUDIBLE,
level=AlertLevel.WARNING,
duration=10.0,
repeat=3,
message="检测到儿童遗留!"
),

# 第三级:全面报警
AlertAction(
alert_type=AlertType.AUDIBLE,
level=AlertLevel.CRITICAL,
duration=30.0,
repeat=5,
message="紧急!儿童被困车内!"
),

# 第四级:远程通知
AlertAction(
alert_type=AlertType.REMOTE,
level=AlertLevel.EMERGENCY,
duration=0,
message="紧急通知:检测到儿童遗留,请立即返回车辆!"
),
]

# 状态
self.detection_start: Optional[float] = None
self.current_level = 0

def on_detection(self, child_detected: bool) -> List[AlertAction]:
"""
检测事件处理

Args:
child_detected: 是否检测到儿童

Returns:
报警动作列表
"""
if child_detected:
if self.detection_start is None:
self.detection_start = time.time()

elapsed = time.time() - self.detection_start

# 确定报警等级
alerts = []

if elapsed >= 60: # 60秒后紧急通知
alerts.append(self.alert_sequence[3]) # 远程通知
elif elapsed >= 30: # 30秒后全面报警
alerts.append(self.alert_sequence[2])
elif elapsed >= 10: # 10秒后警告
alerts.append(self.alert_sequence[1])
else: # 10秒内提示
alerts.append(self.alert_sequence[0])

return alerts
else:
# 重置
self.detection_start = None
self.current_level = 0
return []

def trigger_alerts(self, alerts: List[AlertAction]):
"""触发报警"""
for alert in alerts:
self._execute_alert(alert)

def _execute_alert(self, alert: AlertAction):
"""执行单个报警动作"""
print(f"\n[{alert.level.name}] {alert.alert_type.value}")
print(f" 消息: {alert.message}")
print(f" 持续: {alert.duration}s")
if alert.repeat > 1:
print(f" 重复: {alert.repeat}次")


# 实际测试
if __name__ == "__main__":
alert_system = CPDAlertSystem()

print("=== CPD报警系统测试 ===")

# 模拟检测过程
for i in range(8):
time.sleep(0.001) # 模拟时间流逝

# 检测到儿童
alerts = alert_system.on_detection(True)

if alerts:
elapsed = time.time() - alert_system.detection_start if alert_system.detection_start else 0
print(f"\n--- {i*10}秒后 ---")
alert_system.trigger_alerts(alerts)

3.2 报警时限要求

时间节点 要求 说明
T+0s 锁车检测启动 车辆进入休眠模式
T+10s 检测完成 必须完成扫描
T+30s 本地报警启动 车内报警
T+60s 远程通知 手机App通知
T+90s 最后期限 必须发出远程通知

四、合规测试

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
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
"""
CPD合规测试环境
"""

from dataclasses import dataclass
from typing import List
import numpy as np

@dataclass
class TestEnvironment:
"""测试环境配置"""
temperature: float # 温度 (°C)
humidity: float # 湿度 (%)
light_condition: str # 光照条件
vehicle_state: str # 车辆状态

class CPDComplianceTest:
"""
CPD合规测试

测试条件:
1. 温度范围:-40°C to +85°C
2. 湿度范围:20% to 95%
3. 光照条件:日光/夜间/隧道
4. 车辆状态:锁车后休眠模式
"""

def __init__(self):
# 测试环境配置
self.environments = [
TestEnvironment(-40, 50, "dark", "locked"),
TestEnvironment(0, 80, "daylight", "locked"),
TestEnvironment(25, 50, "daylight", "locked"),
TestEnvironment(45, 30, "sunlight", "locked"),
TestEnvironment(85, 20, "daylight", "locked"),
]

# 测试结果
self.results: List[dict] = []

def run_test(self,
scenario_id: str,
detector, # CPD检测器
environment: TestEnvironment) -> dict:
"""
运行单个测试

Args:
scenario_id: 场景ID
detector: CPD检测器
environment: 测试环境

Returns:
测试结果
"""
# 模拟检测
# 实际部署时调用真实检测器
detected = np.random.rand() > 0.1 # 90%检测率
detection_time = np.random.uniform(5, 60) # 5-60秒
false_positive = np.random.rand() < 0.02 # 2%误报率

result = {
'scenario_id': scenario_id,
'temperature': environment.temperature,
'detected': detected,
'detection_time': detection_time,
'false_positive': false_positive,
'pass': detected and detection_time <= 90 and not false_positive
}

self.results.append(result)
return result

def run_all_tests(self, detector) -> dict:
"""
运行所有测试

Args:
detector: CPD检测器

Returns:
汇总结果
"""
from itertools import product

# 创建测试协议
protocol = CPDTestProtocol()

# 所有组合
test_cases = list(product(protocol.scenarios, self.environments))

print(f"总测试数: {len(test_cases)}")

for scenario, env in test_cases:
self.run_test(scenario.scenario_id, detector, env)

# 汇总统计
total = len(self.results)
passed = sum(1 for r in self.results if r['pass'])
detection_rate = sum(1 for r in self.results if r['detected']) / total
avg_time = np.mean([r['detection_time'] for r in self.results])

return {
'total_tests': total,
'passed': passed,
'pass_rate': passed / total * 100,
'detection_rate': detection_rate * 100,
'avg_detection_time': avg_time,
}

def generate_report(self, output_path: str):
"""生成测试报告"""
with open(output_path, 'w') as f:
f.write("# CPD合规测试报告\n\n")
f.write("## 测试结果汇总\n\n")

total = len(self.results)
passed = sum(1 for r in self.results if r['pass'])

f.write(f"- 总测试数: {total}\n")
f.write(f"- 通过数: {passed}\n")
f.write(f"- 通过率: {passed/total*100:.1f}%\n\n")

f.write("## 详细结果\n\n")
f.write("| 场景 | 温度(°C) | 检测结果 | 检测时间(s) | 通过 |\n")
f.write("|------|----------|----------|-------------|------|\n")

for r in self.results:
status = "✅" if r['pass'] else "❌"
f.write(f"| {r['scenario_id']} | {r['temperature']} | "
f"{'检测到' if r['detected'] else '未检测到'} | "
f"{r['detection_time']:.1f} | {status} |\n")


# 实际测试
if __name__ == "__main__":
test = CPDComplianceTest()

# 运行测试(使用模拟检测器)
class MockDetector:
def detect(self):
return True

detector = MockDetector()
summary = test.run_all_tests(detector)

print("\n=== 测试汇总 ===")
print(f"总测试数: {summary['total_tests']}")
print(f"通过率: {summary['pass_rate']:.1f}%")
print(f"检测率: {summary['detection_rate']:.1f}%")
print(f"平均检测时间: {summary['avg_detection_time']:.1f}s")

五、OEM合规要点

5.1 技术选型建议

需求 推荐方案 理由
高端车型 60GHz雷达 穿透性最好
中端车型 红外摄像头 成本适中
经济车型 超声波+压力传感器 成本最低

5.2 合规检查清单

检查项 要求 验证方法
[ ] 检测率≥90% 各场景平均 官方测试
[ ] 误报率≤5次/天 空车状态 长期测试
[ ] 检测时限≤90秒 锁车后 计时测试
[ ] 全温度范围 -40°C to +85°C 环境舱测试
[ ] 低功耗模式 休眠可用 电流测试
[ ] 报警系统 多级报警 功能测试
[ ] 远程通知 手机App 连接测试

六、总结

6.1 核心要点

  1. CPD 2026年强制要求
  2. 雷达方案检测率最高
  3. 90秒内必须完成检测
  4. 多级报警+远程通知
  5. 全温度范围验证

6.2 实施时间表

时间 里程碑
2025 Q2 技术方案确认
2025 Q4 原型验证完成
2026 Q1 合规测试通过
2026 Q3 量产导入

参考文档:

  • Euro NCAP Safe Driving Protocol v0.9
  • Euro NCAP 2026 Assessment Protocol
  • FMVSS Hot Cars Act (美国)

Euro NCAP 2026 CPD儿童检测协议详解:测试场景与合规要点
https://dapalm.com/2026/04/24/2026-04-24-euro-ncap-cpd-protocol-test/
作者
Mars
发布于
2026年4月24日
许可协议