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
| import numpy as np
class OOPBrakingDetector: """ 制动脉冲下 OOP 检测增强 在传统姿态检测基础上: 1. 检测 reclined 状态 2. 监测制动事件 3. 预测制动后位移 4. 判定 OOP 风险 """ def __init__(self): self.recline_threshold = 25 self.braking_threshold = 0.5 self.head_forward_threshold = 30 self.chest_forward_threshold = 20 self.safe_head_zone = [-15, 15] self.safe_chest_zone = [-10, 10] def assess_risk(self, posture: dict, vehicle: dict) -> dict: """ 评估 OOP 风险 Args: posture: 乘员姿态数据 - back_angle: 背靠角度 - head_pitch: 头部俯仰 - chest_pitch: 胸部俯仰 - head_to_wheel: 头到方向盘距离 vehicle: 车辆数据 - deceleration: 减速度 (g) - speed: 速度 """ risk_level = 0 risks = [] is_reclined = posture['back_angle'] > self.recline_threshold if is_reclined: risk_level += 0.2 risks.append('reclined_posture') is_braking = vehicle['deceleration'] > self.braking_threshold if is_braking: risk_level += 0.3 risks.append('active_braking') head_forward = abs(posture['head_pitch']) > self.head_forward_threshold if head_forward: risk_level += 0.25 risks.append('head_forward_excessive') predicted_displacement = self._predict_displacement( vehicle['deceleration'], posture['back_angle'] ) if predicted_displacement > 0.15: risk_level += 0.25 risks.append(f'predicted_displacement_{predicted_displacement:.2f}m') if posture['head_to_wheel'] < 0.25: risk_level += 0.2 risks.append('close_to_steering_wheel') return { 'risk_level': min(risk_level, 1.0), 'is_oop': risk_level > 0.5, 'is_reclined': is_reclined, 'is_braking': is_braking, 'predicted_displacement': predicted_displacement, 'risks': risks, 'recommendation': self._recommend(risk_level), } def _predict_displacement(self, decel_g, back_angle): """预测制动后位移""" base = decel_g * 0.08 recline_factor = 1 + (back_angle - 25) / 100 return base * max(recline_factor, 1.0) def _recommend(self, risk): if risk > 0.7: return 'CRITICAL: 预紧安全带 + 气囊调整' elif risk > 0.5: return 'WARNING: 座椅回正 + 安全带预紧' elif risk > 0.3: return 'CAUTION: 提醒乘员调整坐姿' return 'NORMAL'
if __name__ == "__main__": detector = OOPBrakingDetector() normal = detector.assess_risk( posture={'back_angle': 20, 'head_pitch': 5, 'chest_pitch': 3, 'head_to_wheel': 0.35}, vehicle={'deceleration': 0.1, 'speed': 60} ) print("=== 正常驾驶 ===") print(f"风险: {normal['risk_level']:.0%}, OOP: {normal['is_oop']}") print(f"建议: {normal['recommendation']}\n") risky = detector.assess_risk( posture={'back_angle': 35, 'head_pitch': 28, 'chest_pitch': 15, 'head_to_wheel': 0.50}, vehicle={'deceleration': 0.8, 'speed': 80} ) print("=== Reclined + 制动 ===") print(f"风险: {risky['risk_level']:.0%}, OOP: {risky['is_oop']}") print(f"风险项: {risky['risks']}") print(f"预测位移: {risky['predicted_displacement']:.2f}m") print(f"建议: {risky['recommendation']}")
|