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
Contents
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.
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:
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.
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.
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 .
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.
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):
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.
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.
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.