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
| import numpy as np
class PressureDistributionSensor: """ 压力分布传感器 Applied Sciences 2025 论文配置: - 矩阵式压力传感器(16x16 或 32x32) - 座椅垫 + 靠背双矩阵 - 分辨率:每个压力点独立测量 """ def __init__(self, matrix_size: tuple = (32, 32), seat_type: str = "soft"): self.matrix_size = matrix_size self.seat_type = seat_type self.hard_sigma = 0.5 self.soft_sigma = 2.0 def simulate_pressure(self, body_pose: np.ndarray, seat_type: str = None) -> np.ndarray: """ 模拟压力分布 Args: body_pose: 身体关键点, shape=(17, 3) seat_type: "hard" or "soft" Returns: pressure_map: 压力分布矩阵, shape=(H, W) """ if seat_type is None: seat_type = self.seat_type H, W = self.matrix_size pressure_map = np.zeros((H, W)) hip_center = body_pose[0] back_center = body_pose[6] hip_pressure = self._generate_pressure_blob( hip_center, H//2, W, seat_type ) back_pressure = self._generate_pressure_blob( back_center, H//2, W, seat_type ) pressure_map[:H//2, :] = hip_pressure pressure_map[H//2:, :] = back_pressure return pressure_map def _generate_pressure_blob(self, center: np.ndarray, height: int, width: int, seat_type: str) -> np.ndarray: """生成压力blob""" x, y, z = center grid_x = np.linspace(0, width-1, width) grid_y = np.linspace(0, height-1, height) X, Y = np.meshgrid(grid_x, grid_y) center_x = int(np.clip(x * width, 0, width-1)) center_y = int(np.clip(y * height, 0, height-1)) sigma = self.hard_sigma if seat_type == "hard" else self.soft_sigma blob = np.exp(-((X - center_x)**2 + (Y - center_y)**2) / (2 * sigma**2)) pressure_value = max(0, 100 - z * 50) blob = blob * pressure_value return blob def extract_features(self, pressure_map: np.ndarray) -> np.ndarray: """ 提取压力特征 Args: pressure_map: 压力分布矩阵 Returns: features: 特征向量 """ H, W = pressure_map.shape features = [] total_pressure = np.sum(pressure_map) features.append(total_pressure) mean_pressure = np.mean(pressure_map) features.append(mean_pressure) max_pressure = np.max(pressure_map) features.append(max_pressure) pressure_normalized = pressure_map / total_pressure entropy = -np.sum(pressure_normalized * np.log2(pressure_normalized + 1e-6)) features.append(entropy) left_pressure = np.sum(pressure_map[:, :W//2]) right_pressure = np.sum(pressure_map[:, W//2:]) left_right_ratio = left_pressure / (right_pressure + 1e-6) features.append(left_right_ratio) front_pressure = np.sum(pressure_map[:H//2, :]) back_pressure = np.sum(pressure_map[H//2:, :]) front_back_ratio = front_pressure / (back_pressure + 1e-6) features.append(front_back_ratio) peak_y, peak_x = np.unravel_index(np.argmax(pressure_map), pressure_map.shape) features.append(peak_x / W) features.append(peak_y / H) return np.array(features)
if __name__ == "__main__": sensor = PressureDistributionSensor(matrix_size=(32, 32), seat_type="soft") normal_pose = np.array([ [0.5, 0.8, 0.2], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.5, 0.3, 0.1], ]) pressure_hard = sensor.simulate_pressure(normal_pose, "hard") pressure_soft = sensor.simulate_pressure(normal_pose, "soft") print(f"硬座椅压力分布形状: {pressure_hard.shape}") print(f"软座椅压力分布形状: {pressure_soft.shape}") features_hard = sensor.extract_features(pressure_hard) features_soft = sensor.extract_features(pressure_soft) print(f"\n硬座椅特征: {features_hard}") print(f"软座椅特征: {features_soft}")
|