Capire i ROS Topics

Descrizione: Questo tutorial introduce i ROS topics, oltre all'uso dei seguenti strumenti da command line: rostopic e rqt_plot.

Livello Tutorial: PRINCIPIANTE

Prossimo Tutorial: Capire i ROS services e i parametri

Setup

roscore

Cominciamo assicurandoci di aver avviato roscore in un nuovo terminale:

$ roscore

Se hai lasciato roscore in esecuzione dall'ultimo tutorial, potresti ottenere questo messaggio di errore:

  • roscore cannot run as another roscore/master is already running.
    Please kill other roscore/master processes before relaunching

Va bene. Un solo roscore necessita di essere avviato.

turtlesim

Per questo tutorial useremo anche turtlesim. Per favore, esegui in un nuovo terminale:

$ rosrun turtlesim turtlesim_node

turtle keyboard teleoperation

Avremo anche bisogno di qualcosa per guidare la tartaruga in giro. Per favore, esegui in un nuovo terminale:

$ rosrun turtlesim turtle_teleop_key
  • [ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
    Reading from keyboard
    ---------------------------
    Use arrow keys to move the turtle.

Ora puoi utilizzare i tasti freccia della tastiera per guidare la tartaruga in giro. Se non puoi guidare la tartaruga, seleziona la finestra del terminale del turtle_teleop_key per assicurarti che i tasti che digiti siano registrati.

  • turtle_key.png

Ora che puoi guidare la tua tartaruga in giro, diamo un'occhiata a quello che succede dietro le quinte.

ROS Topics

I nodi turtlesim_node e the turtle_teleop_key sono in comunicazione tra loro su un ROS Topic. turtle_teleop_key sta publishing (pubblicando) le combinazioni dei tasti su un topic, mentre turtlesim subscribes (iscrive) allo stesso topic di ricevere le combinazioni dei tasti. Usiamo rqt_graph per mostrare i nodi e i topic attualmente in esecuzione.

Nota: Se stai usando electric o precedenti, rqt non è disponibile. Usa invece rxgraph.

Usare rqt_graph

rqt_graph crea un graph dinamico di quello che sta succedendo nel sistema. rqt_graph è parte del rqt package. A meno che tu non l'abbia già installato, esegui:

  • $ sudo apt-get install ros-<distro>-rqt
    $ sudo apt-get install ros-<distro>-rqt-common-plugins

rimpiazzando <distro> con il nome della tua distribuzione ROS (fuerte, groovy, etc.)

In un nuovo terminale:

$ rosrun rqt_graph rqt_graph

Vedrai qualcosa simile a:

rqt_graph_turtle_key.png

Se posizioni il tuo mouse sopra /turtle1/command_velocity esso evidenzierà i nodi del ROS (qui blu e verde) e i topics (qui rosso). Come puoi vedere, i nodi turtlesim_node e turtle_teleop_key stanno comunicando sul topic chiamato /turtle1/command_velocity.

rqt_graph_turtle_key2.png

Introduzione rostopic

Il rostopic tool ti permette di ottenere informazioni riguardo i ROS topics.

Puoi usare l'opzione help per vedere quali sub-commands sono disponibili per rostopic

$ rostopic -h
  • rostopic bw     display bandwidth used by topic
    rostopic echo   print messages to screen
    rostopic hz     display publishing rate of topic
    rostopic list   print information about active topics
    rostopic pub    publish data to topic
    rostopic type   print topic type

Usiamo alcuni di questi topic sub-commands per esaminare turtlesim.

Usare rostopic echo

rostopic echo mostra i dati pubblicati su un topic.

Uso:

rostopic echo [topic]

Diamo un'occhiata ai dati pubblicati sul topic /turtle1/command_velocity per mezzo del nodo turtle_teleop_key, in un nuovo terminale (non lavora con hydro):

$ rostopic echo /turtle1/command_velocity

Se stai usando ROS Hydro, prova:

$ rostopic echo /turtle1/cmd_vel

Probabilmente non vedrai nulla perché nessun dato è in corso di pubblicazione sul topic. Facciamo pubblicare i dati da turtle_teleop_key premendo i tasti freccia. Ricorda che se la tartaruga non si sta muovendo, devi selezionare nuovamente il terminale del turtle_teleop_key.

Ora dovresti vedere il seguente quando premi il tasto freccia SU:

  • ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0

O in hydro:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---

Ora diamo un'occhiata di nuovo a rqt_graph (potrebbe essere necessario fare un refresh del ROS graph). Come puoi vedere, rostopic echo, mostrato qui in rosso, ora è anche subscribed (iscritto) al topic turtle1/command_velocity.

rqt_graph_echo.png

Usare rostopic list

rostopic list restituisce un elenco di tutti i topic attualmente subscribed to e published.

Cerchiamo di capire di quale argomento il sub-command list ha bisogno. In un nuovo terminale esegui:

$ rostopic list -h
  • Usage: rostopic list [/topic]
    
    Options:
      -h, --help            show this help message and exit
      -b BAGFILE, --bag=BAGFILE
                            list topics in .bag file
      -v, --verbose         list full details about each topic
      -p                    list only publishers
      -s                    list only subscribers

Per rostopic list usiamo l'opzione verbose:

$ rostopic list -v

Questo mostra un verbose list di topics per publish to e subscribe to e il loro tipo.

  • Published topics:
     * /turtle1/color_sensor [turtlesim/Color] 1 publisher
     * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
     * /rosout [roslib/Log] 2 publishers
     * /rosout_agg [roslib/Log] 1 publisher
     * /turtle1/pose [turtlesim/Pose] 1 publisher
    
    Subscribed topics:
     * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
     * /rosout [roslib/Log] 1 subscriber

ROS Messages

La comunicazione sui topics avviene con l'invio di ROS messages tra i nodi. Affinché il publisher (turtle_teleop_key) e il subscriber (turtlesim_node) possano comunicare, il publisher e il subscriber devono inviare e ricevere lo stesso "message type" (tipo di messaggio). Questo significa che un tipo di topic è definito dal message type pubblicato su quello. Il message type inviato su un topic può essere determinato usando rostopic type.

Usare rostopic type

rostopic type ritorna message type di qualsiasi topic in corso di pubblicazione.

Uso:

rostopic type [topic]

Prova (non per hydro):

$ rostopic type /turtle1/command_velocity
  • Dovresti ottenere:
    turtlesim/Velocity

In hydro, prova:

$ rostopic type /turtle1/cmd_vel
  • Dovresti ottenere:
    geometry_msgs/Twist

Possiamo guardare i dettagli del messaggio usando rosmsg (non per hydro):

$ rosmsg show turtlesim/Velocity
  • float32 linear
    float32 angular

In hydro:

$ rosmsg show geometry_msgs/Twist
  • geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z

Ora che noi sappiamo che tipo di messaggio turtlesim si aspetta, possiamo pubblicare i comandi alla nostra tartaruga:

rostopic continuato

Ora che abbiamo conosciuto i ROS messages, usiamo rostopic con i messaggi.

Usare rostopic pub

rostopic pub pubblica i dati su un topic attualmente reso operativo.

Uso:

rostopic pub [topic] [msg_type] [args]

Esempio (non per hydro):

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8

Esempio per hydro:

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

Il comando precedente invierà un singolo messaggio a turtlesim dicendogli di muoversi con una linear velocity di 2.0, e un angular velocity di 1.8 .

  • turtle(rostopicpub).png

Questo è un esempio piuttosto complicato, cosi diamo un'occhiata in dettaglio ad ogni argomento.

  • rostopic pub
    Questo comando pubblicherà messaggi ad un dato topic.
  •  -1
    (dash-one) Questa opzione fa sì che rostopic possa pubblicare un solo messaggio e poi uscire.
  • /turtle1/command_velocity

    Questo è il nome del topic da pubblicare (<=to publish to ?).

  • turtlesim/Velocity

    Questo è il message type da usare per pubblicare il topic (<=This is the message type to use when publishing the topic).

  • --

    (double-dash) Questo dice all'opzione parser che nessuno dei seguenti argomenti è un'opzione. Questo è richiesto nei casi in cui i tuoi argomenti hanno un primo dash (leading dash) - (come ad esempio con i numeri negativi).

  • 2.0 1.8

    Come notato prima, un turtlesim/Velocity msg ha due elementi floating point: linear e angular. In questo caso, 2.0 diventa il "linear value", e 1.8 e il "angular value". Effettivamente, questi argomenti sono in YAML syntax, che è descritta in modo migliore in YAML command line documentation.

Avrai notato che la tartaruga ha smesso di muoversi; questo perché la tartaruga richiede un flusso costante di comandi a 1 Hz per mantenere il movimento. Noi possiamo pubblicare un flusso costante di comandi usando il comando rostopic pub -r (non per hydro):

$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8

Per hydro:

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

Questo pubblica i "velocity commands" a un ritmo di 1 Hz sul velocity topic.

  • turtle(rostopicpub)2.png

Possiamo anche vedere cosa sta succedendo in rqt_graph, il nodo rostopic pub (qui in rosso) sta comunicando con il nodo rostopic echo (qui in verde):

rqt_graph_pub.png

Come puoi vedere, la tartaruga sta eseguendo un cerchio continuo. In un nuovo terminale, possiamo usare rostopic echo per vedere i dati pubblicati dal nostro turtlesim:

Usare rostopic hz

rostopic hz riporta il ritmo con il quale i dati sono pubblicati.

Uso:

rostopic hz [topic]

Vediamo quanto velocemente il turtlesim_node sta pubblicando /turtle1/pose:

$ rostopic hz /turtle1/pose

Vedrai:

  • subscribed to [/turtle1/pose]
    average rate: 59.354
            min: 0.005s max: 0.027s std dev: 0.00284s window: 58
    average rate: 59.459
            min: 0.005s max: 0.027s std dev: 0.00271s window: 118
    average rate: 59.539
            min: 0.004s max: 0.030s std dev: 0.00339s window: 177
    average rate: 59.492
            min: 0.004s max: 0.030s std dev: 0.00380s window: 237
    average rate: 59.463
            min: 0.004s max: 0.030s std dev: 0.00380s window: 290

Ora possiamo dire che il turtlesim sta pubblicando dati sulla nostra tartaruga ad un ritmo di 60 Hz. Possiamo anche usare rostopic type in congiunzione con rosmsg show per ottenere informazioni approfondite su un topic (non per hydro):

$ rostopic type /turtle1/command_velocity | rosmsg show

In hydro:

rostopic type /turtle1/cmd_vel | rosmsg show

Ora che abbiamo esaminato i topics usando rostopic, usiamo un altro tool per vedere i dati pubblicati dal nostro turtlesim:

Usare rqt_plot

Nota: Se stai usando electric o precedenti, rqt non è disponibile. Usa invece rxplot.

rqt_plot mostra uno "scrolling time plot" dei dati pubblicati sui topic. Qui noi useremo rqt_plot per tracciare i dati che vengono pubblicati sul topic /turtle1/pose. Prima di tutto, avvia rqt_plot digitando in un nuovo terminale

$ rosrun rqt_plot rqt_plot

Nella nuova finestra che dovrebbe apparire, un text box in alto a sinistra ti dà la possibilità di aggiungere qualsiasi topic al plot (trama). Digitando /turtle1/pose/x sarà messo in evidenza il tasto più, precedentemente disabilitato. Premilo e ripeti la stessa procedura con il topic /turtle1/pose/y. Ora vedrai la posizione x-y della tartaruga riportata sul grafico.

rqt_plot.png

Premendo il tasto meno, mostra un menu che ti permette di nascondere il topic specificato dal plot. Nascondendo entrambi i topic che hai appena aggiunto, e aggiungendo /turtle1/pose/theta, risulterà nel plot mostrato nella figura successiva.

rqt_plot2.png

E' tutto per questa sezione. Usa Ctrl-C per killare i terminali del rostopic ma mantieni il tuo turtlesim in esecuzione.

Ora che hai capito come lavorano i ROS topics, diamo un'occhiata a come services e parameters lavorano.

Wiki: it/ROS/Tutorials/UnderstandingTopics (last edited 2014-04-02 07:49:28 by Il_Voza)