Fouzanjaved commited on
Commit
7ecb092
·
verified ·
1 Parent(s): 4c045cc

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -0
app.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ import gradio as gr
4
+ from scipy.spatial.distance import euclidean
5
+ from scipy.optimize import minimize
6
+
7
+ # Define the robot's arm lengths (6-DOF)
8
+ L = np.array([1, 1, 1, 1, 1, 1]) # Lengths of each arm segment
9
+
10
+ # Forward kinematics: Compute the end-effector position given joint angles
11
+ def forward_kinematics(theta):
12
+ theta = np.array(theta)
13
+ x = L[0] * np.cos(theta[0]) + L[1] * np.cos(theta[0] + theta[1]) + L[2] * np.cos(theta[0] + theta[1] + theta[2]) + \
14
+ L[3] * np.cos(theta[0] + theta[1] + theta[2] + theta[3]) + L[4] * np.cos(theta[0] + theta[1] + theta[2] + theta[3] + theta[4]) + \
15
+ L[5] * np.cos(theta[0] + theta[1] + theta[2] + theta[3] + theta[4] + theta[5])
16
+ y = L[0] * np.sin(theta[0]) + L[1] * np.sin(theta[0] + theta[1]) + L[2] * np.sin(theta[0] + theta[1] + theta[2]) + \
17
+ L[3] * np.sin(theta[0] + theta[1] + theta[2] + theta[3]) + L[4] * np.sin(theta[0] + theta[1] + theta[2] + theta[3] + theta[4]) + \
18
+ L[5] * np.sin(theta[0] + theta[1] + theta[2] + theta[3] + theta[4] + theta[5])
19
+ return np.array([x, y])
20
+
21
+ # Objective function: Minimize the distance between the end-effector and the target
22
+ def objective_function(theta, target):
23
+ end_effector = forward_kinematics(theta)
24
+ return euclidean(end_effector, target)
25
+
26
+ # Find the shortest path (joint angles) to reach the target
27
+ def find_shortest_path(initial_angles, target):
28
+ result = minimize(objective_function, initial_angles, args=(target,), method='BFGS')
29
+ return result.x
30
+
31
+ # Gradio interface
32
+ def robot_pathfinder(target_x, target_y):
33
+ target = np.array([target_x, target_y])
34
+ initial_angles = np.array([0, 0, 0, 0, 0, 0]) # Initial joint angles
35
+ optimal_angles = find_shortest_path(initial_angles, target)
36
+
37
+ # Plot the robot arm
38
+ fig, ax = plt.subplots()
39
+ ax.set_xlim(-5, 5)
40
+ ax.set_ylim(-5, 5)
41
+ ax.set_aspect('equal')
42
+
43
+ # Draw the robot arm
44
+ x = [0]
45
+ y = [0]
46
+ for i in range(len(L)):
47
+ x.append(x[-1] + L[i] * np.cos(np.sum(optimal_angles[:i+1])))
48
+ y.append(y[-1] + L[i] * np.sin(np.sum(optimal_angles[:i+1])))
49
+ ax.plot(x, y, 'o-', lw=2, markersize=10)
50
+
51
+ # Mark the target
52
+ ax.plot(target[0], target[1], 'rx', markersize=10)
53
+
54
+ plt.title("6-DOF Robot Arm Pathfinding")
55
+ return fig
56
+
57
+ # Gradio app
58
+ iface = gr.Interface(
59
+ fn=robot_pathfinder,
60
+ inputs=["number", "number"],
61
+ outputs="plot",
62
+ live=True,
63
+ title="6-DOF Robot Shortest Path Finder",
64
+ description="Enter target coordinates (x, y) to find the shortest path for a 6-DOF robot arm."
65
+ )
66
+
67
+ iface.launch()