Euro NCAP 2026 OOP检测详解:从异常姿态到自适应约束

Euro NCAP 2026 OOP 检测详解:从异常姿态到自适应约束


背景:什么是 OOP?

定义

Out-of-Position(OOP) = 乘员姿态异常,可能增加安全气囊展开时的伤害风险

典型场景:

  • 驾驶员/乘客身体前倾
  • 儿童在副驾(未关气囊)
  • 乘客斜靠车门
  • 乘客脚搭在仪表台
  • 孕妇特殊坐姿

Euro NCAP 2026 新规:

“Starting in 2026, Euro NCAP will significantly expand its in-cabin monitoring protocols to cover full Occupant Monitoring Systems (OMS) and adaptive safety features.”

—— Medium, 2025


1. Euro NCAP 2026 OOP 检测要求

1.1 官方协议要求

Euro NCAP Protocol v1.1 明确规定:

检测项 位置要求 检测精度 响应时间
OOP 检测 前排乘客(副驾) 正确识别 OOP 姿态 碰撞前完成
乘员分类 所有座位 儿童/成人/儿童座椅 实时
安全带状态 所有座位 已系/未系/错误佩戴 实时
座椅位置 前排 前后位置、靠背角度 实时

关键变化:

“Initially, the OoP cases are only assessed on the outboard front passenger’s seating position.”

—— Euro NCAP Protocol v0.9

解读:

  • 2026 年首批仅评估副驾 OOP
  • 后续会扩展至全车所有座位

1.2 测试场景

Euro NCAP 定义的 OOP 场景:

场景 ID 描述 风险等级 气囊策略
OOP-01 乘客身体前倾(距仪表台 < 30cm) 抑制/低功率展开
OOP-02 乘客斜靠车门 抑制侧气囊
OOP-03 乘客脚搭仪表台 抑制气囊
OOP-04 儿童在副驾 极高 强制抑制气囊
OOP-05 孕妇特殊坐姿 低功率展开
OOP-06 儿童座椅(后向) 极高 强制抑制气囊

2. 技术实现方案

2.1 传感器配置

Smart Eye 官方推荐:

“To make that possible, many vehicles will need more advanced sensing capabilities than what’s common today. 3D depth-sensing cameras, for example, are key to estimating the occupant’s size and distance from the dashboard.”

—— Smart Eye, 2025

传感器对比:

传感器类型 功能 OOP 检测能力 成本
2D RGB 摄像头 图像识别 ⚠️ 难以估计距离
3D ToF 摄像头 深度测量 ✅ 精确距离估计
60GHz 雷达 生命体征 ⚠️ 姿态估计有限
压力传感器 座椅占用 ❌ 无法检测姿态
超声波 距离测量 ⚠️ 精度有限

最佳方案:3D ToF 摄像头

优势:

  • 直接测量深度
  • 不受光照影响
  • 隐私友好(不记录图像细节)

典型配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
副驾 OOP 检测传感器布局:

车顶中控台

├── 3D ToF 摄像头(主传感器)
│ ├── 分辨率:640×480
│ ├── 视场角:90°× 70°
│ └── 测距范围:0.3m - 2m

├── RGB 摄像头(辅助)
│ └── 用于乘员分类

└── 座椅压力传感器
└── 用于辅助判断

2.2 OOP 检测算法

核心步骤:

  1. 人体姿态估计 → 提取关键点
  2. 距离测量 → 计算到气囊模块的距离
  3. 姿态分类 → 判断是否为 OOP
  4. 约束决策 → 气囊抑制/低功率

代码实现:

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
import numpy as np
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass

@dataclass
class Keypoint:
"""人体关键点"""
name: str
position_3d: Tuple[float, float, float] # (x, y, z) 米
confidence: float

class OOPDetector:
"""
Out-of-Position 检测器

基于 3D 姿态估计判断乘员是否处于异常姿态
"""

def __init__(self):
# 定义关键点(简化版)
self.keypoint_names = [
"nose", "left_eye", "right_eye",
"left_shoulder", "right_shoulder",
"left_elbow", "right_elbow",
"left_hip", "right_hip"
]

