In questo tutorial vedremo come sia possibile configurare ROS per funzionare su più macchine connesse attraverso la rete, espandendo le possibilità per i tuoi progetti.
La configurazione iniziale parte da un nodo publisher minimale chatter.py appartenente al pacchetto chatter, con un singolo publisher di stringhe.
roscore
Consideriamo che un roscore per poter essere eseguito necessita di una configurazione iniziale di due variabili principali all’interno del nostro terminale (che sono inizializzate con un valore di default).
ROS_MASTER_URI Definisce l’indirizzo della macchina che avrà il ruolo di “master” per la nostra rete di ROS. La sua struttura è definita come
http://< indirizzo_della_macchina>:11311
ROS_HOSTNAME Definisce l’indirizzo della macchine ospite (quella che vogliamo che sia in grado di comunicare con il roscore), tipicamente l’ip della macchina che stiamo configurando.
Possiamo leggere il contenuto di queste due variabili con le seguenti istruzioni:
echo $ROS_MASTER_URI
# Output: http://4_xterm:11311
echo $ROS_HOSTNAME
# Output: 4_xterm
Come puoi vedere il nome dell’ospite e del master corrente è settato con un nome simbolico a causa dell’implementazione dei Rosject, nella tua macchina potresti vedere “localhost” o un indirizzo specifico se hai già modificato le variabili.
Ora, possiamo provare a runnare un roscore in un primo terminal, e a osservare il suo output.
roscore
# Output: process[master]: started with pid [4295]
# ROS_MASTER_URI=http://4_xterm:11311/
Possiamo notare quindi, come previsto, il ROS_MASTER_URI settato sulla macchina corrente.
Settare il roscore per connettere altre macchine
All’interno della macchina su cui vogliamo far girare il roscore e ospitare altre macchine (tipicamente la nostra macchina) dovremo cambiare i valori all’interno delle due variabili già menzionate.
All’interno della macchina che vogliamo utilizzare come ospite (tipicamente il nostro robot, o i nostri robot) dovremmo fare lo stesso, ma con valori differenti.
Vediamo quindi nel dettaglio come impostare questi valori.
Macchina ospitante
ROS_MASTER_URI dovrà essere impostato con l’ip della macchina all’interno della nostra rete. Per trovare questo ip si possono utilizzare le impostazioni di rete, del router, o anche comandi da terminale come ifconfig
o ip addr
. Poiché lavoreremo su un solo Rosject, utilizzeremo l’indirizzo corrispondente al localhost.
Assumiamo quindi che la nostra macchina abbia come indirizzo 127.0.0.1. In una prima shell eseguiamo:
export ROS_MASTER_URI=http://127.0.0.1:11311
export ROS_HOSTNAME=127.0.0.1
ROS_HOSTNAME sarà l’ip stesso della macchina.
Faremo lo stesso in una seconda shell, per scopo di testing.
Macchina ospite (e.g. robot)
ROS_MASTER_URI dovrà essere impostato con l’ip della macchina ospitante all’interno della nostra rete. Perciò utilizzeremo lo stesso comando della configurazione sulla macchina ospitante. In una terza shell, eseguiamo:
export ROS_MASTER_URI=http://127.0.0.1:11311
Per quanto riguarda ROS_HOSTNAME dovremo usare invece l’ip della macchina ospite, recuperabile con gli stessi metodi già menzionati. Assumiamo quindi che il nostro robot abbia come indirizzo ip 127.0.0.42.
export ROS_HOSTNAME=127.0.0.42
A questo punto le due macchine saranno in grado di comunicare e di avere accesso a tutti i messaggi pubblicati all’interno della rete e di pubblicare a loro volta.
Considerazioni importanti per questo rosject
Quando si cambiano i valori di queste variabili, la modifica sarà limitata alla shell su cui viene invocato il comando. Di fatto, aprendo una nuova shell, essa avrà nuovamente le variabili settate con i valori di default.
Sicuramente è possibile inserire i due comandi nel file ~/.bashrc
, ma in questo caso non lo faremo per verificare l’effetto della modifica.
Test del nostro nodo
Nella terza shell (che sarebbe eseguita sul robot), possiamo quindi lanciare l’esecuzione del nostro nodo chatter (che possiamo interpretare come un nodo nel nostro robot che pubblica lo stato di un sensore).
rosrun chatter chatter.py
Grazie alla stampa ad output possiamo notare che il nodo inizia a inviare messaggi.
Andando quindi nella seconda shell (che si troverebbe sulla macchina del master) possiamo andare a stampare la lista dei topic pubblicati.
rostopic list
Ecco qui, anche se ci troviamo su una macchina differente, riceviamo i messaggi mandati dal nostro robot.
Osservazione
Se proviamo ad aprire una quarta shell, che quindi sarà configurata con i valori di default (a meno che le istruzioni di export non siano state messe nel file ~/.bashrc
), questa shell non sarà in grado di interagire con il roscore, nemmeno se aperta sulla stessa macchina del master.
La configurazione dovrà essere ripetuta per ogni shell aperta, in accordo con la macchina su cui viene aperta (vedi differenze tra macchina ospitante e macchina ospite), oppure per comodità si potrà utilizzare il file ~/.bashrc
.
0 Comments