2
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)
Player Server
Robot Reale
TCPIP
interfacce
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)
Player Server
STAGE
TCPIP
interfacce
File di configurazionedel player
File di configurazionedi Stage
In definitiva
ClientPLAYER
STAGE(mondi a 2D)
ROBOT REALE
GAZEBO(mondi a 3D)
tcp/udp
simulazione interfacce del robot
simulazione degli ambienti
Cliente
Programma scritto in- C- C++- Java- Pyton-…
7
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]
File di configurazione del player: *.cfg
PlayerServer
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
13
Programmazione player
Librerie C (libplayerc), C++ (libplayerclient), Tcl (tclPlayer), etc.
Passi di programmazione1. Connessione con il proxy
2. Sottoscrivere I device.
3. Leggi I sensori.
4. Elabora i dati.
5. 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 ().
14
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