% ------------------------------------------------------------- % % EESC - USP - lab. de Mecatrônica - Grupo de Robótica Móvel % % Programa exemplo de Simulação e Análise Cinemática de um % Guindaste utilizado em portos marítmos. % % M. Becker 25/04/2009 % ============================================================= clear all; % Enunciado do problema: % Um guindaste utilizado em docas consiste em um mecanismo % 4-barras (O2ABO4), sendo E um ponto da barra ABE. O "link" % O2A é acionado por um motor acoplado em O2, cuja velocidade % é de 720 rpm (cte), através de um redutor de i=1430:1. % Calcule a velocidade da carga e a variação em sua elevação % quando a barra O2A gira de phi=60° a phi=140°. % Dados: % Valor % Unidade Descrição da Variável % ------------------------------------------------------------ a = 22.05; % [m] Comprimento da Barra O2A b = 9.75; % [m] Comprimento da Barra AB c = 28.95; % [m] Comprimento da Barra BO4 e = 7.95; % [m] Posição vertical da Junta O2 f = 9.60; % [m] Posição horizontal da Junta O4 L = 33.75; % [m] Comprimento da Barra ABE N_motor = 720; % [rpm] Rotação do Motor red = 1430; % [-] Redução d = sqrt(e^2 + f^2); cont=1; % contador ang_inicial = pi/3; % ângulo inicial da Simulação ang_final = 7*pi/9; % ângulo final da Simulação passo = pi/180; % passo angular da Simulação % Determinação do número de passos... n_passos = fix((ang_final - ang_inicial)/passo); % ESTUDO DAS POSIÇÕES %===================== % (1) Posições Fixas: O2 e O4 e ângulo delta % Observe que os pontos O2 e O4 são FIXOS! Suas posições são determinadas % no enunciado: O2=(0,e) e O4=(f,0) O2x = zeros(1,n_passos); % Matriz de zeros n_passos x 1 na direção X O2y = e*ones(1,n_passos); % Matriz de "uns" n_passos x 1 na direção Y O4x = f*ones(1,n_passos); % Matriz de "uns" n_passos x 1 na direção X O4y = zeros(1,n_passos); % Matriz de zeros n_passos x 1 na direção Y % ângulo delta: FIXO... delta = atan(e/f); % "LOOP" de cálculo das posições for angulo=ang_inicial:passo:ang_final, phi(cont) = angulo; % (2) Determinação dos ângulos: % a - ângulos alpha, betha e gamma: z = sqrt(a^2 + d^2 - 2*a*d*cos(phi(cont) + delta)); gamma(cont) = acos((z^2 - (b^2 + c^2))/(-2*b*c)); alpha(cont) = acos((z^2 + (c^2 - b^2))/(2*z*c)); betha(cont) = acos((z^2 + (d^2 - a^2))/(2*z*d)); % b - ângulos theta3 e theta4: theta4(cont) = pi - (alpha(cont) + betha(cont) + delta); theta3(cont) = theta4(cont) - gamma(cont); % (3) Posições: % a - Ponto A: % A posição do ponto A é determinada através da decomposição do % comprimento da barra O2A nos eixos X e Y. Ax(cont)= a*cos(phi(cont)) + O2x(1); Ay(cont)= a*sin(phi(cont)) + O2y(1); % b - Ponto B: % A posição do ponto B é determinada através da decomposição do % comprimento da barra BO4 nos eixos X e Y. Bx(cont)= c*cos(theta4(cont)) + O4x(1); By(cont)= c*sin(theta4(cont)) + O4y(1); % c - Ponto E: % A posição do ponto E é determinada através da decomposição do % comprimento da barra ABE nos eixos X e Y, levando-se em conta % a posição da Junta A. Ex(cont)= Ax(cont) + L*cos(theta3(cont)); Ey(cont)= Ay(cont) + L*sin(theta3(cont)); cont=cont+1; end % ESTUDO DAS VELOCIDADES E ACELERAÇÕES %====================================== phi_l = 2*pi*N_motor/(60*red); % unidade: [rad/s] phi_ll = 0; %(pois a velocidade angular é cte) for i=1:1:n_passos, % (1) Determinação de theta_l_3 e theta_l_4 P1 = -b*sin(theta3(i)); % A P2 = c*sin(theta4(i)); % B P3 = a*phi_l*sin(phi(i)); % C P4 = b*cos(theta3(i)); % D P5 = -c*cos(theta4(i)); % E P6 = -a*phi_l*cos(phi(i)); % F theta_l_3(i) = (P6*P2 - P5*P3)/(P4*P2 - P5*P1); theta_l_4(i) = (P4*P3 - P6*P1)/(P4*P2 - P5*P1); % (2) Determinação de theta_ll_3 e theta_ll_4 P3l = a*(phi_l^2)*cos(phi(i)) + a*phi_ll*sin(phi(i)) +... b*(theta_l_3(i)^2)*cos(theta3(i)) - c*(theta_l_4(i)^2)*cos(theta4(i)); % C' P6l = a*(phi_l^2)*sin(phi(i)) - a*phi_ll*cos(phi(i)) +... b*(theta_l_3(i)^2)*sin(theta3(i)) - c*(theta_l_4(i)^2)*sin(theta4(i)); % F' theta_ll_3(i) = (P6l*P2 - P5*P3l)/(P4*P2 - P5*P1); theta_ll_4(i) = (P4*P3l - P6l*P1)/(P4*P2 - P5*P1); % (3) Determinação das Velocidades e Acelerações das Juntas e Ponto E: % a - Velocidade e aceleração da Junta A: Va(i) = a*phi_l; Aa(i) = sqrt((a*(phi_l^2))^2 + (a*phi_ll)^2); % b - Velocidade e aceleração da Junta B: Vb(i) = c*theta_l_4(i); Ab(i) = sqrt((b*(theta_l_3(i)^2))^2 + (c*(theta_l_4(i)^2))^2); % c - Para o Ponto E: % Lembrar que: Ve = Va + Ve/a, onde Ve/a = L*theta_l_3 , e aplicando a mesma % idéia para Ae ... Ae = Aa + Ae/a Vex(i) = -a*phi_l*sin(phi(i)) - L*theta_l_3(i)*sin(theta3(i)); Vey(i) = a*phi_l*cos(phi(i)) + L*theta_l_3(i)*cos(theta3(i)); Ve(i) = sqrt(Vex(i)^2 + Vey(i)^2); Aex(i) = -a*(phi_l)^2*cos(phi(i)) - a*(phi_ll)*sin(phi(i)) - L*(theta_l_3(i))^2*cos(theta3(i)) - L*(theta_ll_3(i))*sin(theta3(i)); Aey(i) = -a*(phi_l)^2*sin(phi(i)) + a*(phi_ll)*cos(phi(i)) - L*(theta_l_3(i))^2*sin(theta3(i)) + L*(theta_ll_3(i))*cos(theta3(i)); Ae(i) = sqrt(Aex(i)^2 + Aey(i)^2); end % Em Forma de Simulação - Linhas a cada novo ponto calculado figure(1); for i=1:1:cont-2 clf; axis([-20 60 -20 60]); hold on; plot([O2x(i);Ax(i)],[O2y(i);Ay(i)],'.-b'); plot([Ax(i); Ex(i)],[Ay(i); Ey(i)],'.-r'); plot([Bx(i); O4x(i)],[By(i); O4y(i)],'.-b'); grid on; title('Simulação do Guindaste'); xlabel(' X [m]'); ylabel(' Y [m]'); pause(0.5); hold off; end [k N_max] = size(theta_l_3); figure(2); hold on; plot(phi(1:N_max),theta_l_3(1:N_max),'-b'); plot(phi(1:N_max),theta_l_4(1:N_max),'--r'); grid on; title('Derivadas 1{^a} dos ângulos {\theta}_3 e {\theta}_4'); xlabel(' {\phi} [rad]'); ylabel(' Derivada [rad/s]'); legend('derivada 1{^a} de {\theta}_3','derivada 1{^a} de {\theta}_4'); hold off; figure(3); hold on; plot(phi(1:N_max),theta_ll_3(1:N_max),'-b'); plot(phi(1:N_max),theta_ll_4(1:N_max),'--r'); grid on; title('Derivadas 2{^a} dos ângulos {\theta}_3 e {\theta}_4'); xlabel(' {\phi} [rad]'); ylabel(' Derivada [rad/s{^2}]'); legend('derivada 2{^a} de {\theta}_3','derivada 2{^a} de {\theta}_4'); hold off; figure(4); hold on; plot(phi(1:N_max),Va(1:N_max),'-b'); plot(phi(1:N_max),Vb(1:N_max),'--r'); plot(phi(1:N_max),Ve(1:N_max),'.m'); grid on; title('Velocidades das Juntas A e B e do Ponto E'); xlabel(' {\phi} [rad]'); ylabel(' Velocidade [m/s]'); legend('Va','Vb','Ve'); hold off; figure(5); hold on; plot(phi(1:N_max),Aa(1:N_max),'-b'); plot(phi(1:N_max),Ab(1:N_max),'--r'); plot(phi(1:N_max),Ae(1:N_max),'.m'); grid on; title('Acelerações das Juntas A e B'); xlabel(' {\phi} [rad]'); ylabel(' Aceleração [m/s{^2}]'); legend('Aa','Ab','Ae'); hold off; figure(6); hold on; plot(phi(1:N_max),Vex(1:N_max),'-b'); plot(phi(1:N_max),Vey(1:N_max),'--r'); grid on; title('Velocidades Vertical e Horizontal do Ponto E'); xlabel(' {\phi} [rad]'); ylabel(' Velocidade [m/s]'); legend('Vel. Horizontal','Vel. Vertical'); hold off; figure(7); hold on; plot(phi(1:N_max),Aex(1:N_max),'-b'); plot(phi(1:N_max),Aey(1:N_max),'--r'); grid on; title('Acelerações Vertical e Horizontal do Ponto E'); xlabel(' {\phi} [rad]'); ylabel(' Aceleração [m/s{^2}]'); legend('Acel. Horizontal','Acel. Vertical'); hold off; % Desenho 3D do Guindaste % ======================= % Cada Barra do Mecanismo 4-barras que forma o guindaste foi simulada % como sendo uma barra de secção circular % figure(8); [x,y,z]=cylinder([1,1],20); [xx,yy,zz]=sphere; for i=1:1:N_max, xmin = -20; xmax = 50; ymin = -20; ymax = 50; zmin = 0; zmax = 70; clf; axis([xmin xmax ymin ymax zmin zmax]); hold on; % Barra O2A x1 = x; y1 = y; z1 = z; x1(2,:) = x1(2,:) + a*cos(phi(i)); z1(1,:) = e; z1(2,:) = e + a*sin(phi(i)); s = mesh(x1,y1,z1); set(s,'FaceColor','blue'); % Barra O4B x2 = x; y2 = y; z2 = z; x2(1,:) = f + x2(1,:); x2(2,:) = f + x2(2,:) + c*cos(theta4(i)); z2(2,:) = c*sin(theta4(i)); s = mesh(x2,y2,z2); set(s,'FaceColor','blue'); % Barra AB x3 = x; y3 = y; z3 = z; x3(1,:) = Ax(i) + x3(1,:); x3(2,:) = Ax(i) + x3(2,:) + L*cos(theta3(i)); z3(1,:) = Ay(i); z3(2,:) = Ay(i) + L*sin(theta3(i)); s = mesh(x3,y3,z3); set(s,'FaceColor','red'); % Detalhe do Cabo do Guindaste plot3([Ex(i); Ex(i)],[0; 0],[Ey(i); Ey(i)-20],'.-k'); % Solo x4=[xmin xmax; xmin xmax]; y4=[ymin ymin; ymax ymax]; z4=[0 0; 0 0]; s=surf(x4,y4,z4,[0.8 0.8 0.8]); set(s,'FaceColor',[127/255 1 122/255]); % Detalhes das Juntas % Junta O2 x5 = xx; y5 = yy; z5 = zz; z5 = z5 + e; s = mesh(x5,y5,z5); set(s,'FaceColor','red'); % Junta O4 x5 = xx; y5 = yy; z5 = zz; x5 = x5 + f; s = mesh(x5,y5,z5); set(s,'FaceColor','red'); % Junta A x5 = xx; y5 = yy; z5 = zz; x5 = x5 + Ax(i); z5 = z5 + Ay(i); s = mesh(x5,y5,z5); set(s,'FaceColor','red'); % Junta B x5 = xx; y5 = yy; z5 = zz; x5 = x5 + Bx(i); z5 = z5 + By(i); s = mesh(x5,y5,z5); set(s,'FaceColor','red'); % Base da Junta O4 x6 = x; y6 = y; z6 = z; x6 = x6*2.5 ; y6 = y6*2.5; z6(2,:) = e; s = mesh(x6,y6,z6); set(s,'FaceColor',[127/255 1 122/255]); % Detalhes de Iluminação light('Position',[1 1 1]); material metal; material([.8 .1 .5]) rotate3d on; view(-14,12); grid on; % Posição Inicial do Cabo plot3([Ex(1); Ex(1)],[0; 0],[Ey(1); Ey(1)-20],'.-r'); pause(0.5); hold off; end