Capire i ROS Nodes
Descrizione: Questo tutorial introduce i concetti del ROS graph e discute l'uso dei seguenti strumenti da command line: roscore, rosnode, e rosrun.
Livello Tutorial: PRINCIPIANTE
Prossimo Tutorial: Capire i ROS topics
Contents
Prerequisiti
Per questo tutorial useremo un leggero simulatore, si prega di installarlo usando:
$ sudo apt-get install ros-<distro>-ros-tutorials
Rimpiazza '<distro>' con il nome della tua distribuzione ROS (e.g. electric, fuerte, groovy etc.)
Anteprima veloce dei concetti sul Graph
Nodes: Un nodo è un eseguibile che usa ROS per comunicare con altri nodi.
Messages: sono dei ROS data type usati al momento del "subscribing" o "publishing" di un topic.
Topics: I nodi possono pubblicare messaggi a un topic oltre che iscriversi a un topic per ricevere messaggi.
Master: Name service per ROS (i.e. aiuta un nodo a trovare gli altri nodi)
rosout: equivalente ROS del stdout/stderr
roscore: Master + rosout + parameter server (parameter server sarà introdotto più in avanti)
Nodi
Un nodo in realtà non è altro che un file eseguibile all'interno di un ROS package. I nodi del ROS usano una libreria del ROS client per comunicare con altri nodi. I nodi possono pubblicare o iscriversi a un Topic. I nodi possono anche fornire o usare un Servizio.
Librerie del Client
Le librerie del ROS client permettono ai nodi scritti con diversi linguaggi di programmazione di comunicare:
- rospy = python client library
- roscpp = c++ client library
roscore
roscore è la prima cosa che dovresti eseguire quando usi ROS.
Esegui:
$ roscore
Vedrai qualcosa simile a:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]
Se roscore non inizializza nulla, probabilmente hai un problema di comunicazione sulla rete. Vedi Network Setup - Single Machine Configuration
Se roscore non inizializza nulla e invia un messaggio riguardo la mancanza di permessi, probabilmente il folder ~/.ros è proprietà del root, cambia ricorsivamente la proprietà di quel folder con:
$ sudo chown -R <your_username> ~/.ros
Usare rosnode
Apri un nuovo terminale, e usiamo rosnode per vedere cosa roscore stava eseguendo...
Nota: Quando si apre un nuovo terminale, il tuo ambiente è resettato e il file ~/.bashrc è (sourced-->?). Se hai problemi nell'eseguire comandi come rosnode allora puoi aver bisogno di aggiungere alcuni setup files dell'ambiente al tuo ~/.bashrc o manualmente (re-source them-->).
rosnode mostra informazioni sui ROS nodes che sono in esecuzione. Il comando rosnode list elenca questi nodi attivi:
$ rosnode list
- Vedrai:
/rosout
Questo ci ha mostrato che c'é solo un nodo in esecuzione: rosout. Questo è sempre in esecuzione in quanto raccoglie e registra il debugging output dei nodi.
Il comando rosnode info restituisce informazioni su uno specifico nodo.
$ rosnode info /rosout
Questo ci ha dato qualche informazione in più su rosout, come il fatto che esso pubblica /rosout_agg.
------------------------------------------------------------------------ Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://machine_name:54614/ ... Pid: 5092
Ora, vediamo qualcosa di più sui nodi. Per questo, useremo rosrun per "far apparire" (<= to bring up) un altro nodo.
Usare rosrun
rosrun permette di usare il nome del package per eseguire direttamente un nodo all'interno del package (senza dover conoscere il percorso del package).
Uso:
$ rosrun [package_name] [node_name]
Cosi ora possiamo eseguire il turtlesim_node nel turtlesim package.
Poi, in un nuovo terminale:
$ rosrun turtlesim turtlesim_node
Vedrai la finestra del turtlesim:
NOTA: La tartaruga potrebbe essere diversa nella tua finestra del turtlesim. Non preoccuparti per questo - ci sono molti tipi di tartaruga e la tua è una sorpresa!
In un nuovo terminale:
$ rosnode list
Vedrai qualcosa simile a:
/rosout /turtlesim
Una potente caratteristica del ROS è che puoi riassegnare i Nomi da command-line.
Chiudi la finestra del turtlesim per fermare il nodo (o torna al terminale del rosrun turtlesim e usa ctrl-C). Ora ri-eseguiamolo, ma questa volta usa un Remapping Argument per cambiare il nome del nodo:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
Ora, se andiamo indietro e usiamo rosnode list:
$ rosnode list
- Vedrai qualcosa simile a:
/rosout /my_turtle
Nota: Se vedi ancora /turtlesim nell'elenco, potrebbe significare che hai fermato il nodo nel terminale con ctrl-C invece di chiudere la finestra, oppure che non hai definito la variabile dell'ambiente $ROS_HOSTNAME come descritto in Network Setup - Single Machine Configuration. Puoi provare a pulire l'elenco del rosnode con: $ rosnode cleanup
Vediamo il nostro nuovo nodo /my_turtle. Usiamo un altro comando del rosnode, ping, per testare che è up:
$ rosnode ping my_turtle
rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms
Review
Cosa è stato visto:
- roscore = ros+core : master (fornisce il name service per ROS) + rosout (stdout/stderr) + parameter server (parameter server sarà introdotto più in avanti)
- rosnode = ros+node : ROS tool per ottenere informazioni su un nodo.
- rosrun = ros+run : esegue un nodo da un dato package.
Ora che hai capito come lavorano i nodi in ROS, diamo un'occhiata a come lavorano i ROS topics. Inoltre, sentiti libero di premere Ctrl-C per fermare turtlesim_node.