neurali:roscpp_tutorial
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
neurali:roscpp_tutorial [2015/07/24 12:35] – [roscpp] profpro | neurali:roscpp_tutorial [2020/06/08 22:20] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < [[neurali: | ||
+ | http:// | ||
+ | |||
+ | ======roscpp====== | ||
+ | |||
+ | Prerequisito: | ||
+ | |||
+ | //roscpp// genera automaticamente del codice, non confondere con //rosgcc// che invece è il nome del compilatore. | ||
+ | |||
+ | È una libreria utilizzabile dai client dei processi ROS (detti nodi all' | ||
+ | Questa libreria si usa per i programmi in C++ ma esiste anche la sua equivalente per il python chiamata //rospy//. | ||
+ | |||
+ | Quando si scrive un nuovo programma, il programmatore può usare le funzioni di questa libreria per comunicare tramite pubblicazione/ | ||
+ | |||
+ | NOTA: roscpp non supporta comunicazione in rete! Supporta la comunicazione tra node ROS, che possono appartenere allo stesso package, oppure no. | ||
+ | |||
+ | Per le comunicazioni in rete (socket) si può | ||
+ | * usare direttamente i socket bsd c, | ||
+ | * sviluppare una nuova libreria ROS per client | ||
+ | * usare [[neurali: | ||
+ | =====Inizializzazione (init e start)===== | ||
+ | In realtà //rosccp// è a sua volta un node (appartenente ad un package), come tanti altri. | ||
+ | |||
+ | In un programma in cui si vuole usare roscpp per le comunicazioni tra processi, **prima** di chiamare qualsiasi altra funzione di roscpp, si deve eseguire una funzione // | ||
+ | |||
+ | - La prima permette anche di rimappare tutti i nomi delle risorse di un node quando questo viene avviato **dalla linea di comando**. Quindi uno stesso nodo può essere avviato più volte usando diverse configurazioni dalla linea di comando (in runtime!) quando si avvia con roslaunch o rosrun. Gli argomenti di roslaunch vengono passati con argc,argv. Inizializzare non vuol dire contattare il master, per approfondimento vedere [[neurali: | ||
+ | * < | ||
+ | ros:: | ||
+ | </ | ||
+ | - Per eseguire uno start, invece, basta creare un manipolatore di nodi | ||
+ | * < | ||
+ | ros:: | ||
+ | // ros:: | ||
+ | // delete nh; // | ||
+ | // ros:: | ||
+ | </ | ||
+ | |||
+ | da leggere? https:// | ||
+ | |||
+ | In realtà la funzione shutdown() può essere chiamata anche manualmente per distruggere il processo. | ||
+ | In questo modo si killeranno tutte le sottoscrizioni, | ||
+ | Se si preme CTRL C sulla linea dei comandi, viene intercettato il signal SIGINT e viene automaticamente avviato shutdown() | ||
+ | |||
+ | bool x = ros:: | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | ==== Struttura del package==== | ||
+ | |||
+ | Oltre a usare le funzioni di inizializzazione il programmatore deve creare anche due cartelle nel package che contiene il suo nodo, affinché esso possa comunicare usando questa libreria. | ||
+ | Si tratta delle cartelle " | ||
+ | |||
+ | Codice di esempio: http:// | ||
+ | |||
+ | Quando si avvia la compilazione (con [neurali: | ||
+ | |||
+ | package_name/ | ||
+ | package_name/ | ||
+ | |||
+ | Il codice generato automaticamente (prova.c, prova.h) viene salvato in questi percorsi predefiniti | ||
+ | |||
+ | msg_gen/ | ||
+ | srv_gen/ | ||
+ | |||
+ | Codice ottenuto? | ||
+ | |||
+ | #include < | ||
+ | | ||
+ | std_msgs:: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | La forward declaration è una dichiarazione anticipata in C++? | ||
+ | |||
+ | [[appunti3s: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | La forward declaration è una macro che permette di dichiarare un messaggio e il suo puntatore | ||
+ | * il messaggio è un template di una struct | ||
+ | * il suo puntatore è un tipo shared pointers di [[neurali: | ||
+ | |||
+ | |||
+ | ROS_DECLARE_MESSAGE(MyMessage); | ||
+ | |||
+ | In python si può usare //typeof// ma non in C++. Per questo motivo è stato necessario introdurre un campo dentro la struttura del messaggio. Il campo si chiama _data_type. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | (approfondimento) | ||
+ | |||
+ | ====dichiarazione_init==== | ||
+ | |||
+ | <code c> | ||
+ | ROSCPP_DECL void init(const M_string& | ||
+ | /** | ||
+ | * \brief alternate ROS initialization function. | ||
+ | * | ||
+ | * \param remappings A vector< | ||
+ | * \param name Name of this node. The name must be a base name, ie. it cannot contain namespaces. | ||
+ | * \param options [optional] Options to start the node with (a set of bit flags from \ref ros:: | ||
+ | * \throws InvalidNodeNameException If the name passed in is not a valid " | ||
+ | */ | ||
+ | |||
+ | </ |