NTBD Arduino Firmware

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:

  • Copiar a pasta ~/ros_lib/ntbd_msgs para ~/Arduino/libraries/ros_lib;
  • Copiar a pasta para dentro da pasta do sketch do arduino, e alterar uma linha de include para passar a incluir a biblioteca localmente: #include “ntbd_msgs/Motors_Array.h”

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.

myServoControl_ntbd.ino

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

eezybotarm mk2 ntbd ros docker

Exploração do eezybotarm mk2 recorrendo a docker containers com os pacotes para o ROS do projecto ntbd docker.

O microcontrolador (Arduino Mega 2560)  tem que estar a correr um programa (firmware) desenhado para o efeito,  que usa a bibloteca Servo, para geral o sinal PWM adequado, e que se integra no ROS pelo recurso ao pacote rosserial e rosserial-arduino.

Saiba mais sobre o Firmware de Arduino para controlo de Servos em ROS.

Esta exploração foi efectuada com base nas informaçoes disponveis no  artigo do seguinte endereço:

https://hotblackrobotics.github.io/en/blog/2018/01/17/ntbd-guide-part-I/

Se não estiver instalado, começamos por instalar o docker com o seguinte comando:

sudo apt install docker docker.io
sudo apt install docker-compose

Testar o docker com o seguinte comando:

sudo docker run hello-world

Conforme as instruções disponiveis a partir do ponto 4 do artigo referido acima.

Instalar as duas imagens do docker que são necessárias com os seguintes comandos:

sudo docker pull hbrobotics/ntbd_base:intel
sudo docker pull hbrobotics/ntbd_manipulator:intel

Existem imagens para o Raspberry Pi 3, para as usar basta substituir o :intel por :rpi3.

Nota suplementar a explorar, no docker hub  existem imagens do ROS para o docker que merecem atenção.

https://hub.docker.com/u/hbrobotics/

Além disso  estão disponíveis os ficheiros que permitem fazer os docker containers no seguinte repositório:

https://github.com/HotBlackRobotics/docker-ros-base

Para executar o dois contentores (imagens) de docker devemos executar o seguinte comando:

sudo docker-compose -f docker-compose.hbr_ntbd_intel.yml up

Para o Raspberry Pi 3 usar o ficheiro docker-compose.hbr_ntbd_rpi3.yml

A primeira execução produziu as seguintes mensagens no terminal

Creating hbr_ntbd_manipulator_intel ... 
Creating hbr_ntbd_manipulator_intel ... done
Attaching to hbr_ntbd_manipulator_intel
hbr_ntbd_manipulator_intel | * Starting nginx nginx
hbr_ntbd_manipulator_intel | ...done.
hbr_ntbd_manipulator_intel | [ERROR] [1586442600.408287]: Error opening serial: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'
hbr_ntbd_manipulator_intel | the rosdep view is empty: call 'sudo rosdep init' and 'rosdep update'

A mensagem que mais me chamou a atenção foi a que refere o erro na abertura da porta serie: /dev/ttyACM0 (esta porta serie não existe, mas sim a ttyUSB0).

Um dos problemas potenciais é a porta não ter permissões. Pelo que o primeiro passo é verificar e atribuir as permissões correctas. Mas duvido que seja um problema pois o container está a correr como root.

Experimentei as seguintes possibilidades (três) para solucionar este erro, só o ultimo funcionou adequadamente:

  • Alterar o mapeamento do device entre o host e o container no ficheiro docker-compose.hbr_ntbd_intel.yml não funcionou.
  • Criar o link simbólico (ln -s /dev/ttyUSB0 /dev/ttyACM0)
  • Alterar o ficheiro NTBD_launch.launch dentro do docker container de modo a que a porta a  usar seja a /dev/ttyUSB0, assim como trocar o baud rate para 57600 (ver mais abaixo o procedimento).

Depois de executar a alteração do ficheiro NTBD_launch.launch voltei a executar o comando do docker compose e o programa funcionou bem.

No raspberry pi 3 também funciona bem dentro do docker com excepção de um problema de visualização já que a imagem fica invertida no plano (de cabeça para baixo) conforme se pode ver na imagem principal do artigo.

Exemplo de utilização dos docker containers do ntbd num raspberry pi 3 apenas para efeitos de visualização.

Alteração do ficheiro launch no container

Com os containers do projecto ntbd a serem executados, correr o seguinte comando para obter o id do container.

sudo docker ps

Usar os primeiros digitos do CONTAINER ID correspondentes ao container do ntbd e lançar uma shell no container com o seguinte comando:

sudo docker exec -it ctnid /bin/bash

Este comando devolve uma prompt no interior do container, pelo que o passo seguinte é instalar o nano, para o usar na alteração do ficheiro launch.

apt install nano

De seguida executamos o nano para alterar o ficheiro com o comando:

nano /catkin_ws/src/ntbd_core/launch/NTBD_launch.launch

Trocamos a porta e o baud rate, para ttyUSB0 e 57600, e gravamos o ficheiro e saimos da shell.

 <arg name="baud" default="115200"/>
<arg name="port" default="/dev/ttyACM0"/>

Posteriormente reiniciamos o container com o comando:

docker restart ctnid

Para mim tive que sair e voltar a entrar mais uma vez, para funcionar.

informação de alteração do container disponivel no seguinte endereço:

How to edit files within docker containers

Joystick no ROS

http://wiki.ros.org/joy/Tutorials/ConfiguringALinuxJoystick

# instalar software
sudo apt-get install ros-melodic-joy

# ligar o joystick e verificar se aparece o jsX ex. js0 ou js1
ls /dev/input/

# testar o joystick
sudo jstest /dev/input/js0

# verificar as permissões
ls -l /dev/input/js0

# dar permissões
sudo chmod a+rw /dev/input/js0

# rosmaster
roscore &

# configurar o joystick no parameter server do ROS
rosparam set joy_node/dev “/dev/input/js0”

# Correr o node
rosrun joy joy_node

# Verificar o ROS topic
rostopic echo joy

 

Instalar nodes de teleop (twist msg)

sudo apt install ros-noetic-teleop-tools

  • key_teleop
  • joy_teleop
  • mouse_teleop

Instalar um node de joystick teleop (twist msg)

sudo apt install ros-noetic-teleop-twist-joy

Mais informação em:

http://wiki.ros.org/teleop_twist_joy

Programar um node de joystick teleop (twist msg)

http://wiki.ros.org/joy/Tutorials/WritingTeleopNode

end

ROS moveit tutorial

Existem tutoriais diferentes conforme a versão do ROS que temos instalado, Kinetic ou Melodic, e que  se encontram disponiveis nos seguintes endereços (respectivamente):

  • http://docs.ros.org/kinetic/api/moveit_tutorials/html/index.html
  • http://docs.ros.org/melodic/api/moveit_tutorials/html/index.html

No meu caso vou seguir os tutoriais para o ROS Melodic.

O primeiro tutorial é Getting Started disponivel no seguinte endereço:

http://docs.ros.org/melodic/api/moveit_tutorials/html/doc/getting_started/getting_started.html

Este tutorial tem informações em como actualizar o ROS e instalar o moveit.

Primeiro, actualizar o sistema e instalar software

# actualizar o sistema
rosdep update
sudo apt-get update
sudo apt-get upgrade

# instalar moveit e requisitos básicos
sudo apt-get install ros-melodic-catkin python-catkin-tools
sudo apt install ros-melodic-moveit

Segundo, criar um Catkin Workspace e preparar o software de exemplo

mkdir -p ~/ws_moveit/src
cd ~/ws_moveit/src
git clone https://github.com/ros-planning/moveit_tutorials.git -b melodic-devel
git clone https://github.com/ros-planning/panda_moveit_config.git -b melodic-devel

Terceiro, obter as dependências para os pacotes instalados

cd ~/ws_moveit/src
rosdep install -y --from-paths . --ignore-src --rosdistro melodic

Quarto, configurar o catkin workspace:

cd ~/ws_moveit
catkin config --extend /opt/ros/${ROS_DISTRO} --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin build

Quinto, declarar o Source do catkin workspace:

source ~/ws_moveit/devel/setup.bash

Opcionalmente pode ser efectuado a execução automática ao adicionar a linha acima ao .bashrc, executando o seguinte comando:

echo 'source ~/ws_moveit/devel/setup.bash' >> ~/.bashrc

 


 

Depois de instalado o ROS moveit e o software de exemplo, está na hora de abordar o plugin de planeamento do movimento para o RViz.

As informações detalhadas em como proceder estão disponiveis no seguinte endereço:

http://docs.ros.org/melodic/api/moveit_tutorials/html/doc/quickstart_in_rviz/quickstart_in_rviz_tutorial.html

roslaunch panda_moveit_config demo.launch rviz_tutorial:=true

Nos displays adicionar os seguintes plugins:

  • MotionPlanning
  • PlanningScene
  • Trajectory

O display principal para explorarmos um braço robótico no moveit e rviz é o MotionPlanning

Nota sobre a compilação e o efeito no path quando usamos o workspace ws_moveit. Após a compilação ser exectuada deveremos fazer a source do setup.bash outra vez. Caso contrario o ROS não encontra os pacotes compilados neste workspace. Exemplo completo nos seguintes comandos:

cd ~/ws_moveit
catkin build
source devel/setup.bash

Nota sobre o uso do joint_state_publisher_gui no rviz. Quando se usa o moveit, o interface deixa de aparecer no rviz, mesmo quando já se deixou de usar o moveit. Por outro lado, o launch file deve ser actualizado de modo a lançar directametent o joint_state_publisher_gui, caso contrario recebemos o seguitne aviso:

The ‘use_gui’ parameter was specified, which is deprecated. We’ll attempt to find and run the GUI, but if this fails you should install the ‘joint_state_publisher_gui’ package instead and run that. This backwards compatibility option will be removed in Noetic.

 

EEZYbotARM MK1 ROS moveit

 

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:

  • http://docs.ros.org/melodic/api/moveit_tutorials/html/doc/setup_assistant/setup_assistant_tutorial.html

No caso de estar a usar o ROS kinetic as indicações estão disponiveis em:

  • http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/setup_assistant/setup_assistant_tutorial.html

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 criar uma nova configuração para o moveit

Escolher o ficheiro URDF que descreve o braço eezyBotArm MK1 e enviar;

Clicar em Self Colisions

Clicar em Generate Colision Matrix;

Clicar em Virtual Joints

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;

Clicar em Planning Groups

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 Robot Poses

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

Clicar em End Efector

Em End Efector Name colocar: Hand

No End Efector Group selecionar: Hand

No Parent Link selecionar: Joint_4

Clicar em Author Information

Definir o nome e o email do autor

Clicar em Configuration Files

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.

  • Passive Joints
  • ROS Control
  • Simulation
  • 3D perception

 

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.

 

EEZYbotARM MK1 URDF

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.

Esquema do braço robotótico eezybotarm (equivalente malha aberta)

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.

 

URDF

A expressão URDF  é um acrónimo de Unified Robot Description Format, ou seja, em português um Formato Unificado para Descrição de Robot.

Os ficheiros URDF são expressos em formato XLM, e são compostos fundamentalmente por etiquetas Link, que descrevem os seus componentes  mecanicos e etiquetas Joint, que descrevem como os diversos Links se relacionam.

Informações básicas sobre o URDF no wiki do ROS

  • http://wiki.ros.org/urdf
  • http://wiki.ros.org/urdf/XML
  • http://wiki.ros.org/urdf/Tutorials

Preparar pacote do ROS

Antes de avançar na exposição da estrutura e formato dos ficheiros URDF devemos preparar uma pacote do ROS para conter os ficheiros que vamos usar.

cd ~/catkin_ws/src
catkin_create_pkg description_tutorial std_msgs rospy roscpp rviz controller_manager gazebo_ros joint_state_publisher robot_state_publisher 
rosdep install -y --from-paths . --ignore-src --rosdistro kinetic
cd description_tutorial/
mkdir launch
mkdir urdf
cd ~/catkin_ws/
catkin_make

nano launch/display1.launch

<launch>
<arg name="model" default="robot1.urdf" />
<arg name="gui" default="True" />

<param name="robot_description" textfile="$(find description_tutorial)/urdf/$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>

<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find description_tutorial)/robot1.rviz" required="true" />
</launch>

Para executar a visualização de um robot descrito num ficheiro urdf, usar o seguinte comando:

roslaunch description_tutorial display1.launch model:=urdf/robot1.urdf

Anatomia de um ficheiro URDF

Um ficheiro URFD é composto por etiquetas no formato tipico do XML, seguindo uma hierarquia especifica.

  • robot
    • link name=”link_1″
      • inertial
        • origin xyz=”0 0 0″ rpy=”0 0 0″
        • mass value=”1″
        • inertia ixx=”100″ ixy=”0″ ixz=”0″ iyy=”100″ iyz=”0″ izz=”100″
      • visual
        • origin xyz=”0 0 0″ rpy=”0 0 0″
        • geometry
          • [box, cylinder, sphere, mesh]
        • material
          • color rgba=”1 0 0 1.0″
          • texture
      • collision
        • origin xyz=”0 0 0″ rpy=”0 0 0″
        • geometry
          • [box, cylinder, sphere]
    • joint name=”joint_1″ type=”floating”
      • parent link=”link_1″
      • child link=”link_2″
      • origin xyz=”0 0 0″ rpy=”0 0 0″
      • axis xyz=”0 0 1″
      • calibration rising =”0.0″ falling=”0.0″
      • dynamics damping=”0.0″ friction=”0.0″
      • limit effort=”30″ velocity=”1.0″ lower=”-2.2″ upper=”0.7″
      • safety_controller k_velocity=”10″ k_position=”15″ soft_lower_limit=”-2.0″ soft_upper_limit=”0.5″

Passemos a exemplos de ficheiros URDF onde se faz uso das etiquetas indicadas acima.

Tomemos como objecto de exemplo o braço róbotico eezyBotArm MK1, que por ter uma cadeia cinamática em malha fechada, iremos usar a cadeia cinemática equivalente em malha aberta.

Esquema de um braço robótico eezBotArm Mk1

Tamanhos em milimeteros

AC = 32
AB = 70
CQ = 35
DE = 34
DF = 34
FG = 17
GH = 80
IJ = 1
JK = 95
NO = 1
OP = 127
LH = 79
HM = 35

