Explorar el Código

'ForwardKinematics.py' ändern

mkebab hace 1 año
padre
commit
d116fbd7fb
Se han modificado 1 ficheros con 152 adiciones y 10 borrados
  1. 152 10
      ForwardKinematics.py

+ 152 - 10
ForwardKinematics.py

@@ -1,28 +1,170 @@
 import numpy as np
 import matplotlib.pyplot as plt
 
-l = [10, 26, 33, 30]
-alpha = np.array([90, 120, -30, -110]) * (np.pi / 180)
+segments_length = [15, 50, 40, 30]
+alpha = np.array([90, 0, 0, 0]) * (np.pi / 180)
+
+
+def calculate_triangle_angles(a, b, c):
+    # Calculate the angles using the law of cosines
+    angle_a = np.rad2deg(np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)))
+    angle_b = np.rad2deg(np.arccos((c ** 2 + a ** 2 - b ** 2) / (2 * c * a)))
+    angle_c = 180 - angle_a - angle_b  # The sum of angles in a triangle is 180 degrees
+
+    return angle_a, angle_b, angle_c
+
+
+def calculate_angels_to_horizon(relative_angels_stepper):
+    absolute_angels = [0, 0, 0, 0]
+    absolute_angels[0] = relative_angels_stepper[0]
+    absolute_angels[1] = absolute_angels[0] + relative_angels_stepper[1]
+    absolute_angels[2] = absolute_angels[1] + relative_angels_stepper[2]
+    absolute_angels[3] = absolute_angels[2] + relative_angels_stepper[3]
+
+    for j in range(4):
+        if absolute_angels[j] > 360:
+            absolute_angels[j] = absolute_angels[j] - 360
+    print("relative:", relative_angels_stepper,
+          "absolute:", absolute_angels)
+    return absolute_angels
+
+
+def calculate_angels_relative(absolute_angels_stepper):
+    relative_angels = [0, 0, 0, 0]
+    relative_angels[0] = absolute_angels_stepper[0]
+    relative_angels[1] = absolute_angels_stepper[1] - relative_angels[0]
+    relative_angels[2] = absolute_angels_stepper[2] - relative_angels[1]
+    relative_angels[3] = absolute_angels_stepper[3] - relative_angels[2]
+
+    for j in range(4):
+        if relative_angels[j] > 360:
+            relative_angels[j] = relative_angels[j] - 360
+
+    return relative_angels
+
+
+def ik_calculate_angels(g3_position, g4_orientation):
+    z0 = segments_length[0]
+    # y0 = 0
+
+    alpha = [90, 0, 0, g4_orientation]  # relative stepper angels to reach desired coordination
+    beta = [0, 0, 90]  # angels of right triangle
+
+    y = g3_position[0]  # - y0
+    z = g3_position[1] - z0
+
+    l1 = segments_length[1]
+    l2 = segments_length[2]
+    l_h = np.sqrt(np.square(y) + np.square(z))  # calculating hypothesis
+
+    gamma = calculate_triangle_angles(l2, l1, l_h)
+
+    beta[0] = np.rad2deg(np.arctan2(z, y))
+    beta[1] = np.rad2deg(np.arctan2(y, z))
+
+    alpha[1] = -(90 - gamma[0] - beta[0])
+    alpha[2] = -(180 - gamma[2])
+
+    return alpha
+
+
+# Wrong!!!!!
+def fk_calculate_position(stepper_angels_rel):
+    alpha = np.array(stepper_angels_rel) * (np.pi / 180)
+    alpha_abs = calculate_angels_to_horizon(alpha)
+    z = [0, 0, 0, 0]
+    y = [0, 0, 0, 0]
+
+    start_x = 0
+    start_y = 0
+
+    z[0] = segments_length[0]
+    y[0] = 0
+
+    z[1] = z[0]
+    y[1] = y[0] + segments_length[1]
+
+    z[2] = y[1] + np.cos(alpha_abs[2]) * segments_length[2]
+    y[2] = z[1] + np.sin(alpha_abs[2]) * segments_length[2]
+
+    z[3] = z[2] + np.cos(alpha_abs[3]) * segments_length[3]
+    y[3] = y[2] + np.sin(alpha_abs[3]) * segments_length[3]
+
+    m4_pos_2d = [y, z]
+    m3_pos_2d = [y, z]
+
+    return m4_pos_2d
+
+
+default_stepper_angels = [90, -90, 0, 0]
+
+
+# Definition of function to calculate stepper angels to move end effector to desired coordination by changing M2 and M3
+def ik_calculate_angels2(end_effector_position):
+    z0 = segments_length[0]
+    y0 = segments_length[1]
+
+    alpha = [90, -90, 0, 0]  # relative stepper angels to reach desired coordination
+    beta = [0, 0, 90]  # angels of right triangle
+
+    y = end_effector_position[0] - y0
+    z = end_effector_position[1] - z0
+
+    l2 = segments_length[2]
+    l3 = segments_length[3]
+    l_h = np.sqrt(np.square(y) + np.square(z))  # calculating hypothesis
+
+    gamma = calculate_triangle_angles(l3, l2, l_h)
+
+    beta[0] = np.rad2deg(np.arctan2(z, y))
+    beta[1] = np.rad2deg(np.arctan2(y, z))
+
+    alpha[2] = gamma[0] + beta[0]
+    alpha[3] = -(180 - gamma[2])
+
+    return alpha
+
+
+pos = [40, 30]
+alpha_degree = ik_calculate_angels2(pos)
+alpha_rel = np.array(alpha_degree)
+alpha_abs = np.array(calculate_angels_to_horizon(alpha_rel)) * (np.pi / 180)
 
 start_x = 0
 start_y = 0
 
