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