Comecemos pela base, que será representada por um cilindro que na figura acima está definido pelos A, B, C e está fixo ao mundo de forma imutavel.

nano ~/catkin_ws/src/description_tutorial/urdf/robot1.urdf

<?xml version="1.0"?>
<robot name="robot1">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.032" radius="0.035"/>
</geometry>
<material name="blue"/>
</visual>
</link>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</robot>

 

Como se pode ver na imagem o cilindro é representado afundado até meia altura no plano de representação. Isto acontece porque nos objectos do tipo: box, cylinder, e sphere, a origem é no centro do objecto.

Para dispormos adequadamente o objecto teremos de indicar o deslocamento da origem. Para o efeito colocamos o valor z da origem do visual do link em 0.016.

nano ~/catkin_ws/src/description_tutorial/urdf/robot1.urdf

<?xml version="1.0"?>
<robot name="robot1">
<link name="base_link">
<visual>
<origin xyz="0 0 0.016" rpy="0 0 0" />
<geometry>
<cylinder length="0.032" radius="0.035"/>
</geometry>
<material name="blue"/>
</visual>
</link>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</robot>

 

A seguir passemos ao segundo objecto, definido pelos pontos D, E e F, é do tipo box e roda sobre o eixo z no ponto Q.

Para definirmos outro objecto (link) temos também de definir a ligação entre eles (joint).

nano ~/catkin_ws/src/description_tutorial/urdf/robot1.urdf

 

<?xml version="1.0"?>
<robot name="robot1">
<link name="base_link">
<visual>
<origin xyz="0 0 0.016" rpy="0 0 0" />
<geometry>
<cylinder length="0.032" radius="0.035"/>
</geometry>
<material name="blue"/>
</visual>
</link>

<joint
name="joint_1"
type="revolute">
<origin xyz="0 0 0" rpy="0 0 0" />
<parent link="base_link" />
<child link="link_1" />
<axis xyz="0 0 1" />
<limit
effort="0"
velocity="0"
lower="-0.7854" upper="0.7854"/>
<!-- [-45,45]-->
</joint>

<link name="link_1">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.01 0.034 0.034" />
</geometry>
<material name="blue" />
</visual>
</link>

<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</robot>

Pelas imagens podemos verificar que a posicão do objecto não é adequada. O seu centro fica sobre a origem do link anterior. Para resolver a situação deslocamos a origem do joint para a soma da altura da base, mas metade da altura do novo objecto.

 <joint
name="joint_1"
type="revolute">
<origin xyz="0 0 0.049" rpy="0 0 0" />
<parent link="base_link" />
<child link="link_1" />
<axis xyz="0 0 1" />
<limit
effort="0"
velocity="0"
lower="-0.7854" upper="0.7854"/>
<!-- [-45,45]-->
</joint>

Após esta correção a apresentação fica conforme desejado.

A seguir passemos ao terceiro objecto, a haste vertical definida pelos pontos I, J e K, do tipo box e roda sobre o eixo x no ponto G.

Mais uma vez, para definirmos outro objecto (link) temos também de definir a ligação entre eles (joint).  Aproveitamos também para redefinir a cor da box do link_1, para vermelho.

nano ~/catkin_ws/src/description_tutorial/urdf/robot1.urdf

<?xml version="1.0"?>
<robot name="robot1">
<link name="base_link">
<visual>
<origin xyz="0 0 0.016" rpy="0 0 0" />
<geometry>
<cylinder length="0.032" radius="0.035"/>
</geometry>
<material name="blue"/>
</visual>
</link>

<joint
name="joint_1"
type="revolute">
<origin xyz="0 0 0.049" rpy="0 0 0" />
<parent link="base_link" />
<child link="link_1" />
<axis xyz="0 0 1" />
<limit
effort="0"
velocity="0"
lower="-0.7854" upper="0.7854"/>
<!-- [-45,45]-->
</joint>

<link name="link_1">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.01 0.034 0.034" />
</geometry>
<material name="red" />
</visual>
</link>

<joint name="joint_2" type="revolute">
<origin xyz="0 0 0" rpy="0 0 0" />
<parent link="link_1" />
<child link="link_2" />
<axis xyz="1 0 0" />
<limit
effort="0"
velocity="0"
lower="-0.6109" upper="0.9599"/>
<!-- [-35,55]-->
</joint>

<link name="link_2">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.01 0.01 0.08" />
</geometry>
<material name="blue" />
</visual>
</link>

<material name="red">
<color rgba="1 0 1 1"/>
</material>

<material name="blue">
<color rgba="0 0 1 1"/>
</material>

</robot>

Mais uma vez verificamos que  a posição do objecto não é adequada.

