Dopo aver terminato l’installazione del nostro ambiente, è giunto il momento di scrivere il primo programma ROS.

In questo articolo ti mostrerò come creare il tuo workspace dove andare poi a scrivere codice, e ti mostrerò più da vicino cosa sono i package e i nodi.

Creiamo il Workspace!

Partiamo subito creando il nostro primo Catkin workspace, passo essenziale per poter partire con qualsiasi progetto.
Apriamo quindi il nostro terminale e creiamo le cartelle che andranno a contenere il nostro progetto:

Copy to Clipboard

Passiamo ora a generare il workspace vero e proprio; avendo cura di essere nella cartella principale di progetto (ros_ws), digitiamo il seguente comando:

Copy to Clipboard

Se tutto è andato a buon fine, dovresti vedere che catkin_make ha generato una serie di cartelle all’interno di ros_ws:

Copy to Clipboard

Entrando dentro la cartella src, possiamo notare che è stato generato un link simbolico chiamato CMakeLists.txt, essenziale per il funzionamento del workspace:

Copy to Clipboard

E’ proprio nella cartella src che andremo a scrivere tutto il codice del nostro progetto. Ogni volta che si aggiungerà o modificherà qualcosa in questa cartella, dovremo tornare nella cartella principale di progetto (ros_ws) e rilanciare il comando di compilazione del workspace:

Copy to Clipboard

Ultimo step che ci resta da fare, similmente a quanto fatto durante l’installazione di ROS, è fare il source del nostro workspace. Partendo dalla cartella di progetto ros_ws raggiungiamo la cartella devel e verifichiamone il contenuto:

Copy to Clipboard

Il file di nostro interesse è setup.bash, lanciamo quindi il comando:

Copy to Clipboard

Questa procedura di source del progetto va fatta ogni qual volta si apre un nuovo terminale.

Per essere sicuro di non dover rifare questo procedimento ogni volta che si apre un nuovo terminale, puoi aggiungere il comando nel file di sistema bashrc:

Copy to Clipboard

Così facendo siamo sicuri che ogni volta verrà aperto un nuovo terminale, questo sarà già pronto per funzionare con il workspace appena creato.

I Package

Per eseguire codice in ROS è fondamentale il concetto di package.
Questi permettono di dividere il codice in parti indipendenti e riusabili in differenti progetti.

Partiamo creandone uno semplice così da prendere confidenza con la procedura.
Raggiungiamo la cartella src di progetto e digitiamo il comando di creazione di un package seguito dal nome che vogliamo dare al modulo e gli eventuali package di riferimento:

Copy to Clipboard

Come avrai intuito abbiamo appena generato un package di nome macheronte_tutorial che ha le seguenti dipendenze:

  • roscpp: pacchetto di riferimento che estende il supporto alla programmazione C++;
  • rospy: analogo del precedente per Python;
  • std_msgs: pacchetto di comunicazione.

Arrivati a questo punto, possiamo vedere come nella cartella src sia stata generata una nuova cartella avente il nome del pacchetto che abbiamo appena creato. Entrando all’interno di questa cartella, vedrai che contiene diverse entità, tra cui un’ulteriore cartella src.

Copy to Clipboard

Avremo modo di approfondire l’utilità di questi file più in là, adesso apriamo un nuovo terminale, torniamo nella cartella principale di progetto e lanciamo un comando di make:

Copy to Clipboard

Così facendo il compilatore di ROS genererà il tuo primo package.

I Nodi

I nodi sono dei programmi eseguiti all’interno dei nostri package.

Ad esempio, immagina di aver creato un pacchetto per la gestione di una telecamera. Fintanto che non scriviamo codice all’interno, un pacchetto non può fornire alcuna utilità.

Per poter gestire una telecamera dunque, avremo bisogno ad esempio di:

  • driver telecamera: programma che gestisce la comunicazione a basso livello con il dispositivo.
  • image processing: programma che una volta recuperato un frame ne effettua alcune modifiche di base per migliorare la resa dell’immagine.

Ognuno di questi programmi sono nodi che vengono eseguiti indipendentemente l’uno dall’altro. Per permettere a due nodi dello stesso o di differenti package di comunicare tra loro, andremo ad usare dei tool nativi di ROS che avremo modo di approfondire più avanti.

I benefici di questo approccio sono principalmente

  • migliore gestione della complessità del codice: potendo dividere il codice in sottoparti riusabili, diventa più semplice poi mantenerli nel tempo e ridurre al minimo i bug presenti.
  • maggiore tolleranza alle eccezioni: essendo ogni nodo indipendente l’uno dall’altro, eventuali crash non coinvolgeranno gli altri nodi ma solo quello direttamente interessato. Ciò permette di mantenere in piedi il nostro applicativo anche in caso di problematiche inattese.
  • language agnostic: ogni nodo può essere scritto in diversi linguaggi a seconda delle richieste di performance che il nodo dovrà soddisfare.

Conclusioni

Bene, abbiamo visto come è facile in ROS generare il woskpace dove poi sviluppare il nostro progetto.

Siamo passati poi ad introdurre il concetto di package e a vedere quali sono i comandi per crearne uno. Ci siamo soffermati poi sul concetto di nodo e su quali sono le caratteristiche principali.

Nella prossima lezione andremo a vedere come creare il nostro primo nodo in Python e in C++.