“Robot Operating System”
R.O.S.
Robot Operating System
A cura di:
Jonathan Cacace
“Robot Operating System”
Contatti
Jonathan Cacace @ Prisma lab, DIETI.
jonathan.cacace@gmail.com wpage.unina.it/jonathan.cacace
Link alle slide: wpage.unina.it/jonathan.cacace/resources
“Robot Operating System”
Outline
- Parte 1:
- Introduzione - Architettura
- Infrastruttura di cumunicazione
- Parte 2:
- Comandi base ROS - Tutorial
- Tipi di file ROS - Riferimenti
“Robot Operating System”
Introduzione
ROS: meta sistema operativo per la programmazione dei robot .
“ROS: è un framework di programmazione che mette a disposizione strumenti e librerie per aiutare gli sviluppatori software nello sviluppo di
applicazioni robotiche.”
[ www.ros.org ]
Il framework offre strumenti e librerie per ottenere, compilare ed eseguire
codice su diversi «computer»
“Robot Operating System”
Introduzione
Sviluppato inizialmente per soddisfare le necessità di programmazione della piattaforma PR2 da «Willow
Garage» (già strumenti come openCv)
“Robot Operating System”
Introduzione
“Robot Operating System”
Introduzione
Non è necessario conoscere l’hardware per cui si sta sviluppando il codice, trattando questo come una black box.
“Robot Operating System”
Introduzione
Semplifica la fase di progettazione/scrittura del codice, fornendo gli strumenti per impostare facilmente un codice modulare.
“Robot Operating System”
Introduzione
ROS è ormai uno standard nello sviluppo di applicazioni robotiche nell’ambito della ricerca. Questo ha permesso la nascita di una
community molto seguita:
Repository, Wiki, blogs...
“Robot Operating System”
Feature
ROS Feature:
- Linguaggi di programmazione: C++, Python.
- Insieme di pacchetti software già testati e funzionanti.
- Insieme di strumenti per la gestione e la compilazione del codice.
- Protocolli di comunicazione sincroni/asincroni per lo scambio di informazioni tra blocchi di codice separati.
- Software open source, rilasciato sotto licenza BSD.
“Robot Operating System”
Architettura
Main Librerie Applicazioni
Livello trasparente all’utente – funzionalità principali del framwork (strumenti di compilazione, ROS API, infrastruttura di
comunicazione,…).
Librerie per l’utilizzo di sistemi hardware esterni (kinect) o software standalone (pcl,
openCV, software di simulazione…).
Moduli software sviluppati dagli utenti.
ROS è disponibile per diverse distribuzioni Linux (consigliato Ubuntu), disponibile anche per OsX e Windows (Sperimentali).
“Robot Operating System”
Architettura
ROS File system:
- Pacchetti: sono l’unità principale per orgranizzazione del software in ros. Un «pacchetto» è rappresentato dal programma scritto dall’utente ed ha un suo scopo. E’ diviso in nodi.
- Manifest.
- Message type.
- Service type.
- File di launch.
“Robot Operating System”
Architettura
rosnode roscore
Gestisce l’esecuzione parallela di tutti i nodi mandati in esecuzione e ne permette la
comunicazione
Codice sviluppato dall’utente o dalla community.
ROS File system: rosnode
roscore
rosnode
rosnode
“Robot Operating System”
Filosofia
rosnode
Input message
Output message
“Robot Operating System”
Filosofia
rosnode
Un nodo identifica un particolare modulo del sistema, la possibilità di gestire l’interoperabilità tra i vari nodi attraverso dei semplici messaggi
permette la creazione di un codice con basso accoppiamento.
Modularità:
“Robot Operating System”
Filosofia
Permettono l’astrazione di dispositivi hardware a basso livello:
• Joystick;
• Kinect – (rgbd camera)
• GPS;
• Controller;
• Laser e sonar;
Popular package:
• Simulazione: Simulatori di ambienti 2D/3D (Stage / Gazebo).
• Navigazione: Odometria, flusso sensoriale, pose estimation…
• SLAM: Simultanea localizzazione e mapping.
• Percezione: point cloud processing (PCL), openCV…
“Robot Operating System”
Filosofia
We don’t reinvent the wheel... [ Ros eng ]
- OpenCV - computer vision
- Eigen - matrix algebra
- ODE+Gazebo - simulazione
- KDL - cinematica e dinamica
- TREX - pianificazione di alto livello - OpenNi - gestione dispositivi rgb-d - …
- … - …
“Robot Operating System”
Filosofia
Codice Utente
Modulo ROS
Data_request()
Data_sensor
Trasparenza
Data sensor
ROS mette a disposizione un vasto numero di pacchetti software già funzionanti.
(Es. Utilizzo del pacchetto ros openni per la gestione di dispositivi rgb-d)
“Robot Operating System”
Comunicazione
ROS permette la comunicazione tra diversi pacchetti/nodi attraverso 3 protocolli di comunicazione:
- Publish / Subscribe: protocollo asincrono
- Service: protocollo sincrono
- Client / Server: protocollo sincrono
“Robot Operating System”
Comunicazione
ROS permette la comunicazione tra diversi pacchetti/nodi attraverso 3 protocolli di comunicazione:
- Publish / Subscribe: protocollo asincrono
Comunicazione 1…n tramite la “pubblicazione” di messaggi su entità chiamate TOPIC.
“Robot Operating System”
Comunicazione
- Publish / Subscribe: protocollo asincrono
1 nodo publisher pubblica frequentemente un messaggio
N nodi subscriber leggono alla stessa frequenza del publisher il messaggio pubblicato
“Robot Operating System”
Comunicazione
Service: Un nodo invia una richiesta a tutti i nodi in grado di soddisfarla. Da questi nodi
ROS permette la comunicazione tra diversi pacchetti/nodi attraverso 3 protocolli di comunicazione:
- Service: protocollo sincrono
rosnode rosnode
Server Client
Richiesta(msg req)
Risposta(msg res)
“Robot Operating System”
Comunicazione
ROS permette la comunicazione tra diversi pacchetti/nodi attraverso 3 protocolli di comunicazione:
- Client / Server: protocollo sincrono
“Robot Operating System”
Perchè ROS
“Robot Operating System”
Perchè NON ROS
“Robot Operating System”
Perchè NON ROS
In molti problemi nel campo della robotica è necessario tenere conto dei tempi di esecuzione del codice di controllo del robot:
Es. Loop di controllo a determinate velocità;
Invio di traiettorie generate a determinati tempi di campionamento.
…
In alcuni casi è necessario utilizzare sistemi real-time per il controllo del robot, che assicurano la chiusura di loop di controllo in tempi noti e rispettati. ROS non lascia all’utente nessuna decisione/sicurezza sull’esecuzione dei nodi attivi.
In questi casi è quindi prefebile utilizzare soluzioni miste, creando una propria politica di comunicazione tra i nodi ROS ed il codice di controllo.
“Robot Operating System”
Messaggi ROS
In ROS i messaggi sono utilizzati sia per richiedere servizi che per permettere la comunicazione tra i vari nodi.
Un messaggio non è altro che una struttura dati. Le librerie standardo
mattono a disposizione i tipi primitivi standard (int, double, float…), gli array dei tipi primitivi, ed altre strutture più complesse.
ROS mette già a disposizione una serie di messaggi predefiniti, che permettono di gestire la maggior parte informazioni in ambito robotico
(informazioni riguardo la posa del robot, gli output dei sensori, il controllo dei giunti di un robot,…). E’ sempre possibile definire un messaggio ad hoc per le proprie esigenze.
“Robot Operating System”
Messaggi ROS
Es.
Creare un messaggio contenente un dato di tipo float:
std_msgs/Float32 Message;
Message.data = 10;
Pubblicare il messaggio creato:
Publisher.publish(Message)
Lista dei messaggi standard di ros:
http://ros.org/wiki/std_msgs
“Robot Operating System”
Messaggi ROS
geometry_msgs/PoseStamped:
descrive la posizione di un oggetto nelle componenti (x,y,z) con quattro gradi di orientazione.
“Robot Operating System”
Messaggi ROS
sensor_msgs/Image: contiene i dati immagine. Il campo data del
messaggio trasmette la matrice che contiene i valori dei pixel di un immagine.
“Robot Operating System”
Service ROS
Per invocare la richiesta di un «servizio», è necessario creare un messaggio in cui viaggeranno sia gli input che gli output che ci si aspetta dall’esecuzione del
servizio.
AddTwoInts.srv: (Somma di due interi)
AddTwoInts.h è la definizione del messaggio utilizzato nel service. Il path di questo tipo di messaggi è package/srv/
“Robot Operating System”
Action msgs
Per eseguire una routine con protocollo client / server, è necessario creare un messaggio .msg in cui vengono specificati 3 campi:
- Goal
- Feedback - Result
“Robot Operating System”
Ros callback
Una callback non è altro che metodo, sempre in attesi di un
«determinato» tipo di messaggio pubblicato su un topic. Questo metodo è gestito parallelamente al resto del codice scritto
dall’utente e viene invocato su evento. Ogni qual volta viene scritto qualcosa sul topic, la callback viene invocata.
L’esecuzione parallela dei nodi che compongono ogni pacchetto ros è resa possibile dal concetto di callback:
“Robot Operating System”
Comandi base
- rospack: permette di ricevere informazioni sui package;
- roscd: apre la directory contenente i package;
- roscreate-pkg: crea un package;
- roscore: manda in esecuzione il roscore;
- rosnode: fornisce informazioni sui nodi in esecuzione;
- rosrun: manda in esecuzione un nodo;
- rostopic: fornisce informazioni sui topic attivi;
- rosservice: fornisce informazioni sui service attivi.
“Robot Operating System”
Comandi base
- roscd: apre la directory contenente i package;
- roscd [nome_package]: es. roscd rviz - roscreate-pkg: crea un package;
- roscreate-pkg [nome_package]: es. roscreate-pkg new_pkg - rosrun: manda in esecuzione un nodo;
- rosrun [nome_pkg] [nome_nodo]: es. rosrun rviz rviz
“Robot Operating System”
Comandi base
rostopic: permette di visualizzare informazioni sui topic attivi.
rostopic list: restituisce la lista dei topic attivi;
rostopic info [nome_topic]: restituisce il tipo di messaggio pubblicato sul topic;
rostopic hz [nome_topic]: restituisce la frequenza con cui vengono pubblicati i messaggi sul topic;
rostopic echo [nome_topic]: mostra i messaggi inviati al
topic.
“Robot Operating System”
Tutorial: file system
Struttura tipica della directory di un nodo ros:
/$ROS_WORKSPACE/nodo:
/src < codice sorgente
/launch
/srv < [ service ]
/msg < [ messaggi ]
manifest.xml < definizione delle dipendenze
CMakeLists.txt < istruzioni di compilazione
“Robot Operating System”
Tutorial: compilazione nodo
CMakeList:
“Robot Operating System”
Tutorial: compilazione nodo
Per compilare il pacchetto creato, spostarsi all’interno della direcotry del pacchetto (è possibile utilizzare roscd) ed esgeuire il comando:
$ rosmake
“Robot Operating System”
Tutorial: creazione di un nodo
ros.h: librerie per l’utilizzo delle funzioni di ros.
Main.h:
“Robot Operating System”
Tutorial: creazione di un nodo
Main.cpp
ros::init presentazione del nodo al roscore.
“Robot Operating System”
Tutorial: creazione di un nodo
rosnode:
Dopo aver compilato il pacchetto (senza errori!!) è possibile mandare il nodo in esecuzione:
Prima di tutto è necessario avviare il core:
$ roscore
In un altro terminale invece è necessario avviare il nodo:
$ rosrun [nome package] [nome nodo]
Es.
$ rosrun tutorial main
“Robot Operating System”
Tutorial: creazione di un publisher
Creazione di un nodo ros che pubblica continuamente su un Topic con nome
“publisher” dei dati di tipo Std_msgs::String.
rosnode publisher
Topic Std_msgs::String
“Robot Operating System”
Tutorial: creazione di un publisher
Pubslisher.h:
NodeHandle: oggetto per l’accesso agli attributi e ai metodi per la gestione del nodo.
Publisher: oggetto per l’accesso ai metodi di pubblicazione.
“Robot Operating System”
Tutorial: creazione di un publisher
Pubslisher.cpp:
advertise<Message Type>: Creazione di un topic su cui possono essere scritti messaggi di tipo «Message Type»
publish: Metodo per pubblicare su topic.
“Robot Operating System”
Tutorial: creazione di un publisher
Dopo aver creato e mandato in esecuzione (come visto in precedenza) un nodo che pubblica su un topic, è possibile monitorare lo stato di quel topic attraverso il comando rostopic:
$ rostopic list: Lista dei topic creati sul rosnode
$ rostopic info “Nome Topic”: Informazioni sul topic (tipi di dati pubblicabili);
$ rostopic echo “Nome Topic”: Monitoring dell’attività di publishing sul topic .
rostopic echo /publisher:
“Robot Operating System”
Tutorial: creazione di un publisher
Subscriber.h:
sub: oggetto per l’accesso ai metodi per la gestione del nodo in sottoscrizione.
Dichiarazione di un callback
“Robot Operating System”
Tutorial: creazione di un publisher
Subscriber.cpp:
subscribe: Metodo per la sottoscrizione ad un topic
“Robot Operating System”
Tutorial: creazione di un publisher
Subscriber.cpp:
subscribe: Metodo per la sottoscrizione ad un topic
spin: Permette alle callback di restare in vita anche dopo la terminazione del «codice»
“Robot Operating System”
Tutorial: creazione di un publisher
“Robot Operating System”
Manifest
Il file manifest.xml è un file che contiene tutte le dipendenze del nodo, ovvero tutti gli altri pacchetti ros da cui dipende. E’ necessario inserire qui la dipendenza prima di compilare il nodo:
Dopo aver creato un nuovo nodo ad esempio è necessario aggiungere la riga:
<depend package=‘’roscpp’’ />
“Robot Operating System”
roslaunch
Per eseguire un nodo è possibile utilizzare il comando: rosrun.
Tuttavia se è necessario eseguire un maggior numero di nodi, è possibile utilizzare il comando roslaunch:
roslaunch [ nome_pkg ] file.launch
“Robot Operating System”
RosBag
Es.
$ rosbag record [nome_topic] [Tipo di messaggio]
$ rosbag –o bagfile record /image sensor_msgs/Image
$ rosbag play bagfile
Un bag file è un formato in ROS per conservare il contenuto di messaggi attivi sui topic. Queso strumento può essere di aiuto al programmatore sia per
effettuare debug sui nodi da esso implementati (eseguendo un test sulla piattaforma reale e controllando successivamente i dati dell’esperimento) sia per sviluppare il proprio codice senza dover eseguire tutti i nodi
dell’architettura.
“Robot Operating System”