I assigned reference frames to each link of the robots arm using the Denavit-Hartenberg convention.
% create a DH table: ai alphai di thetai DH = [0 0 0.2703 theta1;... %Joint 1 0.069 -pi/2 0 theta2;... %Joint 2 0 pi/2 0.3644 theta3;... %Joint 3 0.069 -pi/2 0 theta4;... %Joint 4 0 pi/2 0.3743 theta5;... %Joint 5 0.01 -pi/2 0 theta6;... %Joint 6 0 pi/2 0.2295 theta7]; %Joint 7
I constructed a transformation matrix from the base of the robot to the end-effector.
for i = 1:TN T(i).A = [cos(theta(i)) -sin(theta(i)) 0 a(i);... sin(theta(i))*cos(alpha(i)) cos(theta(i))*cos(alpha(i)) -sin(alpha(i)) -sin(alpha(i))*d(i);... sin(theta(i))*sin(alpha(i)) cos(theta(i))*sin(alpha(i)) cos(alpha(i)) cos(alpha(i))*d(i);... 0 0 0 1]; end
I wrote a script that could take a cartesian function as an input and calcualte the joint angles at set time increments.
for t = 0:dt:4 NewJacobianMatrix = vpa(subs(JacobianMatrix,[theta1,theta2,theta3,theta4,theta5,theta6,theta7],transpose(newjointangles))); %substitute angles into Jacobian matrix newjointangles = simplify(newjointangles + dt*(pinv(NewJacobianMatrix)*[-(pi*sin((pi*t)/2))/40; (pi*cos((pi*t)/2))/40; 0])); % multiply cartesian function by the pseudo inverse of the Jacobian Matrix JointangleMatrix(:,j) = newjointangles; %append each set of joint angles to a larger matrix Endeffectorvel(:,j) = (NewJacobianMatrix * (pinv(NewJacobianMatrix)*[-(pi*sin((pi*t)/2))/40; (pi*cos((pi*t)/2))/40; 0]));%[-(pi*sin((pi*t)/2))/40 (pi*cos((pi*t)/2))/40 0]; %append the velocity of the end effector to a matrix pseudoinverseJacobianMatrix(:,:,j)= pinv(NewJacobianMatrix); %append each pseudo inverted jacobian matrix to a larger matrix JacobianMatrixMatrix(:,:,j)= NewJacobianMatrix; %append each jacobian matrix to a larger matrix Cartesianposition = Cartesianposition + dt*(NewJacobianMatrix * (pinv(NewJacobianMatrix)*[-(pi*sin((pi*t)/2))/40; (pi*cos((pi*t)/2))/40; 0])); Cartesianpositionmatrix(:,j) = Cartesianposition; %append the cartesian positions to a larger matrix j=j+1; %increase index variable end
After the kinematic model was working I began experimenting with trajectories outside of the robot's workspace and poses that resulted in a singularity, effectively breaking the kinematic model.
Finally I used the Matlab robotics toolbox to visualise my model in 3D by defining joints, reference frames and angular range.