# Difference between revisions of "Robotic Arm: Team Blue"

(6 intermediate revisions by 2 users not shown) | |||

Line 2: | Line 2: | ||

== Design of the Robot Arm == | == Design of the Robot Arm == | ||

+ | |||

+ | === Description === | ||

=== Solidworks Model === | === Solidworks Model === | ||

− | |||

− | + | == Programming the Robot Arm through MATLAB == | |

− | + | === Approach === | |

The approach that Team Blue used in making the MATLAB code for drawing an inscribed circle in a square proved to be frustrating at times. First, the team drew out a flow chart of what previous functions they had composed. gotoAngles, forwardKinematics, and inverseKinematicsf were the functions that the team used. | The approach that Team Blue used in making the MATLAB code for drawing an inscribed circle in a square proved to be frustrating at times. First, the team drew out a flow chart of what previous functions they had composed. gotoAngles, forwardKinematics, and inverseKinematicsf were the functions that the team used. | ||

− | + | === Issues === | |

+ | Most of the issues were syntax issues which came from combining codes together and not having the same variables in functions. They were solved with help from Professor Cheever. However, the largest problem was discovered when the robot arm's drawing was skewed and was not a perfect square. An example of this can be seen in the photo below. The cause of this was discovered to be the calibrations done on the servo motors. Also, a mix up on identifying the length of the lower and upper arm distorted the first attempted drawings. | ||

− | + | The motors used weren't exact and so the team had to measure and compensate for how much the motor was skewed. This measurement was not close enough and therefore, the angles made were not exact. | |

− | + | ||

+ | Other than these issues, the team did not incur many other issues when writing the MATLAB code. | ||

− | The Robot Arm on the day of demonstration. | + | === Photograph of the Robot Arm === |

+ | [[Image:BlueRobotArm.JPG]] | ||

+ | |||

+ | The Robot Arm on the day of demonstration. This would have been a great picture except for the feet. | ||

[[Image:BlueSquareCircle.jpg]] | [[Image:BlueSquareCircle.jpg]] | ||

Line 24: | Line 29: | ||

A close up of the Robot Arm's Drawing. NOTE: This photo was enhanced in order to clearly show the skewed angles of the drawing. | A close up of the Robot Arm's Drawing. NOTE: This photo was enhanced in order to clearly show the skewed angles of the drawing. | ||

+ | |||

+ | === Codes === | ||

+ | ==== Forward Kinematics ==== | ||

+ | function [x1, y1, x2, y2] = forwardKinematics(la, lb, theta_a, theta_b) | ||

+ | %Calculate locations of arms of robot | ||

+ | theta_a = theta_a * pi/180; %Convert angles to radians. | ||

+ | theta_b = theta_b * pi/180; | ||

+ | |||

+ | x1 = la*cos(theta_a); %find positions | ||

+ | y1 = la*sin(theta_a); | ||

+ | x2 = x1 + lb*cos(theta_b); | ||

+ | y2 = y1 + lb*sin(theta_b); | ||

+ | |||

+ | ==== Inverse Kinematics ==== | ||

+ | function [theta_a, theta_b] = inverseKinematicsf(x2, y2) | ||

+ | %Define robot geometry | ||

+ | la=11.6; lb=8; | ||

+ | % Find theta_a and theta_b | ||

+ | theta_a= atan2(y2,x2) + acos((la^2 + (x2^2 + y2^2)-lb^2 )/(2*la*sqrt(x2^2 + y2^2))); | ||

+ | theta_b= atan2((y2-la*sin(theta_a))/lb,(x2-la*cos(theta_a))/lb); | ||

+ | |||

+ | % Convert to degrees | ||

+ | theta_a = theta_a*180/pi; | ||

+ | theta_b = theta_b*180/pi; | ||

+ | |||

+ | end | ||

+ | |||

+ | ==== Go to Angles ==== | ||

+ | function gotoAngles(s,theta_a,theta_b,T) | ||

+ | |||

+ | %Create a new serial communications link | ||

+ | |||

+ | pwB= (theta_b-150)/(-.1); %invert P to theta equation for B | ||

+ | pwB=round(pwB); %round answer to integer | ||

+ | %cmd=['#4P' num2str(pw) 'T' num2str(T)] | ||

+ | |||

+ | %pwA=(theta_a-140)/(-.093); %invert P to theta equation for A | ||

+ | pwA= (theta_a-10)/(-.2) | ||

+ | theta_a | ||

+ | pwA=round(pwA); %round answer to integer | ||

+ | cmd=['#1P' num2str(pwA) '#4P' num2str(pwB) 'T' num2str(T)] | ||

+ | |||

+ | fprintf(s,cmd); | ||

+ | % ... | ||

+ | |||

+ | |||

+ | pause(T/1000); | ||

+ | |||

+ | end | ||

+ | |||

+ | ==== Final Code ==== | ||

+ | T=100; | ||

+ | la=11.6, lb=8 | ||

+ | |||

+ | s=instrfind; %Find any serial links (we can have only 1) | ||

+ | delete(s); %... and delete. | ||

+ | |||

+ | %Create a new serial communications link | ||

+ | s=serial('COM1','Baudrate',115200,'Terminator','CR'); | ||

+ | fopen(s); %... and open it | ||

+ | |||

+ | [ta tb]=inverseKinematicsf(13,-10); | ||

+ | tbnew=tb-ta; | ||

+ | [ta tbnew] | ||

+ | gotoAngles(s,ta,tbnew,T); | ||

+ | |||

+ | x2=[13 10 10 13 13 13]; | ||

+ | y2=[-10 -10 -13 -13 -10 -11.5]; | ||

