Il Robot Operating System o meglio noto come ROS è un framework open-source per lo sviluppo di applicazioni nel campo della robotica o dell’automazione industriale, spesso viene definito un sistema operativo per robot. Nell’articolo precedente è stato introdotto ROS e sono state illustrate le varie possibili applicazioni significative per l’industria 4.0.
In questo articolo si entrerà sempre di più nella parte tecnica, verranno mostrati i vari strumenti contenuti nel framework ROS e seguirà, per concludere, una semplice guida che mostra i passaggi da effettuare per installare ed avviare correttamente il Robot Operating System su un computer Raspberry Pi. Prima di proseguire è importante soffermarsi sul file system di ROS e sulla terminologia utilizzata per descrivere i vari componenti interni del framework.
File system e terminologia
Come scritto precedentemente, ROS viene definito un sistema operativo per robot, uno dei motivi è il suo File System, molto simile a quello di un sistema operativo. Nel File System di ROS troviamo i Packages, Meta-packages, Manifests, Repositories, Message types e Services type. Il software ROS è organizzato in diversi pacchetti chiamati Packagese ogni singolo pacchetto corrisponde ad un singolo programma. Ogni pacchetto contiene al suo interno tutti i file di configurazione, il codice sorgente, le dipendenze, librerie e i file compilati. Ogni singolo Packageviene rappresentato da una cartella, normalmente rinominata con il nome dell’applicativo, con all’interno diverse sottocartelle che includono i diversi file.
In figura è rappresentata una struttura basica di un ROS Package. Il nome dell’applicativo e della cartella che contiene il package è “hello_world” mentre ogni sottocartella è rinominata in un modo specifico in base alla funzionalità che ha.
- msgs: contiene i file relativi ai tipi di messaggi consentiti.
- include: contiene i file headers C/C++ del codice sorgente
- src: contiene i file sorgente
- srv: contiene i file relativi ai tipi di servizi offerti dal package
- scripts: contiene gli script di esecuzione
- package.xml: è il file Manifest del package e include tutte le informazioni e le caratteristiche del package stesso.
Di seguito vengono elencati tutti i termini associati all’ecosistema ROS con le rispettive descrizioni:
- ROS Nodes: Sono i diversi processi o eseguibili che utilizzano ROS per comunicare tra di loro.
- ROS Master: È un programma intermedio utilizzato per portare in collegamento i vari nodi.
- ROS Parameter Server: È un componente del ROS master. L’utente può impostare e memorizzare vari parametri sul server in modo che tutti i nodi possono accedervi. È anche possibile impostare dei permessi per ogni parametro in modo da renderlo pubblico, e quindi accessibile da tutti i nodi, oppure privato in modo da essere accessibile solo da alcuni nodi.
- ROS Topics: Sono dei percorsi specifici su cui i nodi ROS possono trasmettere un messaggio. Ogni nodo può pubblicare o abbonarsi ad un certo numero di topics.
- ROS Message: Comprendono le diverse tipologie di messaggi che vengono trasmessi dai nodi tramite i topics. Possono essere di tipo primitivo (integer, float, string, ecc.) oppure personalizzati.
- ROS Service: Simile ai topics ma vengono utilizzati quando si ha la necessità di avere un collegamento tra nodi basato su un meccanismo di richiesta e risposta.
- ROS Bags: Sono dei contenitori in cui è possibile salvare e riprodurre i topics. Sono anche utili per registrare dei dati da un robot ed elaborarli successivamente.
Strumenti ROS
Il framework ROS include diversi utili strumenti preinstallati che permettono di esplorare e analizzare tutta la rete ROS. Ogni singolo strumento può essere eseguito tramite riga di comando con il terminale Linux. Tra i comandi più utili troviamo: roscore, rosnode, rostopic, rosversion, rosparam, roslaunch e infine rosrun.
Il comando roscore forse è quello più importante poiché bisogna utilizzarlo per avviare la rete ROS. Infatti, con il suo lancio viene avviato il ROS Master, seguito dal ROS Parameter Server e un nodo di registrazione. È il primo comando da eseguire dopo l’accensione del computer, dopodiché sarà possibile avviare tutti i vari nodi.
Con il comando rosnode è possibile esplorare gli aspetti di un nodo e le relative informazioni collegate. Con lo stesso rosnode è possibile anche ottenere una lista dei nodi in esecuzione sul computer tramite il seguente comando:
$ rosnode list
Il comando rostopic, invece, fornisce informazioni sui vari topics di publishing e subscribing presenti nel sistema. Utile soprattutto per avere una lista dei topics disponibile e per testarli. Infatti, tramite i seguenti comandi è possibile ottenere una lista, stampare i messaggi che vengono pubblicati su uno specifico topic (nell’esempio il topic è chiamato chatter) e pubblicare dati su un topic:
$ rostopic list
$ rostopic echo /chatter
$ rostopic pub /hello std_msgs/String “Hello”
Con rosversion è possibile conoscere informazioni sulla versione di ROS installata nel computer, mentre rosparam può essere utile per conoscere i vari parametri caricati sul ROS Parameter Server e, volendo, modificarli o consultarli semplicemente:
$ rosversion -d $ rosparam list $ rosparam set <parameter_name> <value> $ rosparam get <parameter_name>
Un ulteriore comando frequentemente utilizzato in ROS è il comando roslaunch. È molto utilizzato quando bisogna avviare diversi nodi ed evitare di doverli eseguire uno per volta. I file ROS launch sono file XML in cui è possibile inserire una lista dei nodo che si desidera eseguire. Un ulteriore vantaggio di roslaunch è che quando viene avviato, verrà avviato di conseguenza anche il comando roscore che, come descritto precedentemente, è essenziale per il corretto funzionamento di ROS. Se invece c’è un solo nodo da avviare, allora può essere utilizzato semplicemente il comando rosrun:
$ roslaunch <ros_package_name> <launch_file_name> $ rosrun <ros_package_name> <node_name>
Oltre ai vari strumenti da riga di comando visti finora, ROS mette a disposizione anche tool con interfaccia grafica sfruttabili per visualizzare e analizzare i diversi dati provenienti dai nodi, costruire grafici e fare delle simulazioni 3D. Tra questi citiamo RViz, ottimo per la costruzione di grafici tridimensionali, e Rqt, utile per la costruzione di una dashboard personalizzata su cui poter posizionare diversi componenti per la visualizzazione dei dati, come grafici 2D o semplici label, oppure per l’invio di messaggi sui vari topic, tramite pulsanti, slider ecc..
Installazione ROS su Raspberry Pi
Per sfruttare appieno tutte le potenzialità di ROS è importante farlo girare su un sistema operativo Linux e preferibilmente su una distribuzione Ubuntu o Debian. Da Raspberry Pi 4 in su è possibile installare una distribuzione Ubuntu su architettura arm64, ciò permette di avere piena compatibilità con tutti gli strumenti e le repository open-source di ROS. È consigliabile quindi installare una distribuzione Ubuntu 20.04 LTS sulla board Raspberry Pi anziché il sistema operativo ufficiale, ovvero Raspberry Pi OS (ex-Raspbian).
Anche per quanto riguarda ROS esistono diverse distribuzioni con diversi tools e compatibilità sui vari sistemi operativi, compreso Windows e MacOS. Per questo tutorial è stata scelta la distribuzione ROS Noetic, pienamente compatibile con Ubuntu 20.04.
Tutto sommato, grazie ad Ubuntu e con qualche comando da eseguire da terminale l’installazione di ROS è immediata.
Innanzitutto, come scritto precedentemente, occorre avere almeno un Raspberry Pi 4 con sistema operativo Ubuntu 20.04 LTS per architettura arm64. Il primo passo è quello di scaricare la versione da 64-bit Ubuntu Server 20.04 LTS dal sito ufficiale di Ubuntu e seguire la guida ufficiale (link) per l’installazione su Raspberry Pi.
Di seguito verranno elencati i vari comandi da eseguire da terminale per l’installazione del framework ROS successivamente al primo avvio di Ubuntu:
$ sudo sh -c ‘echo “deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” > /etc/apt/sources.list.d/ros-latest.list’ $ sudo apt-key adv --keyserver ‘hkp://keyserver.ubuntu.com:80’ --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt update $ sudo apt install ros-noetic-desktop-full
I comandi precedenti sono sufficienti per l’installazione di ROS. Tuttavia può essere utile avviare l’environment ROS ogni volta che viene aperto un nuovo terminale Linux tramite i seguenti comandi:
$ echo “source /opt/ros/noetic/setup.bash” >> ~/.bashrc $ source ~/.bashrc
Per concludere con la configurazione del ROS, è stato creato un ROS workspace in cui inserire tutto il codice sorgente dei vai packages:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash