Euro NCAP CPD假人认证:2026测试标准详解

新闻要点

  • 发布日期: 2026-05-15
  • 来源: 4activeSystems
  • 里程碑: 全系列CPD假人获得Euro NCAP认证(Protocol v1.3)
  • 覆盖范围: 新生儿、婴儿、幼儿全年龄段

CPD假人类型

假人类型 年龄范围 体重 身高 应用场景
Newborn 0-1月 3.5kg 50cm 后向安全座椅
Infant 1-12月 9kg 75cm 后向/前向座椅
Toddler 1-3岁 15kg 95cm 前向座椅
Small Child 3-6岁 22kg 115cm 增高座椅

Euro NCAP CPD Protocol v1.3核心要求

测试场景清单

场景编号 场景描述 检测时限 假人类型 遮挡条件
CPD-01 后向座椅新生儿 ≤90秒 Newborn 无遮挡
CPD-02 前向座椅婴儿 ≤90秒 Infant 无遮挡
CPD-03 覆盖毯子的儿童 ≤90秒 Toddler 毛毯覆盖
CPD-04 脚部空间儿童 ≤90秒 Small Child 座椅遮挡
CPD-05 多儿童场景 各≤90秒 混合 部分遮挡
CPD-06 儿童在安全座椅 ≤90秒 Infant 安全座椅遮挡

通过标准

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
"""
Euro NCAP CPD测试标准

通过条件:
1. 检测时间 ≤ 90秒
2. 报警触发(声光/手机推送)
3. 无误报(空车厢场景)
"""

from dataclasses import dataclass
from typing import List
from enum import Enum


class AlertLevel(Enum):
"""报警等级"""
LEVEL_1 = "visual_audio" # 车内声光报警
LEVEL_2 = "external_alert" # 外部报警+手机推送


@dataclass
class CPDTestResult:
"""CPD测试结果"""
scenario_id: str
detection_time_sec: float
alert_triggered: bool
alert_level: AlertLevel
false_positive: bool

def passed(self) -> bool:
"""是否通过"""
return (
self.detection_time_sec <= 90.0 and
self.alert_triggered and
not self.false_positive
)


class CPDProtocolValidator:
"""
Euro NCAP CPD Protocol v1.3 验证器
"""

def __init__(self):
self.max_detection_time = 90.0 # 秒
self.min_confidence = 0.95
self.max_false_positive_rate = 0.001 # 0.1%

def validate_scenario(
self,
scenario_id: str,
detection_time: float,
confidence: float,
is_empty_vehicle: bool
) -> CPDTestResult:
"""
验证单个测试场景

Args:
scenario_id: 场景ID (CPD-01 ~ CPD-06)
detection_time: 检测时间(秒)
confidence: 检测置信度
is_empty_vehicle: 是否为空车厢测试

Returns:
测试结果
"""
if is_empty_vehicle:
# 空车厢场景,应该不报警
return CPDTestResult(
scenario_id=scenario_id,
detection_time_sec=0.0,
alert_triggered=False,
alert_level=AlertLevel.LEVEL_1,
false_positive=confidence > 0.5 # 误判为有儿童
)

# 有儿童场景
alert_triggered = confidence > self.min_confidence
alert_level = AlertLevel.LEVEL_2 if detection_time > 60 else AlertLevel.LEVEL_1

return CPDTestResult(
scenario_id=scenario_id,
detection_time_sec=detection_time,
alert_triggered=alert_triggered,
alert_level=alert_level,
false_positive=False
)

def calculate_rating(
self,
results: List[CPDTestResult]
) -> dict:
"""
计算Euro NCAP评分

Returns:
{
'points': 得分(满分25),
'max_points': 25,
'percentage': 百分比,
'star_rating': 星级预测
}
"""
passed_count = sum(1 for r in results if r.passed())
total_count = len(results)

# Euro NCAP CPD满分25分
points = (passed_count / total_count) * 25 if total_count > 0 else 0

return {
'points': points,
'max_points': 25,
'percentage': (passed_count / total_count) * 100 if total_count > 0 else 0,
'star_rating': '★★★★★' if points >= 22.5 else '★★★★' if points >= 18.75 else '★★★'
}


# 测试示例
if __name__ == "__main__":
validator = CPDProtocolValidator()

# 模拟测试结果
test_results = [
validator.validate_scenario("CPD-01", 45.2, 0.97, False),
validator.validate_scenario("CPD-02", 52.1, 0.95, False),
validator.validate_scenario("CPD-03", 68.5, 0.93, False), # 覆盖毯子
validator.validate_scenario("CPD-04", 75.3, 0.91, False),
validator.validate_scenario("CPD-05", 55.0, 0.96, False),
validator.validate_scenario("CPD-06", 60.0, 0.94, False),
# 空车厢测试
validator.validate_scenario("CPD-EMPTY", 0.0, 0.15, True),
]

# 计算评分
rating = validator.calculate_rating(test_results)

print("=" * 60)
print("Euro NCAP CPD Protocol v1.3 测试报告")
print("=" * 60)

for result in test_results:
status = "✓ PASS" if result.passed() else "✗ FAIL"
print(f"{result.scenario_id}: {result.detection_time_sec:.1f}s, {status}")

print("\n评分结果:")
print(f" 得分: {rating['points']:.1f}/{rating['max_points']}")
print(f" 通过率: {rating['percentage']:.1f}%")
print(f" 星级预测: {rating['star_rating']}")

CPD假人技术规格

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
"""
CPD假人热特性

模拟儿童体温特征:
- 皮肤温度: 33-36°C
- 呼吸温度: 32-35°C
- 呼吸频率: 20-40次/分钟(儿童)
"""

import numpy as np


class CPDDummyThermal:
"""
CPD假人热特性模拟

用于测试:
1. 热成像CPD检测
2. 温度变化模拟
"""

def __init__(self, age_months: int):
self.age_months = age_months

# 根据年龄设定参数
if age_months <= 1:
self.skin_temp = 36.5
self.breathing_rate = 40 # 次/分钟
self.metabolic_rate = 50 # W/m²
elif age_months <= 12:
self.skin_temp = 36.0
self.breathing_rate = 30
self.metabolic_rate = 55
else:
self.skin_temp = 35.5
self.breathing_rate = 25
self.metabolic_rate = 60

def get_skin_temperature(self, ambient_temp: float, time_min: float) -> float:
"""
计算皮肤温度随时间变化

模拟被困在热车中的体温升高

Args:
ambient_temp: 环境温度(°C)
time_min: 受困时间(分钟)

Returns:
当前皮肤温度(°C)
"""
# 热车效应:环境温度每分钟上升约0.5°C
current_ambient = ambient_temp + 0.5 * time_min

# 体温跟随环境温度上升
if current_ambient > self.skin_temp:
delta = (current_ambient - self.skin_temp) * 0.1 * time_min
skin_temp = self.skin_temp + delta
else:
skin_temp = self.skin_temp

return min(skin_temp, 42.0) # 最高42°C

def get_breathing_pattern(self, time_sec: float) -> float:
"""
获取呼吸模式(胸廓运动)

Args:
time_sec: 时间(秒)

Returns:
胸廓位移(mm)
"""
freq = self.breathing_rate / 60 # Hz
amplitude = 5 # mm (儿童)

return amplitude * np.sin(2 * np.pi * freq * time_sec)


# 测试热特性
if __name__ == "__main__":
# 新生儿假人
newborn = CPDDummyThermal(age_months=0)

print("新生儿CPD假人热特性:")
print(f" 皮肤温度: {newborn.skin_temp}°C")
print(f" 呼吸频率: {newborn.breathing_rate}次/分钟")

# 模拟热车场景
print("\n热车场景模拟 (环境温度35°C):")
for t in [0, 10, 30, 60]:
skin_temp = newborn.get_skin_temperature(35.0, t)
print(f" {t}分钟后: 皮肤温度 {skin_temp:.1f}°C")

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
"""
CPD假人雷达反射特性

参数:
- RCS (雷达散射截面)
- 运动特性(呼吸微动)
"""

@dataclass
class RadarSignature:
"""雷达特征签名"""
rcs_dbm2: float # 雷达散射截面(dBm²)
velocity_ms: float # 速度(m/s)
range_m: float # 距离(m)
angle_deg: float # 角度(度)


class CPDDummyRadar:
"""CPD假人雷达特征"""

def __init__(self, weight_kg: float, height_cm: float):
self.weight = weight_kg
self.height = height_cm

# 估算RCS
# 人体RCS ≈ -10 to -5 dBm²
# 儿童RCS更小
self.rcs = self._estimate_rcs()

def _estimate_rcs(self) -> float:
"""
估算RCS

简化模型:RCS ∝ 身体表面积
"""
# 人体表面积公式 (Du Bois)
surface_area = 0.007184 * (self.height ** 0.725) * (self.weight ** 0.425)

# RCS与表面积成正比
# 成人:约-8 dBm²
# 儿童:约-15 to -10 dBm²
rcs_dbm2 = -15 + (surface_area / 0.5) * 5

return rcs_dbm2

def get_micro_doppler_signature(self, time_sec: float) -> RadarSignature:
"""
获取微多普勒特征

呼吸产生的微动:
- 位移: 2-5mm
- 速度: 0.01-0.05 m/s
"""
import math

breathing_freq = 0.4 # Hz (儿童)
displacement_amplitude = 0.004 # m

velocity = displacement_amplitude * 2 * math.pi * breathing_freq * math.cos(
2 * math.pi * breathing_freq * time_sec
)

return RadarSignature(
rcs_dbm2=self.rcs,
velocity_ms=velocity,
range_m=0.0, # 需要实际测量
angle_deg=0.0
)

IMS开发启示

1. 测试设备采购建议

设备 厂商 用途 预算
CPD假人套装 4activeSystems Euro NCAP认证测试 $50,000+
热成像仪 FLIR 热特性验证 $5,000
60GHz雷达评估板 TI CPD雷达开发 $500
数据采集系统 NI 测试自动化 $10,000

2. 测试流程标准化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## CPD功能验证流程

### 1. 实验室测试
- [ ] 假人放置(6种场景)
- [ ] 光照条件(明/暗)
- [ ] 遮挡条件(毯子/座椅)
- [ ] 检测时间测量

### 2. 实车测试
- [ ] 不同车型适配
- [ ] 温度环境(-20~50°C)
- [ ] 振动环境
- [ ] 长期稳定性

### 3. 认证测试
- [ ] Euro NCAP规定场景
- [ ] 第三方见证
- [ ] 测试报告生成

3. 开发检查清单

检查项 要求 状态
CPD检测时间 ≤90秒
毯子遮挡检测 支持
多儿童区分 支持
空车厢误报 <0.1%
报警机制 声光+手机

参考资料

  1. 4activeSystems: CPD Dummies Euro NCAP Certified
  2. Euro NCAP: CPD Protocol v1.3
  3. TI: IWR6843AOP Radar for CPD

https://dapalm.com/2026/06/07/2026-06-07-CPD-Dummy-Euro-NCAP-Certification/
作者
Mars
发布于
2026年6月7日
许可协议