function inverseKinematicsDemo() % Posizione desiderata desiredPosition = [2, 3]; % Modifica questo valore secondo necessità % Angoli iniziali (stima) initialAngles = [0, 0, 0]; % Angoli iniziali (es. [0, 0, 0]) % Utilizzo fminsearch per trovare gli angoli ottimali options = optimset('PlotFcns',@optimplotfval); optimalAngles = fminsearch(@(angles) objectiveFunction(angles, desiredPosition), initialAngles, options); % Funzione di visualizzazione del movimento function cost = objectiveFunction(angles, desiredPosition) currentPos = forwardKinematics(angles); cost = norm(currentPos - desiredPosition); % Visualizzazione visualizeRobot(angles, desiredPosition); pause(0.5); % Ritardo di mezzo secondo tra ogni visualizzazione end % Calcolo della posizione del braccio con cinematica diretta function position = forwardKinematics(angles) l = [1, 1, 1]; % Lunghezze dei segmenti del braccio (modifica se necessario) x = l(1)*cos(angles(1)) + l(2)*cos(angles(1)+angles(2)) + l(3)*cos(sum(angles)); y = l(1)*sin(angles(1)) + l(2)*sin(angles(1)+angles(2)) + l(3)*sin(sum(angles)); position = [x, y]; end % Funzione di visualizzazione del braccio robotico function visualizeRobot(angles, desiredPosition) position = forwardKinematics(angles); clf; % Pulisce la figura corrente plot([0, position(1)], [0, position(2)], 'b', 'LineWidth', 2); % Disegna il braccio hold on; scatter(desiredPosition(1), desiredPosition(2), 'g', 'square'); % Punto desiderato axis equal; xlim([-3, 3]); ylim([-3, 3]); % Imposta gli stessi limiti per ogni visualizzazione drawnow; end end % Per eseguire la demo, scrivi 'inverseKinematicsDemo()' nella Command Window di MATLAB.