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
| from dataclasses import dataclass from typing import List, Optional import numpy as np
@dataclass class NASA SensorSpec: """NASA 乘员监测传感器规格""" name: str modality: str placement: str non_obtrusive: bool power_mw: float sampling_rate: int
NASA_SENSOR_SUITE = [ NASASensorSpec("ECG/HRV", "生理", "胸带/背心", True, 5, 250), NASASensorSpec("眼动追踪", "行为", "头戴/固定", True, 100, 60), NASASensorSpec("皮电响应", "生理", "腕带", True, 2, 32), NASASensorSpec("血氧SpO2", "生理", "耳夹/腕带", True, 10, 1), NASASensorSpec("体温", "生理", "贴片", True, 1, 1), NASASensorSpec("EEG(简化)", "生理", "头带", True, 50, 250), ]
class CrewStateClassifier: """ NASA 乘员状态分类器 基于心理生理监测的群体分类器 + 个性化适配 流程: 1. 群体基线建立(任务前) 2. 实时状态分类(任务中) 3. 个性化模型更新(长期) 4. 对策建议(闭环干预) """ def __init__(self, sensor_specs: List[NASA SensorSpec] = None): self.sensors = sensor_specs or NASA_SENSOR_SUITE self.baseline = None self.personalized = False self.alert_history = [] def establish_baseline( self, rest_data: dict, duration_min: int = 10 ) -> dict: """ 建立群体基线 Args: rest_data: 静息状态传感器数据 duration_min: 基线采集时长 Returns: baseline: 基线指标 """ self.baseline = { 'hrv_rmssd': np.mean(rest_data.get('hrv', [40])), 'blink_rate': np.mean(rest_data.get('blink_rate', [18])), 'gaze_entropy': np.mean(rest_data.get('gaze_entropy', [2.5])), 'eda_baseline': np.mean(rest_data.get('eda', [3.0])), 'spo2': np.mean(rest_data.get('spo2', [97])), 'temp': np.mean(rest_data.get('temp', [36.8])), } return self.baseline def classify_state(self, current_data: dict) -> dict: """ 实时乘员状态分类 Args: current_data: 当前传感器数据 Returns: classification: 状态分类结果 """ if self.baseline is None: return {'error': '基线未建立'} deviations = {} for key in self.baseline: if key in current_data: base = self.baseline[key] curr = np.mean(current_data[key]) deviations[key] = (curr - base) / (base + 1e-8) states = [] hrv_dev = deviations.get('hrv_rmssd', 0) blink_dev = deviations.get('blink_rate', 0) if hrv_dev < -0.2 and blink_dev > 0.3: states.append({ 'state': 'fatigue', 'confidence': min(abs(hrv_dev) + abs(blink_dev), 1.0), 'severity': 'moderate' if abs(hrv_dev) > 0.3 else 'mild' }) eda_dev = deviations.get('eda_baseline', 0) if eda_dev > 0.3: states.append({ 'state': 'stress', 'confidence': min(abs(eda_dev), 1.0), 'severity': 'high' if eda_dev > 0.5 else 'moderate' }) gaze_dev = deviations.get('gaze_entropy', 0) if gaze_dev < -0.15: states.append({ 'state': 'channelized_attention', 'confidence': min(abs(gaze_dev), 1.0), 'severity': 'moderate' }) elif gaze_dev > 0.3: states.append({ 'state': 'diverted_attention', 'confidence': min(abs(gaze_dev), 1.0), 'severity': 'moderate' }) total_risk = sum(s['confidence'] for s in states) return { 'states': states, 'total_risk': min(total_risk, 1.0), 'recommendation': self._get_countermeasure(states, total_risk), 'deviations': deviations } def _get_countermeasure(self, states: list, risk: float) -> str: """获取对策建议""" if risk < 0.2: return 'nominal' elif risk < 0.5: return 'increase_automation' elif risk < 0.8: return 'task_redistribution' else: return 'emergency_protocol'
if __name__ == "__main__": classifier = CrewStateClassifier() print("=== NASA 乘员监测传感器套件 ===") for s in classifier.sensors: print(f"{s.name:15s} | {s.modality:4s} | {s.placement:12s} | " f"{'非侵入' if s.non_obtrusive else '侵入':4s} | " f"{s.power_mw:5.1f}mW | {s.sampling_rate:4d}Hz") rest_data = { 'hrv': [42, 40, 38, 41, 43], 'blink_rate': [17, 19, 18, 16, 18], 'gaze_entropy': [2.6, 2.4, 2.5, 2.7, 2.5], 'eda': [2.8, 3.0, 3.1, 2.9, 3.0], 'spo2': [97, 98, 97, 98, 98], 'temp': [36.7, 36.8, 36.9, 36.8, 36.8], } baseline = classifier.establish_baseline(rest_data) print(f"\n基线: {baseline}") fatigued_data = { 'hrv': [30, 28, 32, 29], 'blink_rate': [25, 28, 24, 26], 'gaze_entropy': [2.0, 1.8, 2.1, 1.9], 'eda': [3.5, 3.8, 3.6, 3.7], } result = classifier.classify_state(fatigued_data) print(f"\n=== 疲劳状态分析 ===") for s in result.get('states', []): print(f"状态: {s['state']}, 置信度: {s['confidence']:.2f}, 严重度: {s['severity']}") print(f"总风险: {result['total_risk']:.2f}") print(f"对策: {result['recommendation']}")
|