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
| import numpy as np from sklearn.ensemble import RandomForestClassifier
class HandsOffDetector: """ 方向盘离手检测器 使用TPPS压力阵列数据判断驾驶员是否手握方向盘 论文报告100%准确率 """ def __init__(self, grid_size: int = 16): self.grid_size = grid_size self.n_sectors = 8 self.classifier = RandomForestClassifier( n_estimators=50, max_depth=10, random_state=42 ) def extract_features(self, pressure_map: np.ndarray) -> np.ndarray: """ 从压力分布矩阵提取特征 Args: pressure_map: [16, 16] 压力分布 Returns: features: [32] 特征向量 """ features = [] features.append(pressure_map.mean()) features.append(pressure_map.std()) features.append(pressure_map.max()) features.append(pressure_map.sum()) features.append((pressure_map > 10).sum()) sector_size = self.grid_size // self.n_sectors * self.grid_size for s in range(self.n_sectors): sector = pressure_map[s*2:(s+1)*2, :] features.extend([ sector.mean(), sector.max(), (sector > 10).sum() ]) left = pressure_map[:, :8] right = pressure_map[:, 8:] features.append(left.mean() - right.mean()) features.append((left > 10).sum() - (right > 10).sum()) return np.array(features) def detect(self, pressure_map: np.ndarray) -> dict: """ 离手检测 Returns: result: { 'hands_on': bool, 'grip_quality': float, # 0-1 'grip_positions': list, # 检测到的握持位置 'confidence': float } """ features = self.extract_features(pressure_map) total_pressure = pressure_map.sum() active_cells = (pressure_map > 10).sum() hands_on = active_cells > 5 and total_pressure > 100 positions = [] if hands_on: for i in range(self.n_sectors): sector = pressure_map[i*2:(i+1)*2, :] if sector.max() > 50: positions.append(f"sector_{i}") grip_quality = min(1.0, active_cells / 20.0) return { 'hands_on': hands_on, 'grip_quality': grip_quality, 'grip_positions': positions, 'confidence': 0.95 if hands_on else 0.98 }
if __name__ == "__main__": detector = HandsOffDetector(grid_size=16) grip_map = np.zeros((16, 16)) grip_map[2:6, 2:6] = np.random.uniform(50, 150, (4, 4)) grip_map[2:6, 10:14] = np.random.uniform(50, 150, (4, 4)) off_map = np.zeros((16, 16)) off_map[7:9, 7:9] = 5 result_on = detector.detect(grip_map) result_off = detector.detect(off_map) print(f"手握方向: hands_on={result_on['hands_on']}, " f"quality={result_on['grip_quality']:.2f}") print(f"离手: hands_on={result_off['hands_on']}, " f"quality={result_off['grip_quality']:.2f}")
|