File size: 2,841 Bytes
5961d2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import gradio as gr
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# -------------------------------
# Step 1: Generate synthetic data
# -------------------------------
def forward_kinematics(theta):
    x = np.cos(theta[0]) + np.cos(theta[1]) + np.cos(theta[2])
    y = np.sin(theta[0]) + np.sin(theta[1]) + np.sin(theta[2])
    z = theta[3] + theta[4] + theta[5]
    return np.array([x, y, z])

# Generate dataset
def create_dataset(num_samples=5000):
    X = []
    y = []
    for _ in range(num_samples):
        angles = np.random.uniform(low=-np.pi, high=np.pi, size=6)
        position = forward_kinematics(angles)
        X.append(position)
        y.append(angles)
    return np.array(X), np.array(y)

# Generate and train
X, y = create_dataset()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = MLPRegressor(hidden_layer_sizes=(64, 64), max_iter=1000)
model.fit(X_train, y_train)

# Optional: Evaluate model
mse = mean_squared_error(y_test, model.predict(X_test))
print(f"Test MSE: {mse:.4f}")

# -------------------------------
# Step 2: Use ML to predict angles
# -------------------------------
def predict_angles_with_ml(target_position):
    return model.predict([target_position])[0]

def generate_trajectory(target_position):
    initial_angles = [0, 0, 0, 0, 0, 0]
    target_angles = predict_angles_with_ml(target_position)
    trajectory = np.linspace(initial_angles, target_angles, 100)
    return trajectory

def plot_trajectory(trajectory):
    x, y, z = [], [], []
    for theta in trajectory:
        pos = forward_kinematics(theta)
        x.append(pos[0])
        y.append(pos[1])
        z.append(pos[2])

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot(x, y, z, label="Robot Trajectory")
    ax.scatter(x[0], y[0], z[0], color='green', label="Start")
    ax.scatter(x[-1], y[-1], z[-1], color='red', label="Target")
    ax.set_xlabel("X")
    ax.set_ylabel("Y")
    ax.set_zlabel("Z")
    ax.legend()
    return fig

# -------------------------------
# Step 3: Gradio Interface
# -------------------------------
def gradio_interface(x, y, z):
    target_position = np.array([x, y, z])
    trajectory = generate_trajectory(target_position)
    fig = plot_trajectory(trajectory)
    return fig

iface = gr.Interface(
    fn=gradio_interface,
    inputs=[gr.Number(label="Target X"), gr.Number(label="Target Y"), gr.Number(label="Target Z")],
    outputs="plot",
    title="ML-Based Inverse Kinematics for 6-DOF Robot",
    description="Neural network predicts joint angles for a given (x, y, z) target using learned inverse kinematics."
)

iface.launch()