Trasporto messaggi tra client e server
Tutorial originale in lingua inglese: http://gazebosim.org/tutorials?tut=custom_messages&cat=transport
Argomento collegato a ros nodes
La comunicazione tra gzserver e client avviene tramite un sistema di passaggio di messaggi tramite socket di rete (TCP)
- topic è il canale dove viaggia il messaggio (su ROS dice invece che è il contenuto del messaggio)
- message: è il tipo di dato
questi sono i termini usati per descrivere un mittente e un destinatario
(node (publisher) ) –> topic –> ( (subscriber) node)
Questo modello di comunicazione è usato anche all'interno di (ROS): ogni processo (node) può pubblicare e/o sottoscrivere dei messaggi (originati da altri node o da roscore)
Vengono fornite delle librerie, come:
#include <gazebo/transport/transport.hh> #include <gazebo/msgs/msgs.hh> #include <gazebo/gazebo.hh>
dopo aver avviato gazebo, questo comando mostra la lista dei topic, canali che emettono messaggi, che possono essere ricevuti con un subscriber
gz topic -l
Il client che riceve i messaggi dal server gazebo (gzserver) può essere avviato come un plugin, ad esempio, un file .so specificato all'interno del file modello .world.
codice
https://bitbucket.org/osrf/gazebo/raw/default/examples/stand_alone/listener/listener.cc
https://bitbucket.org/osrf/gazebo/raw/default/examples/stand_alone/listener/CMakeLists.txt
#include <gazebo/transport/transport.hh> #include <gazebo/msgs/msgs.hh> #include <gazebo/gazebo.hh> #include <iostream> ///////////////////////////////////////////////// // Function is called everytime a message is received. void cb(ConstWorldStatisticsPtr &_msg) { // Dump the message contents to stdout. std::cout << _msg->DebugString(); } ///////////////////////////////////////////////// int main(int _argc, char **_argv) { // Load gazebo gazebo::setupClient(_argc, _argv); // Create our node for communication gazebo::transport::NodePtr node(new gazebo::transport::Node()); node->Init(); // Listen to Gazebo world_stats topic gazebo::transport::SubscriberPtr sub = node->Subscribe("~/world_stats", cb); //contiene nome funzione cb!!! // Busy wait loop...replace with your own code as needed. while (true) gazebo::common::Time::MSleep(10); // Make sure to shut everything down. gazebo::shutdown(); }