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

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:

  • http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes?action=AttachFile&do=get&target=turtlesim.png

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.

Wiki: it/ROS/Tutorials/UnderstandingNodes (last edited 2013-10-20 22:27:18 by Il_Voza)