As duas razões são, a posição do joint G no link_1 e no link_1 estão no centro dos respectivos objctos, e portanto teremos que redefinir, a origem do joint pelo deslocamento na vertical de metade da altura (0.017) do suporte (link_1), e a origem do visual pelo deslocamento na vertical de metade da altura (0.04) da haste (link_2).

<joint name="joint_2" type="revolute">
<origin xyz="0 0 0.017" rpy="0 0 0" />
<parent link="link_1" />
<child link="link_2" />
<axis xyz="1 0 0" />
<limit
effort="0"
velocity="0"
lower="-0.6109" upper="0.9599"/>
<!-- [-35,55]-->
</joint>

<link name="link_2">
<visual>
<origin xyz="0 0 0.04" rpy="0 0 0" />
<geometry>
<box size="0.01 0.01 0.08" />
</geometry>
<material name="blue" />
</visual>
</link>

 

Por último passemos ao quarto objecto, a haste horizontal definida pelos pontos P, O e N, do tipo box e roda sobre o eixo x no ponto H.

Mais uma vez, para definirmos outro objecto (link) temos também de definir a ligação entre eles (joint).

Chamo a atenção que desta vez foram efectuados acertos logo de inicio. No joint_3 a origem z foi deslocada 0.08 unidades, e a origem  ydo visual do link_3 foi deslocada 0.0225 unidades.

nano ~/catkin_ws/src/description_tutorial/urdf/robot1.urdf

<?xml version=”1.0″?>
<robot name=”robot1″>
<link name=”base_link”>
<visual>
<origin xyz=”0 0 0.016″ rpy=”0 0 0″ />
<geometry>
<cylinder length=”0.032″ radius=”0.035″/>
</geometry>
<material name=”blue”/>
</visual>
</link>

<joint name=”joint_1″ type=”revolute”>
<origin xyz=”0 0 0.049″ rpy=”0 0 0″ />
<parent link=”base_link” />
<child link=”link_1″ />
<axis xyz=”0 0 1″ />
<limit
effort=”0″
velocity=”0″
lower=”-0.7854″ upper=”0.7854″/>
<!– [-45,45]–>
</joint>

<link name=”link_1″>
<visual>
<origin xyz=”0 0 0″ rpy=”0 0 0″ />
<geometry>
<box size=”0.01 0.034 0.034″ />
</geometry>
<material name=”red” />
</visual>
</link>

<joint name=”joint_2″ type=”revolute”>
<origin xyz=”0 0 0.017″ rpy=”0 0 0″ />
<parent link=”link_1″ />
<child link=”link_2″ />
<axis xyz=”1 0 0″ />
<limit
effort=”0″
velocity=”0″
lower=”-0.6109″ upper=”0.9599″/>
<!– [-35,55]–>
</joint>

<link name=”link_2″>
<visual>
<origin xyz=”0 0 0.04″ rpy=”0 0 0″ />
<geometry>
<box size=”0.01 0.01 0.08″ />
</geometry>
<material name=”blue” />
</visual>
</link>

<joint name=”joint_3″ type=”revolute”>
<origin xyz=”0 0 0.08″ rpy=”0 0 0″ />
<parent link=”link_2″ />
<child link=”link_3″ />
<axis xyz=”1 0 0″ />
<limit
effort=”0″
velocity=”0″
lower=”-1.2217″ upper=”0.3491″/>
<!– [-70,20]–>
</joint>

<link name=”link_3″>
<visual>
<origin
xyz=”0 0.0225 0″
rpy=”0 0 0″ />
<geometry>
<box size=”0.0075 0.127 0.01″ />
</geometry>
<material name=”red” />
</visual>
</link>

<material name=”red”>
<color rgba=”1 0 1 1″/>
</material>

<material name=”blue”>
<color rgba=”0 0 1 1″/>
</material>

</robot>

No final, conforme video abaixo, podemos manipular a posição dos 3 joints com o joint_state_publisher_gui.

 

 

Making of EEZYbotARM MK1

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:

  • http://www.eezyrobots.it/eba_mk1.html
  • https://www.instructables.com/id/EEZYbotARM/
  • https://www.thingiverse.com/thing:1015238

A parte electrónica e o sofware de exploração serão abordados em artigos posteriores

 

Lista de materiais

Para além das peças que são produzidas na impressora 3D, este projecto necessita do seguinte material:

  • 3 x servo Tower Pro MG90 (ou SG90) c/ acessórios
  • 1 x servo Tower Pro SG90 c/ acessórios
  • 4 x parafuso M3 de 8 mm (alternativa: 10 mm)
  • 2 x parafuso M3 de 10 mm
  • 2 x parafuso M3 de 15 mm
  • 6 x parafuso M4 de 20 mm
  • 1 x parafuso M4 de 25 mm
  • 1 x parafuso M4 de 30 mm
  • 8 x porca M3 auto bloqueante
  • 8 x porca M4 auto bloqueante
  • 20 x anilha M4
  • 1 x varão roscado c/ 25 mm (alternativa: 1 x parafuso M4 de 20mm)

