simulaÇÃo da cinemÁtica inversa de robÔs trr em fortran 90

Post on 24-Jul-2015

103 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

UFBA

UNIVERSIDADE FEDERAL DA BAHIA

SIMULAÇÃO DA CINEMÁTICA INVERSA DE ROBÔS TRR EM

FORTRAN 90

PAULO VINICIUS LISBOA PEREIRA

FILIPE MAROCCI DE ALCANTARA

SALVADOR - BA

JUNHO DE 2012

Introdução

Motivação

Para a consolidação de um setor industrial solido muitos países incentivaram a indústria

a automatizar sua produção. Um dos setores industriais que mais impulsionou o avanço

na tecnologia foi o automobilístico. A necessidade de baratear a produção e torna-la

mais rápida fez com que empresários do setor e governantes injetassem recursos

humanos e financeiros com pesquisa e desenvolvimento de sistemas mais eficazes para

a produção neste setor.

Tendo em vista esta conjuntura descreveremos a aplicação de algumas destas

tecnologias na área de computação.

Objetivos

Este trabalho possui como objeto geral a utilização da linguagem Fortran 90 para

calculo da cinemática inversa de manipuladores robóticos com a primeira junta

torcional, junta da base, e segunda e terceira junta rotacional (TRR).

Objetivos específicos

Sabendo-se da necessidade de manipulares robóticos em ambientes confinados. Este

trabalho visa à especificação da trajetória que o órgão terminal ira descrever.

Desenvolveremos a trajetória retilínea do órgão terminal e explanaremos a possibilidade

de trajetória mais complexas como curvas lisas, curvas que não se cruzam, através da

parametrização de suas coordenadas.

A cinemática do manipulador TRR

será descrita por uma via mais

intuitiva. Este trabalho não fará

menções a uma descrição algébrica

com o artifício da mudança de base

ou das transformações lineares. Mas

sim, relacionará a cinemática do

manipulador por um viés

geométrico. Esta representação é

mais didática, contudo perde com

relação à algébrica quando tratamos

de manipuladores mais complexos,

manipuladores que possuam maiores graus de liberdade.

Desenvolvimento

Cinemática de manipuladores

A cinemática descreve os movimentos dos corpos sem levar em conta as forças que

geraram estes movimentos. Em manipuladores robóticos esta irá descrever a posição e a

velocidade do seu órgão efetuador e dos seus ligamentos. A posição do órgão terminal

de um manipulador depende dos deslocamentos angulares de suas juntas. Dividimos a

cinemática de manipuladores em cinemática direta e inversa.

De maneira geral, com a cinemática direta de um manipulador robótico se obtém,

através dos ângulos das juntas, a posição do órgão terminal deste manipulador com

relação a um sistema de coordenadas cartesianas, que comumente possui o eixo de

intersecção das abscissas, das ordenas e das contas encontra-se na sua base. A

cinemática direta é pouco intuitiva para o planejamento de trajetórias, muitas vezes

demasiadas complexas, possivelmente até impossíveis para este fim. Uma possível

solução para este problema seria a possibilidade de trabalhar com coordenadas

cartesianas, forma mais intuitiva de planejar trajetórias. Porém, haveria uma

necessidade de relaciona-las com os ângulos das juntas para um possível controle do

manipulador. Tem-se em mente que o controle é possível apenas com a posição angular

das juntas. Resolvendo o problema da cinemática inversa, ou seja, obtenção das

coordenadas angulares através das coordenadas cartesianas pode-se planejar as

trajetórias de forma mais intuitiva e usa-las como fator de conversão para obter as

coordenadas angulares.

Cinemática direta aplicada ao manipulador TRR.

Definimos como d = a2 cos θ2 + a3 cos(θ2 + θ3) , a projeção

dos elos 2 e 3 sobre o plano xy. Então respectivamente o

seno e o cosseno do ângulo da junta torcidal são as

componentes x e y do órgão terminal.

X = d cos θ1= [a2 cos θ2 + a3 cos(θ2 + θ3 )]cos θ1

Y = d sen θ1= [a2 cos θ2 + a3 cos(θ2 + θ3 )] senθ1

Z = a1 + a2 sen θ2 + a3 sen (θ2+ θ3)

Cinemática inversa aplicada ao manipular TRR

Podemos encontrar a expressão para encontrar o ângulo da

segunda junta rotacional aplicando a lei dos cossenos para o

triângulo formado pelo centro da junta 1, chamada de R na

figura, o centro da junta 2, ponto S, e o ponto P, ponto onde

fica situado órgão terminal do robô. Definimos a distância r como √ . Dai

tiramos que:

[ ]

+2 cos[θ3 ]

Por consequência temos:

θ3 [

]

Para o ângulo da primeira junta rotacional vamos definir dois ângulos que facilitaram o

seu calculo. Temos o ângulo formado pela tangente da diferença do primeiro elo com a

hipotenusa r. Assim definimos:

Como √ , temos:

Definimos o segundo ângulo auxiliar como:

Podendo ser mais facilmente visualizado na imagem no inicio da pagina. Ainda com o

auxilio da imagem acima definimos o ângulo da primeira

junta rotacional como:

