Nesse artigo, vamos mostrar como utilizar o ROS para se comunicar com o Arduino através do pacote rosserial_arduino.
Nos artigos da série introdutória sobre o ROS, expliquei como instalar e criar um “Hello World” para um PC rodando o sistema operacional Linux. Entretanto, muitos devem ter se perguntado se era possível se comunicar com motores e sensores conectados à uma placa Arduino através do ROS. Tal comunicação não apenas é possível, como também é bem simples de ser implementada.
Introdução ao pacote ROSSERIAL
O pacote ROSSERIAL é um conjunto de wrappers para facilitar a vida de quem precisa de comunicação com dispositivos através de uma porta serial ou mesmo através de um socket em rede.
O pacote contém quatro bibliotecas que possibilitam tal comunicação básica com o ROS, sendo possível publicar e se subscrever em tópicos e serviços:
- ROSSERIAL_ARDUINO: Possibilita a comunicação com placas Arduino, como o UNO e Leonardo;
- ROSSERIAL_EMBEDDEDLINUX: Possibilita a comunicação com placas que utilizem linux embarcados, como roteadores;
- ROSSERIAL_WINDOWS: Possibilita a comunicação com aplicações Windows através de sockets;
- ROSSERIAL_MBED: Possibilita a comunicação com plataformas mbed;
- ROSSERIAL_TIVAC: Possibilita a comunicação com placas Launchpad da Texas Instruments, tais como as placas TM4C123GXL e TM4C1294XL.
Utilizando o ROSSERIAL_ARDUINO
Em nosso caso, estamos interessados em trabalhar com a biblioteca rosserial_arduino. Em primeiro lugar, precisamos realizar a instalação do pacote em nosso sistema com o seguinte comando:
sudo apt-get install ros-indigo-rosserial-arduino
Nota: se sua distribuição ROS não é a Indigo, você precisa substituir, no comando acima, a palavra “indigo” pelo o nome da sua distribuição, tal como jade ou kinetic.
Com a biblioteca instalada em nosso sistema, podemos utilizar o script make_libraries.py para gerar uma lista de bibliotecas do ROS compatíveis com o Arduino IDE:
rosrun rosserial_arduino make_libraries.py .
Após executar o comando acima, você verá que foi criada a pasta ros_lib no local em que comando foi executado. Agora, basta copiá-la para aonde estiver localizada a pasta sketchbook/libraries configurada para seu Arduino IDE. No meu caso, copiei a pasta para /home/francisco/Arduino/libraries.
Nota: Com a pasta ros_lib você poderá desenvolver aplicações para Arduino capazes de se comunicar com o ROS independente do sistema operacional que você utiliza (ros_lib funciona com o Arduino IDE em Windows, Linux ou macOS). Entretanto, para gerar a pasta, você precisa executar o comando acima em um sistema que esteja rodando Linux e tenha o ROS instalado.
Exemplo de Publisher no ROSSERIAL_ARDUINO
Agora que você colocou a pasta ros_lib em nosso Arduino sketchbook, alguns exemplos de códigos utilizando ROS estarão disponíveis no seu Arduino IDE. Vamos examinar o código para publicar a string “hello world!” pela própria placa Arduino.
Abra seu Arduino IDE e vá em “File -> Examples -> ros_lib -> HelloWorld para abrir o código de example. Você verá o seguinte código aberto:
/*
* rosserial Publisher Example
* Prints "hello world!"
*/
#include <ros.h>
#include <std_msgs/String.h>
ros::NodeHandle nh;
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
char hello[13] = "hello world!";
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}
Agora, vamos explicar linha por linha o código acima:
#include <ros.h> #include <std_msgs/String.h>
Para criar ROS nodes para Arduino, você precisa sempre incluir o arquivo ros.h em seus programas. O arquivo std_msgs/String.h inclui todas os métodos necessários para se enviar e receber mensagens do tipo string.
ros::NodeHandle nh;
Cria o objeto que será seu NodeHandle no programa em que você está escrevendo. Você sempre precisará de um NodeHandle para receber e enviar mensagens pelo ROS.
std_msgs::String str_msg;
Cria uma variável do tipo std_msgs/String que irá receber os valores que vamos enviar pelo ROS.
ros::Publisher chatter("chatter", &str_msg);
Cria um objeto chamado chatter que irá ser responsável por publicar sua mensagem. Nesse caso, queremos publicar a mensagem contida na variável str_msg no tópico /chatter.
char hello[13] = "hello world!";
Essa será a mensagem que iremos publicar através do Arduino.
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
A função setup() é necessária para inicializar nosso nó e configurar nossos publishers e subscribers no ROS. O método initNode() inicializa nosso ROS node e o método advertise(chatter) configura nosso publisher.
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}
A função loop() será responsável por receber e enviar mensagens dos publishers e subscribers. Primeiro, precisamos preencher o campo data na nossa variável str_msg com a string que gostaríamos de enviar. Após isso, precisamos invocar o método publish no nosso objeto chatter para efetivamente enviar nossa mensagem para o ROS. O método spinOnce() faz com que o sistema atualize todos os publishers e subscribers. Por último, o método delay(1000) faz com que o programa espere por 1 segundo antes de executar o loop novamente.
Ao final, não esqueça de enviar o código para seu Arduino.
Fazendo a comunicação entre Arduino e ROS
Agora que instalamos as todas as dependências do rosserial_arduino e temos nosso primeiro programa em Arduino, podemos, finalmente, fazer a comunicação entre o seu Arduino e o ROS.
Primeiro, você precisa garantir que seu Arduino esteja conectado via USB em uma máquina rodando ROS. Você precisará saber em qual interface USB seu artigo está conectado, normalmente será /dev/ttyACM0.
Abra um terminal e execute o seguinte comando para inicializar o ROS em sua máquina:
roscore
Em um segundo termina, execute o seguinte comando para inicializar o rosserial_arduino:
rosrun rosserial_python serial_node.py /dev/ttyACM0
Pronto! O código que você enviou anteriormente para o seu Arduino já estará sendo executado e publicando a mensagem “hello world!” no tópico /chatter.
Para verificar que tudo está realmente funcionando, você pode abrir outro terminal e usar o comando rostopic echo para visualizar as mensagens sendo publicadas no tópico /chatter:
rostopic echo chatter
Agora, você poderá conectar servo motores e outros dispositivos em seu Arduinos e se comunicar com máquinas rodando ROS facilmente. Você poderá estudar outros exemplos que foram adicionados ao Arduino IDE para ganhar mais familiaridade com o rosserial_arduino.
Você também poderá encontrar mais informações sobre como utilizar o rosserial_arduino no seguinte link:
Referências






Curso Arduino Essencial
https://go.hotmart.com/R5998736X
Aprenda a programar desde o zero, projetar e calcular circuitos elétricos e desenvolver projetos com a plataforma microcontroladora mais utilizada por empresas e universidades do mundo: o Arduino! Neste curso você aprenderá a trabalhar com LEDs, resistores, sensores, displays LCD; saberá como manusear um multímetro digital para medir grandezas elétricas tais como corrente, tensão e resistência e desenvolverá seu próprio sensor de estacionamento caseiro que emite sinais sonoros e mostra a distância.