ForwardKinematics.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. segments_length = [15, 50, 40, 30]
  4. alpha = np.array([90, 0, 0, 0]) * (np.pi / 180)
  5. def calculate_triangle_angles(a, b, c):
  6. # Calculate the angles using the law of cosines
  7. angle_a = np.rad2deg(np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)))
  8. angle_b = np.rad2deg(np.arccos((c ** 2 + a ** 2 - b ** 2) / (2 * c * a)))
  9. angle_c = 180 - angle_a - angle_b # The sum of angles in a triangle is 180 degrees
  10. return angle_a, angle_b, angle_c
  11. def calculate_angels_to_horizon(relative_angels_stepper):
  12. absolute_angels = [0, 0, 0, 0]
  13. absolute_angels[0] = relative_angels_stepper[0]
  14. absolute_angels[1] = absolute_angels[0] + relative_angels_stepper[1]
  15. absolute_angels[2] = absolute_angels[1] + relative_angels_stepper[2]
  16. absolute_angels[3] = absolute_angels[2] + relative_angels_stepper[3]
  17. for j in range(4):
  18. if absolute_angels[j] > 360:
  19. absolute_angels[j] = absolute_angels[j] - 360
  20. print("relative:", relative_angels_stepper,
  21. "absolute:", absolute_angels)
  22. return absolute_angels
  23. def calculate_angels_relative(absolute_angels_stepper):
  24. relative_angels = [0, 0, 0, 0]
  25. relative_angels[0] = absolute_angels_stepper[0]
  26. relative_angels[1] = absolute_angels_stepper[1] - relative_angels[0]
  27. relative_angels[2] = absolute_angels_stepper[2] - relative_angels[1]
  28. relative_angels[3] = absolute_angels_stepper[3] - relative_angels[2]
  29. for j in range(4):
  30. if relative_angels[j] > 360:
  31. relative_angels[j] = relative_angels[j] - 360
  32. return relative_angels
  33. def ik_calculate_angels(g3_position, g4_orientation):
  34. z0 = segments_length[0]
  35. # y0 = 0
  36. alpha = [90, 0, 0, g4_orientation] # relative stepper angels to reach desired coordination
  37. beta = [0, 0, 90] # angels of right triangle
  38. y = g3_position[0] # - y0
  39. z = g3_position[1] - z0
  40. l1 = segments_length[1]
  41. l2 = segments_length[2]
  42. l_h = np.sqrt(np.square(y) + np.square(z)) # calculating hypothesis
  43. gamma = calculate_triangle_angles(l2, l1, l_h)
  44. beta[0] = np.rad2deg(np.arctan2(z, y))
  45. beta[1] = np.rad2deg(np.arctan2(y, z))
  46. alpha[1] = -(90 - gamma[0] - beta[0])
  47. alpha[2] = -(180 - gamma[2])
  48. return alpha
  49. # Wrong!!!!!
  50. def fk_calculate_position(stepper_angels_rel):
  51. alpha = np.array(stepper_angels_rel) * (np.pi / 180)
  52. alpha_abs = calculate_angels_to_horizon(alpha)
  53. z = [0, 0, 0, 0]
  54. y = [0, 0, 0, 0]
  55. start_x = 0
  56. start_y = 0
  57. z[0] = segments_length[0]
  58. y[0] = 0
  59. z[1] = z[0]
  60. y[1] = y[0] + segments_length[1]
  61. z[2] = y[1] + np.cos(alpha_abs[2]) * segments_length[2]
  62. y[2] = z[1] + np.sin(alpha_abs[2]) * segments_length[2]
  63. z[3] = z[2] + np.cos(alpha_abs[3]) * segments_length[3]
  64. y[3] = y[2] + np.sin(alpha_abs[3]) * segments_length[3]
  65. m4_pos_2d = [y, z]
  66. m3_pos_2d = [y, z]
  67. return m4_pos_2d
  68. default_stepper_angels = [90, -90, 0, 0]
  69. # Definition of function to calculate stepper angels to move end effector to desired coordination by changing M2 and M3
  70. def ik_calculate_angels2(end_effector_position):
  71. z0 = segments_length[0]
  72. y0 = segments_length[1]
  73. alpha = [90, -90, 0, 0] # relative stepper angels to reach desired coordination
  74. beta = [0, 0, 90] # angels of right triangle
  75. y = end_effector_position[0] - y0
  76. z = end_effector_position[1] - z0
  77. l2 = segments_length[2]
  78. l3 = segments_length[3]
  79. l_h = np.sqrt(np.square(y) + np.square(z)) # calculating hypothesis
  80. gamma = calculate_triangle_angles(l3, l2, l_h)
  81. beta[0] = np.rad2deg(np.arctan2(z, y))
  82. beta[1] = np.rad2deg(np.arctan2(y, z))
  83. alpha[2] = gamma[0] + beta[0]
  84. alpha[3] = -(180 - gamma[2])
  85. return alpha
  86. pos = [40, 30]
  87. alpha_degree = ik_calculate_angels2(pos)
  88. alpha_rel = np.array(alpha_degree)
  89. alpha_abs = np.array(calculate_angels_to_horizon(alpha_rel)) * (np.pi / 180)
  90. start_x = 0
  91. start_y = 0
  92. x0 = np.cos(alpha_abs[0]) * segments_length[0]
  93. y0 = np.sin(alpha_abs[0]) * segments_length[0]
  94. x1 = x0 + np.cos(alpha_abs[1]) * segments_length[1]
  95. y1 = y0 + np.sin(alpha_abs[1]) * segments_length[1]
  96. x2 = x1 + np.cos(alpha_abs[2]) * segments_length[2]
  97. y2 = y1 + np.sin(alpha_abs[2]) * segments_length[2]
  98. x3 = x2 + np.cos(alpha_abs[3]) * segments_length[3]
  99. y3 = y2 + np.sin(alpha_abs[3]) * segments_length[3]
  100. # dev_x = [start_x, fk_calculate_position(alpha_degree)[0][0], fk_calculate_position(alpha_degree)[0][1],
  101. # fk_calculate_position(alpha_degree)[0][2],
  102. # fk_calculate_position(alpha_degree)[0][3]]
  103. # dev_y = [start_y, fk_calculate_position(alpha_degree)[1][0], fk_calculate_position(alpha_degree)[1][1],
  104. # fk_calculate_position(alpha_degree)[1][2],
  105. # fk_calculate_position(alpha_degree)[1][3]]
  106. dev_x = [start_x, x0, x1, x2, x3]
  107. dev_y = [start_y, y0, y1, y2, y3]
  108. # Create a figure and axis
  109. # fig, ax = plt.subplots()
  110. # Set the limits for the x and y axes
  111. # ax.set_xlim(-130, 130)
  112. # ax.set_ylim(-130, 130)
  113. plt.plot(dev_x, dev_y, marker='o')
  114. plt.grid()
  115. plt.xlabel('Y in cm')
  116. plt.ylabel('Z in cm')
  117. plt.show()