== 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|rosservice]] e [[rosparam|rosparam]]. '''Livello Tutorial:''' PRINCIPIANTE '''Prossimo Tutorial:''' [[it/ROS/Tutorials/UsingRqtconsoleRoslaunch|Usare rqt_console e roslaunch]] <> 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`. . {{http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParams?action=AttachFile&do=get&target=turtlesim.png|turtlesim.png|class="attachment"}} 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: . {{http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParams?action=AttachFile&do=get&target=turtle(service).png|turtle(service).png|class="attachment"}} === Usare rosparam === `rosparam` ti permette di memorizzare e manipolare dati sul ROS [[Parameter%20Server|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: . {{http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParams?action=AttachFile&do=get&target=turtle(param).png|turtle(param).png|class="attachment"}} 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, [[it/ROS/Tutorials/UsingRqtconsoleRoslaunch|proviamo ad usare rqt_console e roslaunch]]