Cinemática dos braços róboticos eezyBotArm

A cadeia cinemática dos braços robóticos eezyBotArm, adoptada dos robots manipuladores industriais ABB-IRB460, é baseada em três actuadores, uma base rotativa e duas hastes em T. Uma das quais controlada directamente e outra de forma indirecta. A este sistema principal de duas hastes, está associado um outro sistema de hastes (no modelo 3D mais abaixo estão a roxo) cujo propósito é garantir a horizontalidade da aplicação da garra.

Todos os robots que seguem este modelo tem uma cadeia cinemática semelhante e todas as descrições, fórmulas,  e cálculos aqui apresentados, que foram efectuados com base no eezyBotArm MK2, com uma escala de 7 para 1 face ao ABB-IRB460, aplicam-se a outros braços robóticos, como o eezyBotArm MK1 e o eezyBotArm MK3, com as devidas adequações nos parâmetros usados.

Acção dos actuadores nos braços robóticos eezyBotArm

Um actuador colocado na base e que roda o suporte das hastes segundo o eixo do z (vertical com o plano) e controla o posicionamento da garra no eixo do y, conforme video abaixo.

Um actuador que está acoplado ao braço principal, a azul no video, cujo eixo de rotação se encontra na sua extremidade inferior e controla o posicionamento da garra no eixo do x dentro de uma trajectória inscrita na circunferência do seu raio, conforme video abaixo.

Um ultimo actuador está acoplado indirectamente, por meio de duas hastes intermédias,  à extremidade traseira do braço horizontal, a vermelho no video, que roda sobre o eixo na extremidade superior do braço principal e controla o posicionamento da garra no eixo do z dentro de uma trajectória inscrita na circunferência do seu raio, conforme video abaixo.

Esta haste horizontal é actuada por intermédio de duas outras hastes, a verde na imagem abaixo, que conduzem o movimento do servo.

Quando o actuador na haste A, roda para baixo (no caso de um servo quando o ângulo se move para zero), conjunto das hastes verdes desce, puxando para baixo a parte de traz da haste horizontal (ponto t), que devido ao seu eixo de rotação (ponto c), faz subir a sua parte da frente (ponto h).

Os movimentos da haste principal, a azul, em torno do ponto A e da haste horizontal, a amarelo, em torno do ponto c definem a posição do ponto h face aos eixos x e z, ou seja a distancia da projecção de de h para A, e a altura do ponto h.

A amplitude dos movimentos deste tipo de robots está condicionado pela amplitude de rotação dos motores, das engrenagens que eventualmente estejam envolvidas e das colisões que se possam verificar.

No caso do braço robóticos eezyBotArm MK2, os limites são impostos pelos:

  • Servos de 180º de amplitude de rotação;
  • Carretos envolvidos na rotação sobre o eixo z, um principal (movido pelo servo 0) com 25 dentes e o segundo com 50 dentes, o que faz com que o movimento de rotação sobre esse eixo tenha apenas 90º de amplitude;
  • Colisões entre a haste horizontal (servo 2) e a haste principal (servo 1) que implica que os servos que as movimentam têm respectivamente os seguintes limites: 60º entre os 45º e os 105º (servo 2), e 90º entre os 55º e os 145º (servo 1).

Cálculo da cinemática inversa no eezyBotArm

A cinemática inversa refere-se ao cálculo dos ângulos adequados aos diversos eixos accionados por actuadores de modo a que o ponto de acção do braço (end effector)  se posicione num ponto especifico do espaço.

Dado um determinado ponto a (ver figura mais abaixo) com as coordenadas x, y e z relativamente à origem que para facilitar consideramos estar no centro de rotação do robot a uma altura L (no eixo dos z), o calculo da cinemática inversa envolve a conversão das coordenadas cartesianas, desse ponto, em coordenadas cilíndricas e a partir delas extrair o ângulo desejado para cada um dos três actuadores.

https://pt.wikipedia.org/wiki/Coordenadas_cil%C3%ADndricas

Os cálculos são efectuados nas seguintes fases.

Primeira fase. Conversão das coordenadas cartesianas em coordenadas cilíndricas.

Nestas coordenadas, o ângulo theta é expresso em radiano e o z mantém-se cartesiano. Por isso temos:

  • theta = atan(y/x)
  • raio = srt(x*x + y*y)
  • z = z

O theta é o ângulo que se relacionada com o motor 0,  e define a rotação em torno do eixo dos z, que antes de ser transformado em graus para ser aplicado ao motor sofre a seguinte alteração:

Ângulo do motor 0 = 2 * theta + pi / 2