O ângulo da junta torcidal é definido como o arco, cuja

tangente é a coordenada Y sobre X. Matematicamente,

temos:

1=

Conclusão

A utilização de um software é de vital importância para um controle dinâmico e em

tempo ótimo de um manipulador robótico. A linguagem de programação Fortran

atendeu a tal propósito devido a suas infinidades de funções, que facilitaram a conclusão

do trabalho.

Anexo

!

! Definindo as constantes que são usadas no programa e nas subrotinas.

!

module constantes

implicit none

save

real :: Pi=14159

end module constantes

!

program control_rob

!

! Receber valores das coordenadas cartesianas e retornar com os angulos das juntas.

! Simular uma tragetória proxima a uma reta através de variações infinitesimais dos

parametros.

!

! Primeira parte - declaração de variaveis

!

implicit none

real :: posx,posy,posz,ang_tor,ang_rot1,ang_rot2,incr,pas_motor

real:: t

real,dimension (6):: pos

real,dimension (3):: elo

!

!______________________________________________________________________

_____________

! Segunda parte - Definição de parametros. Ler os valores iniciais e finais.

!

25 write (*,*) "Informe o tamanho dos elos em centimetros."

write (*,*) " Como no exemplo digite o valor do elo um, dois e tres separado por

espaço em branco."

write (*,*) " Exemplo: val01 val02 val03"

read (*,*,err=25)elo

29 write (*,*) "Informe em radianos o passo do motor"

read (*,*,err=29)pas_motor

!

32 write (*,*) "Informe os valores iniciais e em seguida os valores finais das

coordenadas x,y e z."

write (*,*) " Como no exemplo: 99 99 99 99 99 99."

read (*,*, err=32)pos

!______________________________________________________________________

_____________

!

! Terceira parte - controle da tragetória, determinação dos angulos.

! Criar matriz para quardar resultados.

!

call f_incr (incr,pas_motor,elo(1),elo(2),elo(3))

!

t=0

!

! Laço para calcular a reta paramétrica,

! a cinematica inversa e alocar o resultado na matriz.

!

do while(t<=1)

!

! Chamar subrotina parametric

call parametric(pos(1),pos(2),pos(3),pos(4),pos(5),pos(6),posx,posy,posz,t)

! Chamar a surotina cinematc

call calc_cinemat(posx,posy,posz,elo(1),elo(2),elo(3),ang_tor,ang_rot1,ang_rot2)

write(*,*)"angulo tocidal: ",ang_tor

write(*,*)"angulo rotacional 1: ",ang_rot1

write(*,*)"angulo rotacional 2: ",ang_rot2

!

! Atualizar parametro t

!

t=t+incr

end do

stop

end program control_rob

!

! Função incremento - O valor do incremento esta relacionado com o passo do motor.

Temos que ter em vista que

! variações de angulos menores que o passo do

motor não desempenham melhora na precisão do

! movimento, apenas criam um maior custo

computacional.

!

SUBROUTINE f_incr (incr,pas_mot,elo1,elo2,elo3)

use constantes

real,intent(in) :: elo1,elo2,elo3

real,intent(out) :: incr

real :: del_xy,del_z

!

! A minima variação se dá quando ha o movimento do angulo mais proximo da

extremidade.

! Atribuimos a variavel incr a menor variação.

!

del_xy=(elo2+elo3)-(elo2+elo3*Cos(pas_mot))

del_z=(elo1+elo2+elo3)-(elo1+elo2+elo3*Sin((Pi/2)-pas_mot))

!

incr=min(del_xy,del_z)

return

end subroutine f_incr

!

! Subrotina retas parametricas

!

SUBROUTINE

parametric(posx_in,posy_in,posz_in,posx_fin,posy_fin,posz_fin,posx_par,posy_par,pos

z_par,t)

real,intent(in):: posx_in,posy_in,posz_in,posx_fin,posy_fin,posz_fin

real,intent(out)::posx_par,posy_par,posz_par

real,intent(inout):: t

!

!

posx_par= posx_in+t*(posx_fin - posx_in)

!

posy_par= posy_in+t*(posy_fin - posy_in)

!

posz_par= posz_in+t*(posz_fin - posz_in)

return

END SUBROUTINE parametric

!

! Subrotina para calcular a cinemática inversa.

!

SUBROUTINE

calc_cinemat(posx_par,posy_par,posz_par,elo1,elo2,elo3,ang_tor,ang_rot1,ang_rot2)

real,intent(in) :: posx_par,posy_par,posz_par,elo1,elo2,elo3

real,intent(out) :: ang_tor,ang_rot1,ang_rot2

real :: alfa,beta

!

!

ang_tor = atan(posy_par/posx_par)

!

ang_rot2 = acos(((posx_par**2)+(posy_par**2)+((posz_par - elo1)**2)-(elo2**2)-

(elo3**2))/(2*elo1*elo2))

!

alfa= atan((posz_par-elo1)/(sqrt((posx_par**2)+(posy_par**2))))

beta= atan(elo3*sin(ang_rot2)/( elo2 + elo3*cos(ang_rot2)))

!

ang_rot1 = alfa - beta

return

END SUBROUTINE calc_cinemat

top related