HomeTecnologiaROS e Arduino

ROS e Arduino

Leggi le riviste ⇢

Ti potrebbero interessare ⇢

La Redazione

Lo sviluppo di software robusto per il controllo di robot è un’attività che richiede il contributo di molte competenze diverse (visione artificiale, navigazione, comunicazione, controllo del moto,... solo per citarne alcune), spesso non presenti all’interno di un unico laboratorio di sviluppo. Pertanto, con il passare degli anni è stato sempre più evidente il bisogno di un ambiente che consentisse lo sviluppo del software in modo collaborativo e facilmente integrabile. Diversi progetti hanno cercato di perseguire questo scopo e ROS, nato circa dieci anni fa presso i laboratori di Willow Garage, sembra essere riuscito a soddisfare questa necessità. ROS, acronimo di Robot Operating System, è un framework software per dispositivi robotici, dedicato allo sviluppo di sistemi complessi in modo semplice e modulare, tramite un insieme di librerie e di strumenti di programmazione dedicati al mondo della robotica. Esso mette a disposizione alcune funzionalità fondamentali per facilitare la modularità del software sviluppato, con particolare attenzione alle convenzioni e alle funzionalità tipiche dei dispositivi robotici.

Tra le diverse funzionalità che ROS mette a disposizione, assume un ruolo di particolare rilievo il sistema di comunicazione (middleware) che consente di collegare e trasmettere le informazioni disponibili tra i diversi nodi di un’architettura ROS. Esso consente di non dover sviluppare, di volta in volta, un protocollo di comunicazione ad hoc, potendo sfruttare un meccanismo di funzionamento altamente robusto e flessibile. Esso fornisce due meccanismi principali di comunicazione: i topicsono messaggi che sfruttano un meccanismo di comunicazione anonimo di tipo publish/subscribe tramite il quale i nodi del sistema mettono a disposizione informazioni ad altri nodi dell’architettura; i serviceconsentono di condividere tra i diversi nodi del sistema funzionalità e procedure tramite chiamate di procedura remota. La struttura delle interfacce di questi messaggi è definita tramite l’Interface Description Language (IDL).

Oltre al middleware, ROS mette a disposizione strumenti specifici dedicati allo sviluppo di dispositivi robotici. Tra di essi troviamo, ad esempio, definizioni di messaggi standardizzati per robot, librerie per la descrizione di dispositivi robotici, e strumenti di localizzazione e navigazione dei robot all’interno di ambienti.

Un ulteriore aspetto molto importante dell’ambiente ROS è costituito dagli strumenti di sviluppo messi a disposizione. Essi facilitano le fasi di debug tramite tool di visualizzazione, analisi e logging dei dati che consentono di analizzare i dati, sia online sia offline, consentendo un’analisi completa del comportamento del software in fase di sviluppo.

Rosserial

Tra i diversi moduli disponibili, in quest’ambito è utile menzionare rosserial, un protocollo che consente di trasferire messaggi relativi a service e topic attraverso porte seriali o socket di rete. Esistono diversi client rosserialtra cui spicca, per i nostri scopi, rosserial_arduino, che consente di utilizzare una scheda Arduino come nodo ROS, in grado pubblicare topic e di diventare sottoscrittore di services.

Affinchè una scheda Arduino possa essere integrata in un’architettura ROS, è necessaria la presenza di un nodo sulla macchina host che consente la trasmissione dei dati presenti su protocollo seriale. Sono disponibili due diverse implementazioni: rosserial_pythone rosserial_server. La prima è un’implementazione Python completa e di semplice utilizzo; la seconda, pur avendo qualche limitazione, è particolarmente adatta nel caso siano richieste elevate presentazioni.

Un esempio pratico

E’ necessario premettere che ROS deve essere eseguito su sistema operativo Linux, prediligendo la distribuzione Ubuntu. Nel caso siate abituati a sviluppare su sistema operativo Windows, sarà quindi necessario premunirsi per l’occasione, eventualmente installando una macchina virtuale. Successivamente è necessario installare i pacchetti ROS tramite le istruzioni presenti sul sito ufficiale.

Ogni anno (quasi sempre in maggio) viene rilasciata una nuova versione di ROS. Al momento della stesura di questo articolo è già stata rilasciata la versione Melodic Morena per l’anno 2018, ma non è ancora disponibile il pacchetto rosserial_arduinoper questa versione (forse lo sarà nel momento della stampa). Le alternative disponibili sono quindi l’installazione della versione ROS Kinetic su distribuzione Ubuntu 16.04 oppure ROS Lunar su Ubuntu 17.04. Successivamente è necessario installare il pacchetto rosserial_arduinocome riportato sul sito ufficiale. L’ambiente di sviluppo è ora pronto per essere utilizzato.

Consideriamo ora di voler generare un’onda quadra attraverso un’uscita digitale di una scheda Arduino e di variare la frequenza dell’onda tramite un servizio ROS. A titolo di esempio, assumiamo inoltre che Arduino trasmetta periodicamente lo stato del segnale digitale in uscita tramite topic. Facciamo riferimento allo scketch riportato qui di seguito ed analizziamo la struttura del codice, soffermandoci sulle parti relative all’uso del framework ROS.

01#include <ros.h>

02#include <std_msgs/Float32.h>