-x0 = np.cos(alpha[0]) * l[0]
-y0 = np.sin(alpha[0]) * l[0]
+x0 = np.cos(alpha_abs[0]) * segments_length[0]
+y0 = np.sin(alpha_abs[0]) * segments_length[0]
+
+x1 = x0 + np.cos(alpha_abs[1]) * segments_length[1]
+y1 = y0 + np.sin(alpha_abs[1]) * segments_length[1]
 
-x1 = x0 + np.cos(alpha[1]) * l[1]
-y1 = y0 + np.sin(alpha[1]) * l[1]
+x2 = x1 + np.cos(alpha_abs[2]) * segments_length[2]
+y2 = y1 + np.sin(alpha_abs[2]) * segments_length[2]
 
-x2 = x1 + np.cos(alpha[2]) * l[2]
-y2 = y1 + np.sin(alpha[2]) * l[2]
+x3 = x2 + np.cos(alpha_abs[3]) * segments_length[3]
+y3 = y2 + np.sin(alpha_abs[3]) * segments_length[3]
 
-x3 = x2 + np.cos(alpha[3]) * l[3]
-y3 = y2 + np.sin(alpha[3]) * l[3]
+# dev_x = [start_x, fk_calculate_position(alpha_degree)[0][0], fk_calculate_position(alpha_degree)[0][1],
+# fk_calculate_position(alpha_degree)[0][2],
+# fk_calculate_position(alpha_degree)[0][3]]
+# dev_y = [start_y, fk_calculate_position(alpha_degree)[1][0], fk_calculate_position(alpha_degree)[1][1],
+# fk_calculate_position(alpha_degree)[1][2],
+# fk_calculate_position(alpha_degree)[1][3]]
 
 dev_x = [start_x, x0, x1, x2, x3]
 dev_y = [start_y, y0, y1, y2, y3]
 
+# Create a figure and axis
+# fig, ax = plt.subplots()
+
+# Set the limits for the x and y axes
+# ax.set_xlim(-130, 130)
+# ax.set_ylim(-130, 130)
+
 plt.plot(dev_x, dev_y, marker='o')
 plt.grid()
+plt.xlabel('Y in cm')
+plt.ylabel('Z in cm')
 
 plt.show()