123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import numpy as np
- import matplotlib.pyplot as plt
- 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_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]
- x2 = x1 + np.cos(alpha_abs[2]) * segments_length[2]
- y2 = y1 + np.sin(alpha_abs[2]) * segments_length[2]
- x3 = x2 + np.cos(alpha_abs[3]) * segments_length[3]
- y3 = y2 + np.sin(alpha_abs[3]) * segments_length[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()
|