Nell’articolo “Progetto di una interfaccia robotica Arduino-ROS – Parte 1” abbiamo introdotto il progetto di una interfaccia che consente alla scheda Arduino di avere la capacità di realizzare robot anche complessi mediante l’integrazione del software ROS, il sistema operativo del robot. Il meta sistema operativo ROS consente a microcontrollori di non elevata potenza di calcolo (come ad esempio Arduino) di dotarli di funzionalità robotiche di fascia alta. La prima parte del progetto l’abbiamo esclusivamente dedicata al ROS descrivendone la terminologia e i concetti fondamentali. In questo articolo “Progetto di una interfaccia robotica Arduino-ROS – Parte 2”, installeremo le prime parti software necessarie per realizzare l’interfaccia Arduino-ROS. Descriveremo le librerie “rosserial_client”, un'implementazione lato client del protocollo rosserial; installeremo Ubuntu su computer e infine, installeremo il sistema operativo robotico ROS in Ubuntu e i pacchetti della libreria rosserial su ROS.
Comunicazione seriale di Arduino con ROS
Nella maggior parte dei robot, i sensori di base saranno interfacciati a schede I/O come STM32, Arduino ed altre schede basate su microcontrollore. Quindi, occorre trovare un modo per fornire i dati dei sensori al software ROS in esecuzione su un computer che dovrà elaborarli per generare le funzionalità robotiche secondo l’applicazione desiderata. Questo è il ruolo dei pacchetti “rosserial” che è possibile esplorare nel sito http://wiki.ros.org/rosserial. Il meta-pacchetto rosserial consiste in insiemi di pacchetti adibiti a ricevere dati seriali da un microcontrollore, o da qualsiasi altro dispositivo seriale, utilizzando il protocollo rosserial standard. Il funzionamento del protocollo rosserial è descritto di seguito. Rosserial è un protocollo standard per la comunicazione tra ROS e un dispositivo seriale. La comunicazione avviene su una linea di trasmissione seriale e utilizza tecniche di serializzazione / deserializzazione per la trasmissione di messaggi ROS. Il dispositivo seriale invia messaggi ROS sotto forma di pacchetto che ha un'intestazione e una coda che consentono più argomenti e servizi generati da un singolo dispositivo hardware. Il pacchetto contiene anche flag per sincronizzare la comunicazione tra il computer e il dispositivo e viceversa. La Figura 1 mostra il formato del pacchetto utilizzando il protocollo rosserial.
Il primo byte è chiamato “Sync Flag” che viene utilizzato per sincronizzare la comunicazione tra ROS e dispositivo. Il suo valore sarà sempre 0xff. Il secondo byte “Sync Flag/ Protocol Version” indica la versione ROS che viene utilizzata. Il terzo byte (Low byte) e il quarto byte (High byte) rappresentano la lunghezza del messaggio contenuto nel pacchetto. Il quinto byte è un checksum della lunghezza del messaggio. Il sesto byte (Low byte) e il settimo byte (High byte) “Topic ID” sono dedicati all'ID dell'argomento. L'ID argomento da 0 a 100 è riservato alle funzioni di sistema. I byte rimanenti vengono utilizzati per i dati seriali e i relativi checksum. Il checksum della lunghezza del pacchetto e dei dati viene calcolato utilizzando la seguente equazione:
checksum=255 - ((Topic ID Low Byte + Topic ID High Byte + valori byte di dati) % 256)
La comunicazione tra il dispositivo seriale e il computer inizierà dal lato computer che invierà un pacchetto di query per ottenere il numero di argomenti, nomi e tipi di argomenti da Arduino/dispositivo seriale. Quando Arduino riceve questo pacchetto di query, risponderà al computer con una serie di pacchetti di risposta. Il pacchetto di risposta sarà composto dalle seguenti righe di codice:
uint16 topic_id string topic_name string message_type string md5sum int32 buffer_size
Questa serie di risposte sarà nei messaggi “rosserial_msgs/TopicInfo”. Quando il computer (ROS) non riceve risposta dal dispositivo seriale, la query verrà inviata nuovamente dal computer. La sincronizzazione tra il ROS e il dispositivo seriale viene gestita inviando informazioni di temporizzazione dal computer al particolare dispositivo.
Le librerie rosserial_client
Le librerie rosserial_client, che troviamo nel sito http://wiki.ros.org/rosserial_client, contengono un'implementazione lato client del protocollo rosserial. Il client può essere una piattaforma di microcontrollore integrata, ad esempio con Arduino, ARM o un altro dispositivo seriale. La libreria rosserial_client può essere eseguita su qualsiasi processore che abbia un compilatore ANSI C++ e un'interfaccia seriale con un computer che esegue ROS. Esistono diversi pacchetti di librerie rosserial_client disponibili per piattaforme specifiche. Di seguito alcune delle librerie rosserial_client:
rosserial_arduino: questo pacchetto aiuta a costruire una libreria Arduino chiamata “ros_lib” che può funzionare come libreria rosserial_client per Arduino. Possiamo includere questa libreria per scrivere nodi client Arduino-ROS. Questo pacchetto consente di creare un client rosserial sulla maggior parte delle piattaforme Arduino, in particolare UNO, Mega e Leonardo.
rosserial_embeddedlinux: questo pacchetto consente di eseguire rosserial_client su sistemi Linux embedded (come router, ecc.).
rosserial_windows: ROS non è completamente supportato su Windows. Se dobbiamo comunicare con qualsiasi applicazione Windows, possiamo utilizzare questo pacchetto per comunicare dal client Windows al ROS.
rosserial_mbed: la maggior parte delle schede basate su controller ARM supporta la programmazione mbed (livello di astrazione hardware), che è simile alla programmazione Arduino. Possiamo programmare schede mbed utilizzando un compilatore online o offline utilizzando un progetto “gcc4embed” che possiamo trovare nel sito https://github.com/adamgreen/gcc4mbed. Il compilatore offline può funzionare solo con un numero limitato di schede, ma il compilatore online può utilizzare nuove schede che supportano mbed.
rosserial_tivac: un'altra scheda controller è la Tiva C Launchpad della Texas Instruments che funziona da 80 a 120 MHz. Le schede come la Tiva C Launchpad supportano l’ambiente di sviluppo integrato “Energia”, simile all’IDE di Arduino, che possiamo trovare andando al sito http://energia.nu. Possiamo programmare Tiva C usando il linguaggio di programmazione Arduino Wiring che troviamo nel sito http://wiring.org.co.
Dopo aver scritto il nodo rosserial in un dispositivo seriale, dobbiamo eseguire un altro nodo lato computer per codificare/decodificare i dati seriali. Ci sono alcuni pacchetti per eseguire questo processo:
rosserial_python: questo pacchetto è comunemente usato per la comunicazione rosserial. Un nodo Python può connettersi al dispositivo seriale e ricevere valori seriali dal dispositivo. Decodificherà i pacchetti seriali e genererà argomenti e servizi ROS che saranno disponibili lato computer. Questo pacchetto è stabile e consigliato per le applicazioni al computer. Useremo rosserial_python lato computer nel progetto dell’interfaccia robotica Arduino-ROS.
rosserial_server: si tratta in realtà di un'implementazione C++ di un ricevitore rosserial e può essere utilizzato per applicazioni ad alte prestazioni. Le caratteristiche di questo nodo sono inferiori rispetto a rosserial_python.
rosserial_java: se si desidera interfacciare ROS con un dispositivo Android, questo pacchetto è la scelta migliore.
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 1860 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.