+ | |||

+ | for i=1:(length(x2)-1), | ||

+ | x2i=linspace(x2(i),x2(i+1),20); | ||

+ | y2i=linspace(y2(i),y2(i+1),20); | ||

+ | for j=1:length(x2i) | ||

+ | [ta tb]=inverseKinematicsf(x2i(j),y2i(j)); | ||

+ | tbnew=tb-ta; | ||

+ | [ta tbnew] | ||

+ | gotoAngles(s,ta,tbnew,T); | ||

+ | end | ||

+ | end | ||

+ | |||

+ | numPts = 50 | ||

+ | phi = linspace(0,360,numPts) | ||

+ | |||

+ | x0=11.5; %Define center (x0,y0) of circle and radius (r) | ||

+ | y0=-11.5; | ||

+ | r=1.5; | ||

+ | |||

+ | % loop through all the values of phi | ||

+ | for i=1:length(phi), | ||

+ | x2=x0+r*cosd(phi(i)); %x2 and y2 trace out a circle. | ||

+ | y2=y0+r*sind(phi(i)); | ||

+ | [aa bb]=inverseKinematicsf(x2, y2); | ||

+ | bbnew=bb-aa; | ||

+ | gotoAngles(s, aa, bbnew, T); | ||

+ | end |

## Latest revision as of 00:09, 17 November 2008

Dinh | Parasrampuria | Silverblatt-Buser | Weiner

## Contents

## Design of the Robot Arm

### Description

### Solidworks Model

## Programming the Robot Arm through MATLAB

### Approach

The approach that Team Blue used in making the MATLAB code for drawing an inscribed circle in a square proved to be frustrating at times. First, the team drew out a flow chart of what previous functions they had composed. gotoAngles, forwardKinematics, and inverseKinematicsf were the functions that the team used.

### Issues

Most of the issues were syntax issues which came from combining codes together and not having the same variables in functions. They were solved with help from Professor Cheever. However, the largest problem was discovered when the robot arm's drawing was skewed and was not a perfect square. An example of this can be seen in the photo below. The cause of this was discovered to be the calibrations done on the servo motors. Also, a mix up on identifying the length of the lower and upper arm distorted the first attempted drawings.

The motors used weren't exact and so the team had to measure and compensate for how much the motor was skewed. This measurement was not close enough and therefore, the angles made were not exact.

Other than these issues, the team did not incur many other issues when writing the MATLAB code.

### Photograph of the Robot Arm

The Robot Arm on the day of demonstration. This would have been a great picture except for the feet.

A close up of the Robot Arm's Drawing. NOTE: This photo was enhanced in order to clearly show the skewed angles of the drawing.

### Codes

#### Forward Kinematics

function [x1, y1, x2, y2] = forwardKinematics(la, lb, theta_a, theta_b) %Calculate locations of arms of robot theta_a = theta_a * pi/180; %Convert angles to radians. theta_b = theta_b * pi/180;

x1 = la*cos(theta_a); %find positions y1 = la*sin(theta_a); x2 = x1 + lb*cos(theta_b); y2 = y1 + lb*sin(theta_b);

#### Inverse Kinematics

function [theta_a, theta_b] = inverseKinematicsf(x2, y2) %Define robot geometry la=11.6; lb=8; % Find theta_a and theta_b theta_a= atan2(y2,x2) + acos((la^2 + (x2^2 + y2^2)-lb^2 )/(2*la*sqrt(x2^2 + y2^2))); theta_b= atan2((y2-la*sin(theta_a))/lb,(x2-la*cos(theta_a))/lb);

% Convert to degrees theta_a = theta_a*180/pi; theta_b = theta_b*180/pi;

end

#### Go to Angles

function gotoAngles(s,theta_a,theta_b,T)

%Create a new serial communications link

pwB= (theta_b-150)/(-.1); %invert P to theta equation for B pwB=round(pwB); %round answer to integer %cmd=['#4P' num2str(pw) 'T' num2str(T)]

%pwA=(theta_a-140)/(-.093); %invert P to theta equation for A pwA= (theta_a-10)/(-.2) theta_a pwA=round(pwA); %round answer to integer cmd=['#1P' num2str(pwA) '#4P' num2str(pwB) 'T' num2str(T)]

fprintf(s,cmd); % ...

pause(T/1000);

end

#### Final Code

T=100; la=11.6, lb=8

s=instrfind; %Find any serial links (we can have only 1) delete(s); %... and delete.

%Create a new serial communications link s=serial('COM1','Baudrate',115200,'Terminator','CR'); fopen(s); %... and open it

[ta tb]=inverseKinematicsf(13,-10); tbnew=tb-ta; [ta tbnew] gotoAngles(s,ta,tbnew,T);

x2=[13 10 10 13 13 13]; y2=[-10 -10 -13 -13 -10 -11.5];

for i=1:(length(x2)-1),

x2i=linspace(x2(i),x2(i+1),20); y2i=linspace(y2(i),y2(i+1),20); for j=1:length(x2i) [ta tb]=inverseKinematicsf(x2i(j),y2i(j)); tbnew=tb-ta; [ta tbnew] gotoAngles(s,ta,tbnew,T); end

end

numPts = 50 phi = linspace(0,360,numPts)

x0=11.5; %Define center (x0,y0) of circle and radius (r) y0=-11.5; r=1.5;

% loop through all the values of phi for i=1:length(phi),

x2=x0+r*cosd(phi(i)); %x2 and y2 trace out a circle. y2=y0+r*sind(phi(i)); [aa bb]=inverseKinematicsf(x2, y2); bbnew=bb-aa; gotoAngles(s, aa, bbnew, T); end