Player Stage E.Mumolo, DEEI [email protected] 1 Il problema Molti tipi di piattaforme e controllori È un problema di virtualizzazione per la portabilità del codice 2 Soluzione Strato di virtualizzazione Player Server www.playerstage.org Programma utente (client) TCPIP Player Server interfacce Robot Reale File di configurazione Architettura del Player Computer di sviluppo Robot reale Simulazione E se non ho il robot? STAGE (simula il robot e il mondo) Programma utente (client) TCPIP Player Server File di configurazione del player interfacce STAGE File di configurazione di Stage In definitiva simulazione degli ambienti tcp/udp Cliente Client Programma scritto in -C - C++ - Java - Pyton -… PLAYER simulazione interfacce del robot STAGE (mondi a 2D) GAZEBO (mondi a 3D) ROBOT REALE Running Player Building and installation http://playerstage.sourceforge.net ./configure make make install Execution player [–p <port>] <config file> playerv [hostname:port] playerjoy [hostname:port] 7 File di configurazione del player: *.cfg Player Server Camera Laser Motors blobfinder:0 ( driver “acts” devicepath=“/dev/video0” channel 0 ) laser:0 ( driver “sicklms200” port “/dev/ttyS1” resolution 50 ) position:0 ( driver “p2os_position” port “/dev/ttyS0” max_xspeed 500 ) Player cfg 9 Programmazione clienti in C++ Il programma Cliente usa la libreria libplayerc++ La libplayerc++ si basa sul modello “service proxy” Il cliente è implementato includendo oggetti che sono proxy per servizi remoti In definitiva, lo sviluppo del programma si basa sulla desisione dei proxy necessari, e l’uso dei metodi forniti dalla classe I proxy sono gestiti dal Controller Funzioni del Controller: Fornisce un corpo al cliente (Embodyness) Supervisiona il funzionamento Fornisce le funzionalità previste #include <playerclient.h> #include <stdlib.h> int main(int argc, char *argv[]) { PlayerClient robot("localhost"); SonarProxy sp(&robot,0,'r'); Position2DProxy pp(&robot,0,'w'); double newturnrate,newspeed; for(int i=0;i<1000;i++) { if(robot.Read()) exit(1); sp.Print(); // print out sonars for fun // semplice algoritmo per evitare gli ostacoli if((sp.ranges[0] + sp.ranges[1]) < (sp.ranges[6] + sp.ranges[7])) newturnrate = DTOR(-20); // turn 20 degrees per second else newturnrate = DTOR(20); if(sp.ranges[3] < 0.500) newspeed = 0; else newspeed = 0.100; pp.SetSpeed(newspeed,newturnrate); //comandi ai motori } } File di configurazione di Stage: world file 12 Programmazione player Librerie C (libplayerc), C++ (libplayerclient), Tcl (tclPlayer), etc. Passi di programmazione 1. 2. 3. 4. 5. Connessione con il proxy Sottoscrivere I device. Leggi I sensori. Elabora i dati. Invia i comandi agli attuatori. 13 Position2dProxy: metodi principali Position2dProxy (PlayerClient *aPc, uint aIndex=0) costrutore ~Position2dProxy () distruttore void SetSpeed (double aXSpeed, double aYSpeed, double aYawSpeed) invia comandi al motore void SetMotorEnable (bool enable) abilita/disabilita i motori void ResetOdometry () resetta l’odometry a (0,0,0). void SetOdometry (double aX, double aY, double aYaw) inizializza l’odometria alla posizione (x, y, yaw). double GetXPos () double GetYPos (). double GetYaw () double GetXSpeed () double GetYSpeed (). double GetYawSpeed (). 14 LaserProxy: metodi principali LaserProxy (PlayerClient *aPc, uint aIndex=0) ~LaserProxy () costruttore distruttore uint GetCount () numero di punti nella acquisizione. player_point_2d_t GetPoint (uint aIndex) dati dello scanner: x,y (m). int GetIntensity (uint aIndex) richiede l’intensità void RequestGeom () richiede la geometria del laser player_bbox_t GetSize () richiede la dimensione. double GetMinLeft () richiede la minima lettura a sinistra. double GetMinRight () richiede la minima lettura a destra. SonarProxy SonarProxy (PlayerClient *aPc, uint aIndex=0) costruttore ~SonarProxy () distruttore uint GetCount () richiede il conteggio delle misure double GetScan (uint aIndex) richiede una lettura particolare double operator[] (uint aIndex) richiede un modo alternativo di lettura delle misure uint GetPoseCount () numero di posizioni valide player_pose_t GetPose (uint aIndex) richiede la posizione deòl sonar void RequestGeom () richide la geometria del sensore