diff --git a/gesture_control/arm_control.py b/gesture_control/arm_control.py index f7bcd75..c5e6b6a 100644 --- a/gesture_control/arm_control.py +++ b/gesture_control/arm_control.py @@ -92,7 +92,7 @@ class ArmController: disp = shoulder[1] - wrist[1] return disp / torso_height - + ''' def compute_speeds(self, landmarks): if (landmarks[11][3] < 0.5 or landmarks[12][3] < 0.5 or landmarks[15][3] < 0.5 or landmarks[16][3] < 0.5): @@ -116,11 +116,81 @@ class ArmController: linear = min(lin_rel, 1.0) * self.config['max_speed_linear'] # Угловая скорость - if abs(ang_rel) < self.dead_zone: + if abs(ang_rel) < self.dead_zone:norm_lin * self.config['max_speed_linear'] angular = 0.0 else: ang_rel_clipped = np.clip(ang_rel, -1.0, 1.0) angular = ang_rel_clipped * self.config['max_speed_angular'] return linear, angular + ''' + + def _get_angle(self, landmark1, landmark2): + x1 = landmark1[0] + y1 = landmark1[1] + x2 = landmark2[0] + y2 = landmark2[1] + angle = np.arctan2(y2 - y1, x2 - x1) + return angle + + def compute_speeds(self, landmarks): + if (landmarks[11][3] < 0.5 or landmarks[12][3] < 0.5 or + landmarks[15][3] < 0.5 or landmarks[16][3] < 0.5): + if self.debug: + print("Руки не видны") + return 0.0, 0.0 + + #right_shoulder_y = landmarks[12][1] + #right_hand_y = landmarks[16][1] + #right_distance = right_shoulder_y - right_hand_y + + angle_elbow_wirst_right = self._get_angle(landmarks[14], landmarks[16]) + angle_elbow_wirst_left = self._get_angle(landmarks[13], landmarks[15]) + + linear, angular = 0, 0 + + if np.deg2rad(-5) < angle_elbow_wirst_left < np.deg2rad(5): + linear = 0 + + elif np.deg2rad(-5) > angle_elbow_wirst_left: + linear = min(1, angle_elbow_wirst_left / -np.deg2rad(90)) + elif np.deg2rad(5) < angle_elbow_wirst_left: + linear = min(1, angle_elbow_wirst_left / -np.deg2rad(90)) + + #print(f"Test: {linear} {angle_elbow_wirst_left}") + + error = 35 + + if np.deg2rad(180 - error)> angle_elbow_wirst_right > np.deg2rad(180 + error): + angular = 0 + + elif np.deg2rad(180 - error) > angle_elbow_wirst_right: + angular = min(1, angle_elbow_wirst_right / -np.deg2rad(90)) + + elif np.deg2rad(180 + error) < angle_elbow_wirst_right: + angular = min(1, angle_elbow_wirst_right / -np.deg2rad(90)) + + if -np.deg2rad(error) < angle_elbow_wirst_right < np.deg2rad(error): + linear = 0 + angular = 0 + + angular = angular / 2 + + + #left_shoulder_y = landmarks[11][1] + #left_hand_y = landmarks[15][1] + #left_distance = left_shoulder_y - left_hand_y + + #torso_height = self._get_torso_height(landmarks) + #max_distance = torso_height * 0.5 + #norm_lin = np.clip((right_distance/max_distance), a_min = 0, a_max = 1) + + #torso_height = self._get_torso_height(landmarks) + #max_distance = torso_height * 0.5 + #norm_ang = np.clip((left_distance/max_distance), a_min = -1, a_max = 1) + + #linear = norm_lin * self.config['max_speed_linear'] + #angular = norm_ang * self.config['max_speed_linear'] + + return linear, angular