Parte 1: Impressão e preparação das peças em 3D

Lista de peças a imprimir em 3D efectuar o braço róbotico, incluindo a garra.

  • 1 x EBA_01.00.001.STL
  • 1 x EBA_01.00.002_vertical_drive_arm.STL
  • 3 x EBA_01.00.003_link.STL
  • 1 x EBA_01.00.004_forward_drive_arm.STL
  • 1 x EBA_01.00.005_horizontal_arm.STL
  • 1 x EBA_01.00.006_triangular_link.STL
  • 2 x EBA_01.00.009_servo_plate.STL
  • 1 x EBA_01.00.010_basement.STL
  • 1 x EBA_01.00.011_round_plate.STL
  • 1 x EBA_01.00.012_R01_claw_support.STL
  • 1 x EBA_01.00.013_R01_right_finger.STL
  • 1 x EBA_01.00.014_R01_left_finger.STL
  • 1 x EBA_01.00.015_drive_gear.STL
  • 1 x EBA_01.00.016_R01_driven_gear.STL

Peças adicionais que são apenas usadas na demonstração

  • EBA_01.00.017_R01_ramp.STL
  • EBA_01.00.018_maestro_holder.STL
  • EBA_01.00.019_ball.STL

 

Parte 2: Montagem do braço robótico

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.

Passo 1 : montagem da base do braço robótico

Peças usadas:

  • 1 x servo Tower Pro MG90 com acessórios
  • 2 x parafusos M3 x 10 mm
  • 2 x porcas M3 autobloqueante
  • 001.STL
  • 010_basement.STL
  • 011_round_plate.STL

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.

Passo 2: Montagem das hastes do braço robótico

Peças usadas

  • 1 x EBA_01.00.002_vertical_drive_arm.STL
  • 3 x EBA_01.00.003_link.STL
  • 1 x EBA_01.00.004_forward_drive_arm.STL
  • 1 x EBA_01.00.005_horizontal_arm.STL
  • 1 x EBA_01.00.006_triangular_link.STL
  • 5 x parafuso M4 de 20 mm
  • 1 x parafuso M4 de 30 mm
  • 6 x porca M4 auto bloqueante
  • 16 x anilha M4

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:

  • 1 x EBA_01.00.012_R01_claw_support.STL
  • 1 x EBA_01.00.013_R01_right_finger.STL
  • 1 x EBA_01.00.014_R01_left_finger.STL
  • 1 x EBA_01.00.015_drive_gear.STL
  • 1 x EBA_01.00.016_R01_driven_gear.STL
  • 1 x servo Tower Pro MG90 com acessórios
  • 2 x parafuso M3 de 15 mm
  • 2 x porca M3 auto bloqueante

 

 

Passo 4: Montagem das hastes na base do braço robótico

Peças usadas:

  • 1 x conjunto de hastes montadas  (previamente montada)
  • 1 x servo Tower Pro MG90 com acessórios

 

 

Passo 4: Montagem da garra nas hastes do braço robótico

Peças usadas:

  • 1 x garra (previamente montada)
  • 1 x parafuso M4 de 20 mm
  • 1 x parafuso M4 de 25 mm
  • 2 x porca M4 auto bloqueante
  • 4 x anilha M4

 

 

Controlo de PWM com PCA9685 e Pontenciometros variaveis

Este artigo foi efectuado para documentar os testes que efectuei com os seguintes braços róboticos educativos cujas algumas das peças mecanicas se podem fazer com uma impressora 3D.

Para efectuar o controlo do braço recorri ao hardware e software descrito mais abaixo.

sdr

O controlo dos 4 servos do braço é efectuado por um conjunto de 4 potenciómetros cuja posição é lida pelo recurso á leitura de 4 dos pinos analógicos de um Arduino Uno, que é convertido num comprimento de pulso mapeado entre o valor minimo e máximo de comprimento de pulso ,  enviado por I2C para o módulo PCA9685, que gera o PWM para a respectiva posição para cada um dos servos.

Hardware

A parte electrónica é composta por:

  • um microcontrolador ATMEGA 328P (Arduino Uno)
  • um modulo PCA9685
  • quatro potenciómetros
  • uma resistencia
Ligações entre os potenciometros, mcu, PCA9685 e servos MG996

Software

Para implementar o procedimento descrito existe um pequeno programa disponivel mais abaixo e que necessita da biblioteca Adafruit PWM Servo Driver para o Arduino que se pode instalar no arduino ide.

A biblioteca pode ser instalada recorrendo ao gestor de bibliotecas, pesquisar por: “adafruit pwm” e instalar. Mas também está disponivel no seguinte endereço

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library

Programa para o Arduino Uno

servo_pca9685 _potenciometer_v2

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOCOUNT 4

#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096)

