|
|
|
|
@ -55,7 +55,7 @@ class ArmController:
|
|
|
|
|
|
|
|
|
|
def _horizontal_displacement_rel(self, landmarks, side):
|
|
|
|
|
"""
|
|
|
|
|
Нормированное горизонтальное смещение запястья относительно плеча.
|
|
|
|
|
Нормированное горизонтальное смещение запястья относительно плеча.Ширина плеч для нормировки горизонтальных смещен
|
|
|
|
|
Сторона `side` — это реальная сторона руки
|
|
|
|
|
"""
|
|
|
|
|
s_idx, w_idx = self._get_side_indices(side)
|
|
|
|
|
@ -100,27 +100,44 @@ class ArmController:
|
|
|
|
|
print("Руки не видны")
|
|
|
|
|
return 0.0, 0.0
|
|
|
|
|
|
|
|
|
|
linear_side = self.config['linear_arm']
|
|
|
|
|
angular_side = self.config['angular_arm']
|
|
|
|
|
|
|
|
|
|
lin_rel = self._horizontal_displacement_rel(landmarks, linear_side)
|
|
|
|
|
ang_rel = self._vertical_displacement_rel(landmarks, angular_side)
|
|
|
|
|
|
|
|
|
|
if self.debug:
|
|
|
|
|
print(f"lin_rel={lin_rel:.3f}, ang_rel={ang_rel:.3f}")
|
|
|
|
|
r_sh_z = landmarks[12][2]
|
|
|
|
|
r_wr_z = landmarks[16][2]
|
|
|
|
|
r_sh_z_divided = (landmarks[12][2] + landmarks[11][2])/2
|
|
|
|
|
nose_z = landmarks[0][2]
|
|
|
|
|
nose_and_sh_distance = r_sh_z_divided - nose_z
|
|
|
|
|
|
|
|
|
|
# Линейная скорость (только вперёд)
|
|
|
|
|
if lin_rel < self.dead_zone:
|
|
|
|
|
linear = 0.0
|
|
|
|
|
else:
|
|
|
|
|
linear = min(lin_rel, 1.0) * self.config['max_speed_linear']
|
|
|
|
|
arm_forward = r_sh_z - r_wr_z
|
|
|
|
|
|
|
|
|
|
# Угловая скорость
|
|
|
|
|
if abs(ang_rel) < self.dead_zone:
|
|
|
|
|
angular = 0.0
|
|
|
|
|
else:
|
|
|
|
|
ang_rel_clipped = np.clip(ang_rel, -1.0, 1.0)
|
|
|
|
|
angular = ang_rel_clipped * self.config['max_speed_angular']
|
|
|
|
|
if arm_forward < 3*nose_and_sh_distance:
|
|
|
|
|
#print(f"landmarks[12][2] {landmarks[12][2] - landmarks[16][2]}")
|
|
|
|
|
|
|
|
|
|
linear_side = self.config['linear_arm']
|
|
|
|
|
angular_side = self.config['angular_arm']
|
|
|
|
|
|
|
|
|
|
#lin_rel = self._horizontal_displacement_rel(landmarks, linear_side)
|
|
|
|
|
lin_rel = self._vertical_displacement_rel(landmarks, linear_side)
|
|
|
|
|
ang_rel = self._vertical_displacement_rel(landmarks, angular_side)
|
|
|
|
|
|
|
|
|
|
if self.debug:
|
|
|
|
|
print(f"lin_rel={lin_rel:.3f}, ang_rel={ang_rel:.3f}")
|
|
|
|
|
|
|
|
|
|
return linear, angular
|
|
|
|
|
# Линейная скорость
|
|
|
|
|
if abs(lin_rel) < self.dead_zone:
|
|
|
|
|
linear = 0.0
|
|
|
|
|
else:
|
|
|
|
|
lin_rel_clipped = np.clip(lin_rel, -1.0, 1.0)
|
|
|
|
|
linear = lin_rel_clipped * self.config['max_speed_linear']
|
|
|
|
|
|
|
|
|
|
# Угловая скорость
|
|
|
|
|
if abs(ang_rel) < self.dead_zone:
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
return 0.0, 0.0
|
|
|
|
|
|