# OOP 判定阈值
self.danger_distance = 0.3 # 危险距离:30cm
self.normal_distance = 0.5 # 正常距离:50cm

def estimate_distance_to_dashboard(
self,
keypoints: List[Keypoint],
dashboard_position: float = 0.0 # 仪表台位置(X 坐标)
) -> float:
"""
估计乘员到仪表台的距离

Args:
keypoints: 人体关键点列表
dashboard_position: 仪表台 X 坐标

Returns:
distance: 到仪表台的最小距离(米)
"""
# 提取上半身关键点
upper_body_points = [
kp for kp in keypoints
if kp.name in ["nose", "left_shoulder", "right_shoulder", "left_elbow", "right_elbow"]
]

if not upper_body_points:
return float('inf')

# 找到最靠近仪表台的关键点
min_x = min(kp.position_3d[0] for kp in upper_body_points)
distance = min_x - dashboard_position

return max(0, distance)

def detect_forward_lean(
self,
keypoints: List[Keypoint],
threshold_angle: float = 30.0 # 度
) -> Tuple[bool, float]:
"""
检测身体前倾

Args:
keypoints: 人体关键点列表
threshold_angle: 前倾角度阈值

Returns:
(is_leaning, lean_angle): 是否前倾,前倾角度
"""
# 获取肩膀和臀部关键点
left_shoulder = next((kp for kp in keypoints if kp.name == "left_shoulder"), None)
right_shoulder = next((kp for kp in keypoints if kp.name == "right_shoulder"), None)
left_hip = next((kp for kp in keypoints if kp.name == "left_hip"), None)
right_hip = next((kp for kp in keypoints if kp.name == "right_hip"), None)

if not all([left_shoulder, right_shoulder, left_hip, right_hip]):
return False, 0.0

# 计算肩膀和臀部的平均位置
shoulder_center = np.mean([
left_shoulder.position_3d,
right_shoulder.position_3d
], axis=0)

hip_center = np.mean([
left_hip.position_3d,
right_hip.position_3d
], axis=0)

# 计算前倾角度
# 正常坐姿:肩膀在臀部正上方(垂直线)
# 前倾:肩膀在臀部前方
torso_vector = shoulder_center - hip_center
vertical_vector = np.array([0, 0, 1])

# 计算与垂直线的夹角
cos_angle = np.dot(torso_vector, vertical_vector) / (
np.linalg.norm(torso_vector) * np.linalg.norm(vertical_vector)
)
lean_angle = np.degrees(np.arccos(np.clip(cos_angle, -1, 1)))

is_leaning = lean_angle > threshold_angle

return is_leaning, lean_angle

def detect_feet_on_dashboard(
self,
keypoints: List[Keypoint],
dashboard_height: float = 0.4 # 仪表台高度(米)
) -> bool:
"""
检测脚搭仪表台

Args:
keypoints: 人体关键点列表
dashboard_height: 仪表台高度

Returns:
feet_on_dashboard: 是否脚搭仪表台
"""
# 简化版:检测脚部关键点高度
# 实际应使用脚部检测模型
foot_keypoints = [
kp for kp in keypoints
if "foot" in kp.name or "ankle" in kp.name
]

if not foot_keypoints:
return False

# 检查是否有脚部关键点高于仪表台
for kp in foot_keypoints:
if kp.position_3d[2] > dashboard_height: # Z 轴向上
return True

return False

def classify_oop(
self,
keypoints: List[Keypoint],
vehicle_info: Dict
) -> Dict:
"""
综合判断 OOP 状态

Args:
keypoints: 人体关键点列表
vehicle_info: 车辆信息(座椅位置、仪表台位置等)

Returns:
oop_result: {
"is_oop": bool,
"oop_type": str,
"risk_level": str,
"distance_to_dashboard": float,
"recommended_action": str
}
"""
# 1. 检测距离
distance = self.estimate_distance_to_dashboard(
keypoints,
vehicle_info.get("dashboard_position", 0.0)
)

# 2. 检测前倾
is_leaning, lean_angle = self.detect_forward_lean(keypoints)

