Capire i ROS Services e Parameters
Descrizione: Questo tutorial introduce i ROS services e parameters, oltre all'uso dei seguenti strumenti da command line: rosservice e rosparam.
Livello Tutorial: PRINCIPIANTE
Prossimo Tutorial: Usare rqt_console e roslaunch
Contents
Supponendo che il tuo turtlesim_node è ancora in esecuzione dall'ultimo tutorial, diamo un'occhiata a quali servizi turtlesim offre:
ROS Services
Services sono un altro modo con cui i nodi possono comunicare tra di loro. Services permettono ai nodi di inviare una request e ricevere un response.
Usare rosservice
rosservice può facilmente collegare il ROS's client/service framework con i services. rosservice ha molti comandi che possono essere usati sui topics, come mostrato sotto:
Uso:
rosservice list print information about active services rosservice call call the service with the provided args rosservice type print service type rosservice find find services by service type rosservice uri print service ROSRPC uri
rosservice list
$ rosservice list
Il comando list ci mostra che il turtlesim node offre nove services: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, e turtlesim/set_logger_level. Ci sono anche due services relativi al nodo indipendente rosout: /rosout/get_loggers e /rosout/set_logger_level.
/clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /teleop_turtle/get_loggers /teleop_turtle/set_logger_level /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level
Diamo un'occhiata più da vicino al clear service usando rosservice type:
rosservice type
Uso:
rosservice type [service]
Scopriamo di che tipo è il clear service:
$ rosservice type clear
std_srvs/Empty
Questo service è vuoto, questo significa che quando si fa la service call, essa non prende argomenti (i.e. essa non invia dati quando crea una request e non riceve dati quando riceve un response). Chiamiamo questo service usando rosservice call:
rosservice call
Uso:
rosservice call [service] [args]
Qui la chiameremo senza argomenti perché il service è del tipo vuoto:
$ rosservice call clear
Questo fa cosa noi ci aspettiamo, ovvero azzera il background del turtlesim_node.
Diamo un'occhiata al caso in cui il service ha argomenti dando un'occhiata all'informazione per il service spawn:
$ rosservice type spawn| rossrv show
float32 x float32 y float32 theta string name --- string name
Questo service ci permette di creare una nuova tartaruga in una determinata locazione e orientamento. Il campo name è opzionale, quindi cerchiamo di non dare un nome alla nostra tartaruga e lasciamo che turtlesim crei un nome per noi.
$ rosservice call spawn 2 2 0.2 ""
La service call restituisce il nome della tartaruga creata di recente
name: turtle2
Ora il nostro turtlesim dovrebbe mostrare questo:
Usare rosparam
rosparam ti permette di memorizzare e manipolare dati sul ROS Parameter Server. Il Parameter Server può memorizzare integers, floats, boolean, dictionaries, e liste. rosparam usa il YAML markup language per la sintassi. In casi semplici, YAML sembra molto naturale: 1 è un integer, 1.0 è un float, one è una stringa, true è un boolean, [1, 2, 3] è una lista di integers, e {a: b, c: d} è un dictionary. rosparam ha molti comandi che possono essere usati sui parameters, come mostrato sotto:
Uso:
rosparam set set parameter rosparam get get parameter rosparam load load parameters from file rosparam dump dump parameters to file rosparam delete delete parameter rosparam list list parameter names
Diamo un'occhiata a quali parameters si trovano attualmente sul param server:
rosparam list
$ rosparam list
Qui possiamo vedere che il turtlesim node ha tre parameters sul param server per il background color:
/background_b /background_g /background_r /roslaunch/uris/aqy:51932 /run_id
Cambiamo uno dei valori del parameter usando rosparam set:
rosparam set e rosparam get
Uso:
rosparam set [param_name] rosparam get [param_name]
Qui cambieremo il red channel del background color:
$ rosparam set background_r 150
Questo cambia il valore del parameter, ora noi dobbiamo chiamare il clear service affinché la modifica del parameter abbia effetto:
$ rosservice call clear
Ora il nostro turtlesim mostrerà questo:
Ora diamo un'occhiata ai valori degli altri parameters sul param server. Prendiamo il valore del green background channel:
$ rosparam get background_g
86
Possiamo anche usare rosparam get / per mostrare i contenuti dell'intero Parameter Server.
$ rosparam get /
background_b: 255 background_g: 86 background_r: 150 roslaunch: uris: {'aqy:51932': 'http://aqy:51932/'} run_id: e07ea71e-98df-11de-8875-001b21201aa8
Potresti voler memorizzare questo in un file, in modo che tu possa ricaricarlo in futuro quando vuoi. Questo è facile, basta usare rosparam:
rosparam dump e rosparam load
Uso:
rosparam dump [file_name] rosparam load [file_name] [namespace]
Qui scriviamo tutti i parameters al file params.yaml
$ rosparam dump params.yaml
Puoi anche caricare questi yaml files dentro nuovi namespaces, e.g. copy:
$ rosparam load params.yaml copy $ rosparam get copy/background_b
255
Ora che hai capito come ROS services e params lavorano, proviamo ad usare rqt_console e roslaunch