#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define NUM_POINTS 100
// Structure to hold joint angles
typedef struct {
double theta1;
double theta2;
double theta3;
} JointAngles;
// Function to calculate inverse kinematics
JointAngles inverse_kinematics(double x, double y, double z) {
// Given parameters
double a1 = 1.5; // m
double a2 = 1.2; // m
double d2 = 0.3; // m
double d3 = 0.3; // m
double a3 = 0.75; // m
JointAngles angles;
// Solve for theta1
angles.
theta1 = atan2(y
, x
);
// Solve for theta2 and theta3
double r
= sqrt(x
*x
+ y
*y
) - a1
; double h = z - d2 - d3;
double D = (r*r + h*h - a2*a2 - a3*a3)/(2*a2*a3);
double k1
= a2
+ a3
*cos(angles.
theta3); double k2
= a3
*sin(angles.
theta3);
return angles;
}
// Function to perform path planning and plot joint variables
void path_planning() {
// Define start and end points (example values)
double p1[3] = {1.0, 1.5, 0.5}; // (x1, y1, z1)
double p2[3] = {1.5, 1.0, 0.7}; // (x2, y2, z2)
// Time parameters
double t_total = 10.0; // seconds
double dt = t_total / (NUM_POINTS - 1);
// Arrays to store results
JointAngles angles[NUM_POINTS];
int i;
// Linear path planning
for (i = 0; i < NUM_POINTS; i++) {
// Interpolate position
double alpha = (double)i / (NUM_POINTS - 1);
double x = p1[0] + alpha * (p2[0] - p1[0]);
double y = p1[1] + alpha * (p2[1] - p1[1]);
double z = p1[2] + alpha * (p2[2] - p1[2]);
// Calculate inverse kinematics
angles[i] = inverse_kinematics(x, y, z);
}
// Write results to file for plotting (can use GNUplot or other tools)
FILE
*fp
= fopen("joint_variables.txt", "w"); if (fp == NULL) {
printf("Error opening file!\n"); return;
}
fprintf(fp
, "Time theta1 theta2 theta3\n"); for (i = 0; i < NUM_POINTS; i++) {
fprintf(fp
, "%.2f %.4f %.4f %.4f\n", time[i
], angles
[i
].
theta1, angles
[i
].
theta2, angles
[i
].
theta3); }
printf("Joint variables saved to 'joint_variables.txt'\n"); printf("You can plot this data using GNUplot or other tools.\n"); }
int main() {
printf("PUMA Robot Inverse Kinematics and Path Planning\n"); path_planning();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTlVNX1BPSU5UUyAxMDAKCi8vIFN0cnVjdHVyZSB0byBob2xkIGpvaW50IGFuZ2xlcwp0eXBlZGVmIHN0cnVjdCB7CiAgICBkb3VibGUgdGhldGExOwogICAgZG91YmxlIHRoZXRhMjsKICAgIGRvdWJsZSB0aGV0YTM7Cn0gSm9pbnRBbmdsZXM7CgovLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgaW52ZXJzZSBraW5lbWF0aWNzCkpvaW50QW5nbGVzIGludmVyc2Vfa2luZW1hdGljcyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KSB7CiAgICAvLyBHaXZlbiBwYXJhbWV0ZXJzCiAgICBkb3VibGUgYTEgPSAxLjU7ICAgLy8gbQogICAgZG91YmxlIGEyID0gMS4yOyAgIC8vIG0KICAgIGRvdWJsZSBkMiA9IDAuMzsgICAvLyBtCiAgICBkb3VibGUgZDMgPSAwLjM7ICAgLy8gbQogICAgZG91YmxlIGEzID0gMC43NTsgIC8vIG0KICAgIAogICAgSm9pbnRBbmdsZXMgYW5nbGVzOwogICAgCiAgICAvLyBTb2x2ZSBmb3IgdGhldGExCiAgICBhbmdsZXMudGhldGExID0gYXRhbjIoeSwgeCk7CiAgICAKICAgIC8vIFNvbHZlIGZvciB0aGV0YTIgYW5kIHRoZXRhMwogICAgZG91YmxlIHIgPSBzcXJ0KHgqeCArIHkqeSkgLSBhMTsKICAgIGRvdWJsZSBoID0geiAtIGQyIC0gZDM7CiAgICAKICAgIGRvdWJsZSBEID0gKHIqciArIGgqaCAtIGEyKmEyIC0gYTMqYTMpLygyKmEyKmEzKTsKICAgIGFuZ2xlcy50aGV0YTMgPSBhdGFuMihzcXJ0KDEtRCpEKSwgRCk7CiAgICAKICAgIGRvdWJsZSBrMSA9IGEyICsgYTMqY29zKGFuZ2xlcy50aGV0YTMpOwogICAgZG91YmxlIGsyID0gYTMqc2luKGFuZ2xlcy50aGV0YTMpOwogICAgYW5nbGVzLnRoZXRhMiA9IGF0YW4yKGgsIHIpIC0gYXRhbjIoazIsIGsxKTsKICAgIAogICAgcmV0dXJuIGFuZ2xlczsKfQoKLy8gRnVuY3Rpb24gdG8gcGVyZm9ybSBwYXRoIHBsYW5uaW5nIGFuZCBwbG90IGpvaW50IHZhcmlhYmxlcwp2b2lkIHBhdGhfcGxhbm5pbmcoKSB7CiAgICAvLyBEZWZpbmUgc3RhcnQgYW5kIGVuZCBwb2ludHMgKGV4YW1wbGUgdmFsdWVzKQogICAgZG91YmxlIHAxWzNdID0gezEuMCwgMS41LCAwLjV9OyAgLy8gKHgxLCB5MSwgejEpCiAgICBkb3VibGUgcDJbM10gPSB7MS41LCAxLjAsIDAuN307ICAvLyAoeDIsIHkyLCB6MikKICAgIAogICAgLy8gVGltZSBwYXJhbWV0ZXJzCiAgICBkb3VibGUgdF90b3RhbCA9IDEwLjA7ICAvLyBzZWNvbmRzCiAgICBkb3VibGUgZHQgPSB0X3RvdGFsIC8gKE5VTV9QT0lOVFMgLSAxKTsKICAgIAogICAgLy8gQXJyYXlzIHRvIHN0b3JlIHJlc3VsdHMKICAgIGRvdWJsZSB0aW1lW05VTV9QT0lOVFNdOwogICAgSm9pbnRBbmdsZXMgYW5nbGVzW05VTV9QT0lOVFNdOwogICAgaW50IGk7CiAgICAKICAgIC8vIExpbmVhciBwYXRoIHBsYW5uaW5nCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1BPSU5UUzsgaSsrKSB7CiAgICAgICAgdGltZVtpXSA9IGkgKiBkdDsKICAgICAgICAKICAgICAgICAvLyBJbnRlcnBvbGF0ZSBwb3NpdGlvbgogICAgICAgIGRvdWJsZSBhbHBoYSA9IChkb3VibGUpaSAvIChOVU1fUE9JTlRTIC0gMSk7CiAgICAgICAgZG91YmxlIHggPSBwMVswXSArIGFscGhhICogKHAyWzBdIC0gcDFbMF0pOwogICAgICAgIGRvdWJsZSB5ID0gcDFbMV0gKyBhbHBoYSAqIChwMlsxXSAtIHAxWzFdKTsKICAgICAgICBkb3VibGUgeiA9IHAxWzJdICsgYWxwaGEgKiAocDJbMl0gLSBwMVsyXSk7CiAgICAgICAgCiAgICAgICAgLy8gQ2FsY3VsYXRlIGludmVyc2Uga2luZW1hdGljcwogICAgICAgIGFuZ2xlc1tpXSA9IGludmVyc2Vfa2luZW1hdGljcyh4LCB5LCB6KTsKICAgIH0KICAgIAogICAgLy8gV3JpdGUgcmVzdWx0cyB0byBmaWxlIGZvciBwbG90dGluZyAoY2FuIHVzZSBHTlVwbG90IG9yIG90aGVyIHRvb2xzKQogICAgRklMRSAqZnAgPSBmb3Blbigiam9pbnRfdmFyaWFibGVzLnR4dCIsICJ3Iik7CiAgICBpZiAoZnAgPT0gTlVMTCkgewogICAgICAgIHByaW50ZigiRXJyb3Igb3BlbmluZyBmaWxlIVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBmcHJpbnRmKGZwLCAiVGltZSB0aGV0YTEgdGhldGEyIHRoZXRhM1xuIik7CiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1BPSU5UUzsgaSsrKSB7CiAgICAgICAgZnByaW50ZihmcCwgIiUuMmYgJS40ZiAlLjRmICUuNGZcbiIsIAogICAgICAgICAgICAgICAgdGltZVtpXSwgYW5nbGVzW2ldLnRoZXRhMSwgYW5nbGVzW2ldLnRoZXRhMiwgYW5nbGVzW2ldLnRoZXRhMyk7CiAgICB9CiAgICBmY2xvc2UoZnApOwogICAgCiAgICBwcmludGYoIkpvaW50IHZhcmlhYmxlcyBzYXZlZCB0byAnam9pbnRfdmFyaWFibGVzLnR4dCdcbiIpOwogICAgcHJpbnRmKCJZb3UgY2FuIHBsb3QgdGhpcyBkYXRhIHVzaW5nIEdOVXBsb3Qgb3Igb3RoZXIgdG9vbHMuXG4iKTsKfQoKaW50IG1haW4oKSB7CiAgICBwcmludGYoIlBVTUEgUm9ib3QgSW52ZXJzZSBLaW5lbWF0aWNzIGFuZCBQYXRoIFBsYW5uaW5nXG4iKTsKICAgIHBhdGhfcGxhbm5pbmcoKTsKICAgIHJldHVybiAwOwp9