int potpin[SERVOCOUNT] = {0};
int potval[SERVOCOUNT] = {0};
int srvang[SERVOCOUNT] = {0}; 
int srvpls[SERVOCOUNT] = {SERVOMIN};

void setup() {
Serial.begin(115200);
potpin[0]=0;
potpin[1]=1;
potpin[2]=2;
potpin[3]=3;
pwm.begin();
pwm.setPWMFreq(60);
delay(10);
}

void loop() {
int i;

for(i = 0; i < SERVOCOUNT; i++) {
// read potentiometer
potval[i] = analogRead(potpin[i]);
// map potentiometer value to degrees
srvang[i] = map(potval[i], 0, 1023, 0, 180);
// map degrees to pulse length
srvpls[i] = map(srvang[i], 0, 180, SERVOMIN, SERVOMAX);
// print to give feedback 
Serial.print(potval[i]); Serial.print("\t"); Serial.print(srvang[i]); Serial.print("\t");
// send pwm to servo
pwm.setPWM(potpin[i], 0, srvpls[i]); 
}

Serial.println("\n");
}

 

Referências:

https://learn.adafruit.com/16-channel-pwm-servo-driver/using-the-adafruit-library

Arduino PCA9685 example

 

Braços robóticos ROS DIY

O principal propósito deste artigo é procurar coligir uma lista de Braços Robóticos operados com ROS, com recurso ao Moveit. No entanto também são incluídos alguns braços róboticos que ainda não existe software para os operar com o ROS mas que seja eventualmente possível criar esse software.

Requisitos básicos para operar um braço robótico com o ROS

Uma das primeiras condições para que o braço róbotico seja possível de ser operado com facilidade com o ROS Moveit é que exista uma descrição do mesmo num ficheiro URDF.

Os ficheiros URDF são ficheiros XML com duas etiquetas fundamentais:

  • Link, que representam as parte estáticas dos robot
  • Joint. que representam as ligações entre as várias partes do robot, (links)

Existem dois tipos de cadeias cinemáticas:

  • As cadeias em malha fechada (closed loop): em que cada link está ligado pelo menos a dois outro links ( a cadeia forma um ou mais circuitos fechados).
  • As cadeias em malha aberta (malha aberta): em que um, ou mais, dos links apenas está ligado a um outro link.

Os ficheiros URDF só permitem a descrição de robots em árvore hierárquica, o que deixa de fora os robots com cadeia cinemática em malha fechada.

Braços Róboticos com ROS

  • Niryo One
  • BCN3D Moveo
  • dobot
  • EezyBotArm MK2
  • RoboticArmV1
  • EezyBotArm MK1
  • Tinkerkit Braccio Robot
  • 7DOF arduino arm for ROS
  • Faze4 Robotic arm

Braços Róboticos sem ROS

  • Robot Arm MK2 Plus
  • RoboticArmV2
  • Sixi 2 Robot Arm
  • WE-R2.4 Six-Axis Robot Arm
  • https://www.thingiverse.com/thing:1718984
  • uStepper (4th gen) https://www.thingiverse.com/thing:3876856
  • 6DOF Robot Arm v1.0
  • Faze4 Robotic arm (6dof)
  • Atlas – 6DOF 3D printed universal robot
  • RepRap HELIOS SCARA Robot
  • SCARA Robotic Arm
  • Dexter
  • Walter – 6 DOF robot arm in vintage style
  • Thor – OpenSource 3D printable Robotic 6DOF Arm
  • 6 axis stepper robot

 

 

Robots paletizadores

Partilham a mesma cadeia cinemática

  • meArm (v0.3, v0.4, v1.0)
  • eezybotarm (mk1, mk2, mk3)
  • Robot Arm MK2 Plus
  • uStepper Robot Arm (Rev 2, Rev3, Rev 4)
  • Horizontal Travel Robot Arm
  • robotArm (ftobler)
  • uArm

Dexter

https://hackaday.io/project/158779-dexter

https://www.thingiverse.com/thing:2108244

https://github.com/cfry/dde

 

6 axis stepper robot

https://www.thingiverse.com/thing:1738665

Thor – OpenSource 3D printable Robotic 6DOF Arm

https://hackaday.io/project/12989-thor

Walter is a 6 DOF robot arm in vintage style

https://hackaday.io/project/19968-walter

https://walter.readthedocs.io/en/latest/

 

RepRap HELIOS SCARA Robot

https://hackaday.io/project/21355-reprap-helios

SCARA Robotic Arm

https://www.thingiverse.com/thing:1241491

Atlas – 6DOF 3D printed universal robot

https://hackaday.io/project/168259-atlas-6dof-3d-printed-universal-robot

 

Faze4 Robotic arm (6dof)

https://hackaday.io/project/167247-faze4-robotic-arm

https://github.com/PCrnjak/Faze4-Robotic-arm

meArm

https://www.instructables.com/id/Pocket-Sized-Robot-Arm-meArm-V04/