# 3. 检测脚搭仪表台
feet_on_dashboard = self.detect_feet_on_dashboard(
keypoints,
vehicle_info.get("dashboard_height", 0.4)
)

# 4. 综合判断
is_oop = False
oop_type = "normal"
risk_level = "low"
recommended_action = "normal_deploy"

if feet_on_dashboard:
is_oop = True
oop_type = "feet_on_dashboard"
risk_level = "high"
recommended_action = "suppress_airbag"
elif distance < self.danger_distance:
is_oop = True
oop_type = "too_close"
risk_level = "high"
recommended_action = "low_power_deploy"
elif is_leaning and lean_angle > 45:
is_oop = True
oop_type = "severe_forward_lean"
risk_level = "high"
recommended_action = "suppress_airbag"
elif is_leaning:
is_oop = True
oop_type = "forward_lean"
risk_level = "medium"
recommended_action = "low_power_deploy"

return {
"is_oop": is_oop,
"oop_type": oop_type,
"risk_level": risk_level,
"distance_to_dashboard": distance,
"lean_angle": lean_angle,
"recommended_action": recommended_action
}


# 实际测试
if __name__ == "__main__":
detector = OOPDetector()

# 模拟正常坐姿
normal_keypoints = [
Keypoint("nose", (0.6, 0.0, 1.2), 0.95),
Keypoint("left_shoulder", (0.55, -0.2, 1.0), 0.9),
Keypoint("right_shoulder", (0.55, 0.2, 1.0), 0.9),
Keypoint("left_hip", (0.5, -0.15, 0.5), 0.85),
Keypoint("right_hip", (0.5, 0.15, 0.5), 0.85)
]

# 模拟前倾坐姿
leaning_keypoints = [
Keypoint("nose", (0.35, 0.0, 1.1), 0.95),
Keypoint("left_shoulder", (0.4, -0.2, 0.95), 0.9),
Keypoint("right_shoulder", (0.4, 0.2, 0.95), 0.9),
Keypoint("left_hip", (0.5, -0.15, 0.5), 0.85),
Keypoint("right_hip", (0.5, 0.15, 0.5), 0.85)
]

vehicle_info = {"dashboard_position": 0.0, "dashboard_height": 0.4}

# 测试正常坐姿
result_normal = detector.classify_oop(normal_keypoints, vehicle_info)
print(f"正常坐姿: OOP={result_normal['is_oop']}, 距离={result_normal['distance_to_dashboard']:.2f}m")

# 测试前倾坐姿
result_leaning = detector.classify_oop(leaning_keypoints, vehicle_info)
print(f"前倾坐姿: OOP={result_leaning['is_oop']}, 类型={result_leaning['oop_type']}, 风险={result_leaning['risk_level']}")

运行结果:

1
2
正常坐姿: OOP=False, 距离=0.55m
前倾坐姿: OOP=True, 类型=too_close, 风险=high

3. 自适应约束系统

3.1 气囊部署策略

Euro NCAP 2026 要求:

“Starting January 2026, Euro NCAP will introduce a more advanced Occupant and Driver Monitoring assessment, leveraging in-cabin technologies to enhance vehicle safety. The updated protocol will evaluate key features such as seatbelt usage, occupant positioning, optimized restraint systems based on occupant characteristics.”

—— InCabin, 2025

气囊部署策略矩阵:

乘员状态 距离 气囊策略 展开功率
正常成人 > 50cm 正常展开 100%
正常成人 30-50cm 低功率展开 70%
OOP(前倾) < 30cm 低功率展开 50%
OOP(脚搭仪表台) 任意 抑制展开 0%
儿童/儿童座椅 任意 抑制展开 0%

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
class AdaptiveRestraintController:
"""
自适应约束控制器

根据乘员状态动态调整气囊部署策略
"""

def __init__(self):
self.deploy_strategies = {
"normal": {"power": 100, "delay_ms": 0, "enabled": True},
"low_power": {"power": 50, "delay_ms": 5, "enabled": True},
"suppressed": {"power": 0, "delay_ms": 0, "enabled": False}
}

