O pacote do ROS eezybotarm para o braço robotico eezybotarm mk1 é um projecto abandonado. O pacote foi substituido pelos seguintes pacotes:
- ebamk1_description;
- ebamk2_description;
- rosarm_control;
O firmware está incluido no pacote rosarm_firmware.
Robots, ROS, Raspberry Pi & MCUs
O pacote do ROS eezybotarm para o braço robotico eezybotarm mk1 é um projecto abandonado. O pacote foi substituido pelos seguintes pacotes:
O firmware está incluido no pacote rosarm_firmware.
O repositório eezybotarm contêm o pacote do ROS eezybotarm para o braço robotico eezybotarm mk1
Projecto abandonado. O pacote foi substituido pelo ebamk1_description.
O pacote ROS ebamk1_description contem a descrição do braço róbótico EezyBotArm MK1.
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.
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:
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:
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]
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
https://github.com/HotBlackRobotics/ntbd
https://hackaday.io/project/157951
https://github.com/IdreesInc/EEZYbotARM-MK2-Cartesian-Coordinates
Os braços robóticos EezyBotArm são uma família de robots manipuladores educativos desenhados com base no robot industrial ABB – IRB 460, pelo italiano Carlo Franciscone.
Até ao momento de escrita deste artigo, esta família já conta com três versões de braços robóticos educativos fáceis de fazer, com instruções e ficheiros stl publicados na Internet.
O mais pequeno, económico, e antigo da família é o EezyBotArm MK1, tem com 3 servos MG90 a mover as hastes e um SG90 a abrir e fechar a garra.
A segunda versão, é o EezyBotArm MK2. Tem com 3 servos MG995 (ou MG946, ou MG966) a mover as hastes e um SG90 a abrir e fechar a garra.
A terceira versão, o EezyBotArm MK3, passou a usar motores de passo (steppers) como actuadores para posicionamento das hastes, e mantém o servo SG90 como actuador para abrir e fechar a garra.
Para além destes braços desenvolvidos por Carlo Franciscone, existe um remix do EezyBotArm MK2, conhecido por Robot Arm MK2 Plus e que foi redesenhado para usar motores de passo Nema 17.
Os braços desta família não são os únicos desenhados com base no IRB 460. Existem várias edições deste modelo cinemático disponíveis como kits comerciais com destaque para os meArm.
Cinemática dos braços eezyBotArm
Para além dos componentes mecânicos e actuadores dos braços
Hardware de controlo dos braços robóticos EezyBotArm
Sofware de controlo dos braços robóticos EezyBotArm
O braço robótico EezyBotArm MK1 é o mais antigo e pequeno da família de robots manipuladores educativos desenhada por Carlo Franciscone.
Os braços robóticos EezyBotArm são de uso didáctico, económicos e facilmente fabricados numa impressora 3D.
O EezyBotArm MK1 que é o mais pequeno e económico da família, destaca-se exactamente pelo seu baixo custo de produção.
Para a impressão e montagem do braço recolhi e publiquei informação em português, incluindo uma lista de materiais actualizada, no artigo sobre como Fazer o braço robótico EezyBotArm MK1.
Veja o seguinte artigo para saber mais sobre a: Cinemática do braço robot eezyBotArm MK1.
O firmware a correr no Arduino integra-se no ROS pelo recurso às bibliotecas rosserial, e, numa primeira fase, para gera o sinal PWM adequado é usada a biblioteca Servo.
Posteriormente o sinal PWM será gerado por um módulo PCA9685, e o firmware necessita de ser alterado.
O arduino mega 2560 deve estar a correr o programa: myServoControl_ntbd.ino, que se encontra disponível no repositório ntdb do github.
O programa requer que a biblioteca ros_lib (rosserial arduino) esteja instalada no Arduino IDE. A biblioteca rosserial pode ser instalada no gestor de bibliotecas disponível no IDE, mas é recomendado usar a biblioteca gerada pelo rosserial-arduino.
Também é obrigatório ter instalados no computador os pacotes do ROS: rosserial e rosserial arduino. Para instalar pode-se usar os seguintes comandos:
sudo apt install ros-melodic-rosserial sudo apt install ros-melodic-rosserial-arduino
Como o programa para o Arduino requer mensagens personalizadas do ROS (ROS custom messages). Ver linha:
#include <ntbd_msgs/Motors_Array.h>
Teremos que efectuar um procedimento especial, que envolve a compilação do pacote de ROS do ntbd que tem as mensagens personalizadas, e assim obter o ficheiro de header necessário.
Para obter o ficheiro Motors_Array.h, é necessário, antes de mais, colocar o respectivo pacote do ROS na pasta adequada do catkin e proceder á sua compilação (também se pode proceder clonagem de todo o repositório postrior compilação):
cd ~/catkin_sw/src git clone https://github.com/HotBlackRobotics/ntbd cd ~/catkin_sw catkin_make
De seguida, tem de se usar um dos seguintes comandos (pelos vistos existe a informação de vários devido à evolução das várias versões do ROS):
No ROS Melodic, o comando que funcionou foi o ultimo dos indicados abaixo.
rosrun rosserial_client make_library.py ~/ ntbd_msgs rosrun rosserial_arduino make_library.py ~/ ntbd_msgs rosrun rosserial_arduino make_libraries.py ~/ ntbd_msgs
~/ representa a pasta de destino onde se encontra a ros_lib (biblioteca rosserial para o arduino)
ntbd_msgs, indica o pacote (com as mensagens) a ser compilado
O comando que usei (o último) gerou uma pasta ros_lib na home com toda a biblioteca do rosserial incluindo uma pasta ntbd_msgs que contem o ficheiro pretendido.
Nesta fase podemos optar por uma das duas soluções:
Nesta fase já podemos compilar e enviar o programa para o Arduino Mega.
Sem alteração da biblioteca a comunicação serial funciona a 57600, por isso é necessário proceder, conforme descrito nos comentários do programa, à alteração a um ficheiro da biblioteca ros_lib.
Versão 1 (original)
Nesta versão é usado apenas o micro-controlador (arduino)
/* NTBD integration with eezybotarm * Servo motors control using rosserial * Author: fiorella.sibona@gmail.com */ #include <Servo.h> #include <ros.h> #include <ntbd_msgs/Motors_Array.h> #define USE_USBCON ros::NodeHandle nh; Servo servo1, servo2, servo3, servo4; // Callback funtion ("as message is read, perform these actions") void servos_cb( const ntbd_msgs::Motors_Array& angles_msg){ servo1.write(angles_msg.data[0]); servo2.write(angles_msg.data[1]); servo3.write(angles_msg.data[2]); servo4.write(angles_msg.data[3]); } // Subscriber node declaration, specifies the topic to which subscribe and the callback funtion ros::Subscriber<ntbd_msgs::Motors_Array> sub("motors", servos_cb); // Arduino setup function void setup(){ nh.initNode(); nh.subscribe(sub); servo1.attach(2); //attach it to pin 2 servo2.attach(3); servo3.attach(4); servo4.attach(5); } // Arduino loop function void loop(){ nh.spinOnce(); delay(1); }
Referencias
http://wiki.ros.org/rosserial_arduino/Tutorials/Adding%20Custom%20Messages
https://medium.com/@Sammy_Hasan/quick-code-v0-3-rosserial-custom-messages-ebdfc7ea172e
Com base no ficheiro URDF que descreve o braço eezybotarm mk1 feito é altura de tentar usar o ROS moveit.
O procedimento descrito abaixo foi efectuado de acordo com as indicações disponiveis em:
No caso de estar a usar o ROS kinetic as indicações estão disponiveis em:
Efectuei vários testes com dois ficheiros URDF diferentes. Um com garra, e outro sem a garra. No processo descrito abaixo, a versão sem garra tem apenas o planning group Arm, com os links de 1 a 3, e não tem o End Efector.
O moveit setup assistant permite criar um pacote do ROS para usar um braço robótico com o Moveit.
O processo começa na execução do Moveit setup assistant com o seguinte comando:
roslaunch moveit_setup_assistant setup_assistant.launch
Escolher o ficheiro URDF que descreve o braço eezyBotArm MK1 e enviar;
Clicar em Generate Colision Matrix;
Clicar em Add Virtual Joint;
No joint name colocar “virtual_joint”;
No child link selecionar “base_link”;
No parent frame name colocar “world”;
No Joint Type selecionar “fixed”;
Clicar em Save;
Criar dois grupos. Um para o braço e outro para a garra.
Clicar em Add Group;
No group name colocar: Arm;
No kinematic solver seleccionar: kdl_kinematics_plugin/KDLKinematicPlugin;
Manter Kin. Search Resolution e Kin. Search Timeout nos valores pré-definidos;
Clicar em Add Joints;
Do lado esquerdo selecionar: Joint_1, Joint_2, Joint_3 e Joint_4 e mover para o lado direito;
Clicar em Save;
Clicar em Add Group;
No group name colocar: Hand;
Não selecionar nada no kinematic solver;
Manter Kin. Search Resolution e Kin. Search Timeout nos valores pré-definidos;
Clicar em Add Joints;
Do lado esquerdo selecionar: Joint_5 e mover para o lado direito;
Clicar em Save;
Clicar em Add pose
Em pose name colocar: Start
Definir os valores apropriados para Joint_1, Joint_2, Joint_3 e Joint_4;
Clicar em Save
Em End Efector Name colocar: Hand
No End Efector Group selecionar: Hand
No Parent Link selecionar: Joint_4
Definir o nome e o email do autor
Escolher o Configuration Package Save Path
Clicar em Browse,
No selector de pastas que se abre, clicar no icone para criar uma nova pasta, e atribuir-lhe o nome: ebamk1_movit_config
Clicar em Generate Package
No final, para sair, clicar em Exit Setup Assistant
De fora desta preparação ficaram as seguintes áreas.
Para visualizar o resultado no rviz usa-se o seguinte comando:
roslaunch ebamk1_moveit_config demo.launch
Durante a processo de aprendizagem fiz vários testes, e acabei por conservar também o primeiro teste ebamk1t1_moveit_config.
O braço robótico EEZYbotARM MK1 foi modelado com base no braço robótico industrial ABB – IRB460.
Este tipo de braço tem uma cadeia cinemática de malha fechada, pelo que não pode ser representado no RViz, sem antes ser convertido num modelo equivalente de malha aberta. Numa malha aberta o modelo tem de ter uma hierarquia em árvore.
A informação sobre a cinemática deste braço robótico está descrita no artigo que avalia o braço eezbotarm MK2.
A criação do ficheiro foi descrita como exemplo de um ficheiro URDF no artigo sobre ficheiros URDF.
Esta descrição do braço robótico eezyBotArm MK1 foi efectuada com base no urdf usado para MK2 no projecto ntbd disponivel no seguinte repositório:
https://github.com/HotBlackRobotics/ntbd
Apesar de ter perdido imensas horas a tentar, não consegui efectuar um ficheiro urdf apropriado com meshes, usando os ficheiros stl disponiveis.
Existem duas versões do ficheiro URDF para o eezbotarm mk1,:
ebamk1b.urdf – versão inicial conforme o projecto ntbd, e abordado no artigo sobre como fazer ficheiros urdf;
ebamk1a.urdf – versão com link representativo da garra, e que foi desenvolvido para a criação de um pacote de configuração para o eezyBotArm MK1 no ROS moveit, com o Moveit Setup Assistant.
Este artigo é sobre a lista de materiais, o fabrico das partes mecânicas e montagem de um braço róbotico MK1.
As informações de base para este projecto estão disponíveis nos seguintes links:
A parte electrónica e o sofware de exploração serão abordados em artigos posteriores
Para além das peças que são produzidas na impressora 3D, este projecto necessita do seguinte material:
Lista de peças a imprimir em 3D efectuar o braço róbotico, incluindo a garra.
Peças adicionais que são apenas usadas na demonstração
A montagem do braço robótico é efectuada em cerca de 5 passos, e divide-se em três conjuntos, a base, as hastes e a garra.
Peças usadas:
Primeiro fixa-se o servo à base (basement), com os parafusos que vêm como acessórios.
De seguida aplica-se o adaptador igual ao da imagem, e encaixa-se na base rotativa (round_plate). Fixa-se com um parafuso adequado(vem nos acessórios?).
Por ultimo aplica-se o suporte das hastes (001) com os dois parafusos M3 x 10mm e as respectivas porcas M3.
Peças usadas
Devido ao numero de peças este passo tem várias fases.
Passo 3: Montagem da garra do braço robótico
Peças usadas:
Passo 4: Montagem das hastes na base do braço robótico
Peças usadas:
Peças usadas: