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