Numa segunda e terceira fases, efectuam-se os cálculos dos outros dois motores, que me conjunto são responsáveis pelo posicionamento nos eixos do x e do y.

Para calcular os ângulos teremos que considerar a aplicação da lei dos cossenos.

https://pt.wikipedia.org/wiki/Lei_dos_cossenos

Consideremos o terceiro caso:

c*c = a*a + b*b – 2 * a * b * cos C

Resolvemos em ordem a cos C

c*c = a*a + b*b – 2 * a * b * cos C  é equivalente a

0 = a*a + b*b – c*c – 2 * a * b * cos C é equivalente a

2 * a * b * cos C = a*a + b*b – c*c é equivalente a

cos C = (a*a + b*b – c*c) / (2 * a * b) é equivalente a

ângulo C = acos((a*a + b*b – c*c) / (2 * a * b)) a

Com base na definição de pontos expressa na imagem anterior, consideremos na aplicação da formula acima e na seguinte que:

a = L2 = distancia entre os pontos be, b = sqrt(), e c = L3 = distancia entre os pontos ef

Ângulo do motor M1 = atan(z / raio) + leicossenos(L2, sqrt(raio*raio + z*z), L3)

Pela aplicação

Ângulo do motor M2 = pi – (M1 + leicossenos(L2, L3, sqrt(raio*raio + z*z)) – pi/2)

Os ângulos calculados acima estão expresso em radiano. Antes de serem aplicados aos motores tem de ser convertidos em graus.

Abaixo segue o bloco de código em python que calcula a cinemática inversa nos braços eezyBotArm

L1 = 94
L2 = 150 
L3 = 150 
#Hipotenusa:
def hipo(x,y):
    return math.sqrt(x*x + y*y)
#Cosines law:
def lawOfCosines(a,b,c):
    rate = (a*a + b*b - c*c) / (2 * a * b)
    if abs(rate) > 1:
        if max(rate,0) == 0:
            rate = -1
        if max(rate,0) == rate:
            rate = 1
    return math.acos(rate)

def deg(rad):
    return rad * 180 / math.pi

# Posição em coordenadas cartesianas
cartP = {'xEE': x, 'yEE': y, 'zEE': z}
# Posição em coordenadas cilindricas
cylP = {'theta': math.atan(cartP['yEE']/cartP['xEE']), 'r':hipo(cartP['xEE'], cartP['yEE']), 'zhat':cartP['zEE']-L1}
zhat = cylP['zhat']
rho = hipo(cylP['r'], zhat)
# Ângulos calculados em radiano
M1 = 2*cylP['theta'] + math.pi/2
M2 = math.atan(zhat/cylP['r']) + lawOfCosines(L2,rho,L3)
M3 = M2 + lawOfCosines(L2,L3,rho) - math.pi/2
# Ajustes
angles = [M1,math.pi - M2,M3]
# Conversão dos angulos para graus
angles = [deg(angle) for angle in angles]

 

Cálculo da cinemática directa no eezyBotArm

A cinemática directa refere-se ao do ponto especifico no espaço onde se posiciona elemento de acção do braço (end effector), dados os ângulos adequados aos diversos eixos accionados por actuadores.

Neste caso, os cálculos não o inverso do aplicado acima, e passam por determinar as coordenadas cartesianas em função do calculo da coordenada cilíndrica tendo em conta os angulos dos actuadores e os parâmetros físicos do braço.

Abaixo segue o bloco de código em python que calcula a cinemática directa nos braços eezyBotArm

L1 = distancia entre o ponto b e a superfície onde assenta o braço, L2 = distancia entre os pontos be,  L3 = distancia entre os pontos ef.

# conversão dos angulos para radianos:
angles = [joint*math.pi/180 for joint in joints.data]
# cálculo intermédio para a conversão para as coordenadas cartesianas
r = L2*math.cos(math.pi - angles[1]) + L3*math.cos(angles[2]-math.pi/2) 
# Posição do ponto expresso em coordenadas cartesianas:
x = r*math.cos((angles[0]-math.pi/2)/2)
y = r*math.sin((angles[0]-math.pi/2)/2)
z = L2*math.sin(math.pi - angles[1]) + L3*math.sin(angles[2]-math.pi/2) + L

 

Folha de cálculo para a cinemática directa:

https://docs.google.com/spreadsheets/d/1DB-M-31lVDcXrwiRjAp6iKgvtpz-O-wC2fAOD7AwXrc/edit?usp=sharing

 

Fontes

https://github.com/HotBlackRobotics/ntbd

https://hackaday.io/project/157951

https://github.com/IdreesInc/EEZYbotARM-MK2-Cartesian-Coordinates