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
Scarica

Player/Stage