03

04constintled_pin=13;

05floatfrequency;

06floatoutput_value;

07

08voidset_frequency_cb(conststd_msgs::Float32&cmd_msg){

09   frequency =cmd_msg.data;

10}

11

12std_msgs::Float32 value_msg;

13ros::NodeHandle nh;

14ros::Publisher pub_value("value",&value_msg);

15ros::Subscriber<std_msgs::Float32>sub("set_frequency",&set_frequency_cb);

16

17voidsetup(){

18   nh.initNode();

19   nh.advertise(pub_value);

20   nh.subscribe(sub);

21   pinMode(led_pin,OUTPUT);

22   frequency =1;

23}

24

25voidloop(){

26   output_value =HIGH-digitalRead(led_pin);

27   digitalWrite(led_pin,output_value);

28   value_msg.data =output_value;

29   pub_value.publish(&value_msg);

30   nh.spinOnce();

31   delay(1000/(2*frequency));

32}

Inizialmente viene inclusa la libreria ROS (riga 1) insieme al tipo Float32(riga 2), successivamente utilizzato per la definizione di un topic e di un service. Vengono inoltre definiti l’handle nhper il nodo ROS Arduino (13), il publisher pub_valuein grado di pubblicare il topic valuecon messaggio value_msg(14) ed il subscriber sub(15), il quale associa alla chiamata del service set_frequencyla funzione di callback set_frequency_cb(definita alle righe 8-10). In altre parole, quando, uno dei nodi dell’architettura ROS chiama il service set_frequencyviene invocata la funzione set_frequency_cbdello sketch Arduino, che aggiorna il valore della variabile frequency. Nella funzione setup()viene inizializzato il nodo ROS (18) ed a questo vengono associati il publisher (19) e il subscriber (20). Ad ogni ciclo della funzione loop()viene invertito il valore dell’uscita (26-27), viene pubblicato il suo valore (28-29), e vengono invocati i publisher e i subscriber (30). Ogni ciclo loop è intervallato in modo tale da rispettare la frequenza impostata (31).

Una volta caricato lo sketch sulla scheda Arduino, è necessario avviare l’infrastruttura ROS tramite il comando roscoreed il modulo rosserial, in due diversi terminali del PC host (Fig. 1). rosserialviene eseguito tramite il comando

rosrun rosserial_python serial_node.py /dev/ttyUSB0

facendo attenzione a modificare il nome della porta seriale a cui è collegata la scheda Arduino, nel caso non sia ttyUSB0.

Ora il sistema è completamente funzionante e la scheda Arduino invia periodicamente un topic con lo stato dell’uscita, come visualizzabile tramite le interfacce messe a disposizione dal tool rqt(Fig. 2). Per modificare la frequenza dell’onda quadra generata dallo sketch descritto precedentemente è possibile utilizzare il comando

rostopic pub set_frequency std_msgs/Float32 f -1

sostituendo al parametro fla frequenza desiderata espressa in Hz.

ROS Industrial

ROS è molto spesso utilizzato per lo sviluppo di applicazioni nell’ambito della robotica di servizio. Nonostante ciò, la sua tecnologia di base ben si presta ad essere utilizzata anche in altre aree, compresa la robotica industriale. Le caratteristiche e le prestazioni di ROS utilizzate in alcuni ambiti tecnologici, come la sensoristica avanzata e la pianificazione del moto, ne stanno facilitando l’utilizzo per lo sviluppo di applicazioni robotiche in ambito manifatturiero, con una drastica riduzione dei costi e con la disponibilità di tecnologie precedentemente non esistenti. Al fine di facilitare ancor di più l’utilizzo di ROS in ambito industriale, è nato ROS-Industrial (ROS-I)[5], un progetto open-source che estende le caratterisitche di ROS al mondo dell’automazione e della robotica manifatturiera. I repository di ROS-I includono interfacce per manipolatori industriali, pinze, sensori e reti di dispositivi. ROS-I include librerie software in grado di affrontare molti aspetti dell’automazione industriale, a partire dalla calibrazione automatica di sensori 2D/3D, fino alla pianificazione del moto anche tramite generazione di traiettorie a partire da nuvole di punti 3D (Scan-N-Plan). L’utilizzo di interfacce di programmazione semplici, facili da utilizzare e ben documentate, sta spingendo verso lo sviluppo di librerie software hardware-agnostic, cioè in grado di essere utilizzate indipendentemente dall’hardware specifico realmente impiegato. Il tutto con caratteristiche di robustezza ed affidabilità richieste dagli standard industriali. ROS-I nasce con il diretto obiettivo di trasferire rapidamente in ambito industriale le ricerche più avanzate condotte in ambito accademico, troppo spesso confinate nei laboratori a causa degli elevati costi di instrializzazione richiesti, facilitando l’utilizzo e l’integrazione di soluzioni innovative in scenari industriali. Le elevate potenzialità di ROS e il suo utilizzo relativamente facile, consentono all’ecosistema ROS di essere attualmente costituito da decine di migliaia di utenti nel mondo che si dedicano ai più svariati progetti, a partire da piccole applicazioni hobbistiche fino a grandi sistemi di automazione industriale.

 

 

ROS e Arduino - Ultima modifica: 2018-04-29T12:03:50+02:00 da La Redazione