E.Mumolo, DEEI mumolo@units.it Player Stage E.Mumolo, DEEI mumolo@units.it
Il problema Molti tipi di piattaforme e controllori È un problema di virtualizzazione per la portabilità del codice
Soluzione Strato di virtualizzazione Player Server www.playerstage.org Programma utente (client) TCPIP Player Server File di configurazione interfacce Robot Reale
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 File di configurazione di Stage STAGE
In definitiva Programma scritto in C C++ Java Pyton … simulazione degli ambienti STAGE (mondi a 2D) tcp/udp Cliente PLAYER GAZEBO (mondi a 3D) Client Programma scritto in C C++ Java Pyton … ROBOT REALE simulazione interfacce del robot
Running Player Building and installation Execution http://playerstage.sourceforge.net ./configure make make install Execution player [–p <port>] <config file> playerv [hostname:port] playerjoy [hostname:port]
File di configurazione del player: *.cfg Server 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 Camera Laser Motors
Player cfg
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 #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
Programmazione player Librerie C (libplayerc), C++ (libplayerclient), Tcl (tclPlayer), etc. Passi di programmazione Connessione con il proxy Sottoscrivere I device. Leggi I sensori. Elabora i dati. Invia i comandi agli attuatori.
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 ().
LaserProxy: metodi principali LaserProxy (PlayerClient *aPc, uint aIndex=0) costruttore ~LaserProxy () 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