https://github.com/phenoptix/me-arm-ik

 

Robot Arm MK2 Plus

https://www.thingiverse.com/thing:2520572

 

uStepper Robot Arm (Rev 2, Rev3, Rev 4)

https://www.thingiverse.com/thing:986224

https://www.thingiverse.com/thing:1398215

https://www.thingiverse.com/thing:1774473

https://github.com/uStepper/uStepper-RobotArm-Rev3

remixes

https://www.thingiverse.com/thing:2849783

 

Horizontal Travel Robot Arm

https://medium.com/@pacogarcia3/computer-vision-pick-and-place-for-toys-using-raspberry-pi-and-arduino-68a04874c039

https://www.thingiverse.com/thing:3509006

https://www.instructables.com/id/Horizontal-Travel-Robot-Arm/

 

RobotArm (ftobler)

https://www.thingiverse.com/thing:1718984

Existe um grupo do facebook para os utilizadores deste braço. (https://www.facebook.com/groups/robotarm)

O administrador do grupo criou uma remix deste braço usando correias. Informação disponível em: https://www.20sffactory.com/
STLs disponiveis em: https://www.thingiverse.com/thing:4415380

 

uArm robotic arm

https://store.ufactory.cc/products/uarm

https://github.com/uArm-Developer/RosForSwiftAndSwiftPro

https://github.com/uArm-Developer/UArmForROS

 


6DOF Robot Arm v1.0

https://github.com/RoboLabHub/RobotArm_v1.0

 


Niryo One

https://github.com/NiryoRobotics/niryo_one

 


BCN3D Moveo

https://www.thingiverse.com/thing:1693444

 

 


Dobot magician

https://www.dobot.cc/

https://www.dobot.de/

https://hotblackrobotics.github.io/en/blog/2018/06/29/ros-dobot/

https://github.com/sgabello1/ros-dobot

3D-Model DOBOT Magician incl. Tools

 


EezyBotArm MK2

https://www.instructables.com/id/EEZYbotARM-Mk2-3D-Printed-Robot/

https://www.thingiverse.com/thing:1454048/files

http://www.eezyrobots.it/eba_mk2.html

https://hotblackrobotics.github.io/en/blog/2018/01/17/ntbd-guide-part-I/

https://hotblackrobotics.github.io/it/blog/2018/02/14/sibot-cloud/

https://hackaday.io/project/157951/logs

eezyarm_APIEMS2019_paper_259

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

https://github.com/SimBil91/coffee-bot

https://hackaday.io/project/157951-stm32-robot-arm-controller

 

 


Tinkerkit Braccio Robot

Tinkerkit Braccio robot

https://www.robotshop.com/en/arduino-braccio-robotic-arm.html

https://github.com/ohlr/braccio_arduino_ros_rviz

 


RoboticArmV1

https://www.instructables.com/id/ROS-MoveIt-Robotic-Arm/

https://www.instructables.com/id/ROS-MoveIt-Robotic-Arm-Part-2-Robot-Controller/

https://www.thingiverse.com/thing:851345

 


EezyBotArm MK1

https://www.instructables.com/id/EEZYbotARM/

https://www.thingiverse.com/thing:1015238

http://www.eezyrobots.it/eba_mk1.html

 


Robot Arm MK2 Plus

https://www.instructables.com/id/Robot-Arm-MK2-Plus-Stepper-Motor-Used/

https://www.thingiverse.com/thing:2520572

https://www.instructables.com/id/Using-Arduino-to-Design-3-Dof-Robot-Arm-for-3d-Pri/

 


7DOF arduino arm for ROS

https://hackaday.io/project/164495-a-7dof-arduino-arm-for-ros

https://github.com/qq95538/ArduinoRobotHardWareInterfaceForROS

 


RoboticArmV2

https://www.thingiverse.com/thing:969460

 


 

Sixi 2 Robot Arm

https://github.com/MarginallyClever/sixi-2

https://docs.google.com/spreadsheets/d/1kIXNkmVc6ltsIxx8kSpOiDqU04hZP3wAlI8Vb9QwlLI/edit#gid=0

 


 

WE-R2.4 Six-Axis Robot Arm

https://www.thingiverse.com/thing:3327968

 

 


 

Faze4 Robotic arm

 

https://hackaday.io/project/167247-faze4-robotic-arm

https://github.com/PCrnjak/Faze4-Robotic-arm

 


https://hackaday.io/project/3800-3d-printable-robot-arm


https://grabcad.com/library/microb-3d-printable-6-axis-robot-1

 

 

Videos do youtube para selecionar braços

Skyentific

 


Chris Annin

https://www.anninrobotics.com/

https://github.com/Chris-Annin/Annin-Robot-Project

 

 


Dr. D-Flow

RBX1 (Remix): 3D Printed 6 Axis Robot Arm Beta Kit