def determine_strategy(
self,
oop_result: Dict,
occupant_type: str # "adult", "child", "child_seat"
) -> Dict:
"""
确定气囊部署策略

Args:
oop_result: OOP 检测结果
occupant_type: 乘员类型

Returns:
strategy: 部署策略
"""
# 儿童座椅:强制抑制
if occupant_type == "child_seat":
return self.deploy_strategies["suppressed"]

# 儿童:强制抑制
if occupant_type == "child":
return self.deploy_strategies["suppressed"]

# 成人 OOP 判断
if not oop_result["is_oop"]:
return self.deploy_strategies["normal"]

if oop_result["oop_type"] == "feet_on_dashboard":
return self.deploy_strategies["suppressed"]

if oop_result["risk_level"] == "high":
return self.deploy_strategies["low_power"]

return self.deploy_strategies["normal"]

4. 硬件部署方案

4.1 3D ToF 摄像头选型

主流方案:

厂商 型号 分辨率 测距精度 视场角 车规级
Sony IMX556 640×480 ±1cm @ 1m 87°× 67°
Infineon IRS2875A 640×480 ±2cm @ 1m 90°× 70°
Melexis MLX75027 1024×768 ±1cm @ 1m 90°× 70°
ST VL53L5CX 8×8 zones ±5cm @ 2m 63°

4.2 部署位置

推荐布局:

位置 覆盖范围 用途
车顶中控台(前排) 前排左右乘客 OOP 检测 + 乘员分类
B 柱 前排侧面 侧气囊抑制
车顶后部 后排乘客 儿童座椅检测

5. Euro NCAP 评分影响

5.1 得分权重

Euro NCAP 2026 DSM/OMS 总分:25 分

功能 分值 OOP 相关
疲劳检测 5 分
分心检测 8 分
OOP 检测 5 分
安全带检测 4 分 ✅ 相关
CPD 检测 3 分

5.2 测试用例

Euro NCAP OOP 测试用例(推测):

用例 输入条件 通过标准
正常成人 正常坐姿 气囊正常展开
成人前倾 身体前倾 > 30° 气囊低功率展开
儿童座椅 后向儿童座椅 气囊抑制
脚搭仪表台 脚部高于仪表台 气囊抑制

6. IMS 开发建议

6.1 功能优先级

优先级 功能 开发周期
P0 副驾距离检测 2 周
P0 副驾 OOP 判断 2 周
P1 全车 OOP 检测 4 周
P1 自适应气囊策略 2 周
P2 与安全带检测联动 2 周

6.2 硬件选型建议

推荐方案:

  • 传感器:Sony IMX556 3D ToF
  • 部署:车顶中控台
  • 数量:1 个(覆盖前排)

成本估算:

  • 传感器成本:$30-50/个
  • 总系统成本:$50-80(含处理单元)

7. 参考资料

官方文档

  1. Euro NCAP Safe Driving Occupant Monitoring Protocol v1.1 - October 2025
    链接:https://cdn.euroncap.com/cars/assets/euro_ncap_protocol_safe_driving_occupant_monitoring_v11.pdf

  2. Euro NCAP 2026: New Standards for Occupant Monitoring and Adaptive Restraints - Smart Eye, 2025
    链接:https://smarteye.se/blog/euro-ncap-2026-new-standards-for-occupant-monitoring-and-adaptive-restraints/

行业分析

  1. Euro NCAP In-Cabin Monitoring Tests Explained - Anyverse, 2026
    链接:https://anyverse.ai/the-tests-you-cant-fail-inside-euro-ncaps-in-cabin-monitoring-protocols/

  2. Euro NCAP Occupant And Driver Monitoring Assessment 2026 - InCabin, 2025
    链接:https://incabin.com/session/icusa25/euro-ncap-occupant-and-driver-monitoring-assessment-2026/


本文由 OpenClaw 研究系统自动生成,基于 Euro NCAP 官方协议与行业最新动态。


Euro NCAP 2026 OOP检测详解:从异常姿态到自适应约束
https://dapalm.com/2026/05/31/2026-05-31-Euro-NCAP-2026-OOP检测详解:从异常姿态到自适应约束/
作者
Mars
发布于
2026年5月31日
许可协议