• Non ci sono risultati.

La creazione di una seconda versione del nostro programma, anch’essa pre-

sente nel DVD allegato e alla quale si pu`o accedere estraendo il file POLIMI

V.2.zip, si `e resa necessaria come conseguenza dell’esecuzione degli esperi-

menti effettuati con quella precedente all’interno di una mappa che simula uno spazio aperto. In un ambiente simile, infatti, `e possibile giungere in una situazione come quella mostrata in Figura 4.4 in cui il robot rimane bloccato nel punto scelto come obiettivo.

Questo `e dovuto proprio alla decisione di eleggere il centro dell’area relativa alla frontiera come posizione rappresentativa della frontiera stessa e a come questa viene determinata non verificando se il punto faccia o no parte dell’a- rea safe (in grigio nell’immagine). Solitamente il robot muovendosi nell’am- biente rileva l’area free e l’area safe, che aumentano ogni volta che raggiunge nuovi obiettivi. Modificandosi, queste aree, definiscono nuove frontiere, tra le quali il robot pu`o scegliere la migliore nel prossimo passo di esplorazione. In questo caso, invece, dopo aver visitato una piccola porzione della mappa, mentre si reca verso l’obiettivo selezionato nel passo corrente, il telemetro laser non rileva ulteriore spazio libero e l’area free non cambia. Per come

`e stato sviluppato l’algoritmo, questa situazione porta il robot a scegliere

come prossimo punto da raggiungere lo stesso in cui si trova, bloccandolo per il resto dell’esecuzione. Per far proseguire l’esplorazione durante gli esperi- menti siamo dovuti intervenire modificando la strategia da POLIMI a Tele Operation, cos`ı da poter comandare manualmente il robot, creando nuove

frontiere e facendo in modo che non scegliesse pi`u la stessa aumentando il

numero di posizioni candidate, e, fatto questo, reimpostando POLIMI come strategia principale.

Nell’esempio riportato sopra sono presenti una sola frontiera e un solo agente

ma il problema si pu`o verificare anche in presenza di pi`u componenti della

squadra e di pi`u punti candidati quando, nel raggiungerne uno, non cambia-

no le informazioni relative all’area free e questo resta comunque la migliore posizione per il robot.

Oltre che nello spazio aperto, come sar`a spiegato nel Capitolo 5, abbiamo

effettuato esperimenti anche utilizzando un’altra mappa, con caratteristiche molto diverse, raffigurante un piano di un hotel. Con la prima versione di

POLIMI, il problema si `e verificato solo nello spazio aperto, mentre non `e

successo niente del genere nell’altro ambiente. In un contesto come quello dell’hotel, infatti, `e meno probabile incorrere in questo tipo di situazione in quanto durante l’esplorazione le frontiere si modificano maggiormente da un passo di esplorazione all’altro.

La porzione di codice relativa alla scelta del punto centrale della frontiera, sviluppata da AOJRF e utilizzata all’interno della prima versione del nostro

software, che causa il problema appena descritto `e la seguente:



P u b l i c F u n c t i o n E x t r a c t F r o n t i e r I n f o (ByVal r e g i o n s As Bitmap ) As F r o n t i e r I n f o ( )

Dim i n f o s As New L i s t (Of F r o n t i e r I n f o )

I f r e g i o n s . Width > 1 AndAlso r e g i o n s . H e i g h t > 1 Then

Dim c o u n t e r As New B lo b C ou n t er ( r e g i o n s )

Dim b l o b s ( ) As Blob = c o u n t e r . G e t O b j e c t s ( r e g i o n s )

Dim x C e n t e r As Double, y C e n t e r As Double, count As I n t e g e r For Each b l o b As Blob I n b l o b s

’ compute t r u e a r e a i n number o f p i x e l s

count = 0 x C e n t e r = 0 y C e n t e r = 0

Dim b b i t s As BitmapData = b l o b . Image . L o c k B i t s (New R e c t a n g l e ( 0 , 0 , b l o b . Image . Width , b l o b . Image . H e i g h t ) , ImageLockMode . ReadOnly , P i x e l F o r m a t . Format8bppIndexed ) For j As I n t e g e r = 0 To b b i t s . H e i g h t − 1 For i As I n t e g e r = 0 To b b i t s . Width − 1 I f Ma rs ha l . ReadByte ( b b i t s . Scan0 , j ∗ b b i t s . S t r i d e + i ) > 0 Then count += 1 x C e n t e r += i y C e n t e r += j End I f Next Next b l o b . Image . U n l o c k B i t s ( b b i t s ) ’ compute a v e r a g e s x C e n t e r = x C e n t e r / count + b l o b . L o c a t i o n . X y C e n t e r = y C e n t e r / count + b l o b . L o c a t i o n . Y

i n f o s . Add (New F r o n t i e r I n f o ( count / 1 0 0 , xCenter , y C e n t e r ) )

Next

’ c l e a n u p

For Each b l o b As Blob I n b l o b s b l o b . D i s p o s e ( ) Next b l o b s = N o t h i n g End I f Return i n f o s . ToArray End F u n c t i o n  

La soluzione da noi impiegata, per fare in modo che il robot non rimanga bloccato durante l’esecuzione, consiste nel cambiare la posizione raggiungi-

bile all’interno dell’area presente al di l`a della frontiera scelta. A questo

proposito abbiamo deciso di sostituire il centro dell’area con un punto scelto a caso al suo interno, controllando anche che tale punto non faccia parte dell’area safe ma solo di quella free.

Il codice, con cui abbiamo sostituito quello originale e in cui, ad indica- re il punto random selezionato, abbiamo mantenuto le variabili xCenter e

yCenter gi`a presenti, anche se non rappresentano pi`u un punto centrale, `e

riportato di seguito:



P u b l i c F u n c t i o n E x t r a c t F r o n t i e r I n f o (ByVal r e g i o n s As Bitmap ) As F r o n t i e r I n f o ( )

Dim i n f o s As New L i s t (Of F r o n t i e r I n f o )

I f r e g i o n s . Width > 1 AndAlso r e g i o n s . H e i g h t > 1 Then

Dim c o u n t e r As New B lo b C ou n t er ( r e g i o n s )

Dim b l o b s ( ) As Blob = c o u n t e r . G e t O b j e c t s ( r e g i o n s )

Dim x C e n t e r As Double, y C e n t e r As Double, count As I n t e g e r

For Each b l o b As Blob I n b l o b s

’ compute t r u e a r e a i n number o f p i x e l s

count = 0 x C e n t e r = 0 y C e n t e r = 0

Dim b b i t s As BitmapData = b l o b . Image . L o c k B i t s (New R e c t a n g l e ( 0 , 0 , b l o b . Image . Width , b l o b . Image . H e i g h t ) , ImageLockMode . ReadOnly , P i x e l F o r m a t . Format8bppIndexed ) For j As I n t e g e r = 0 To b b i t s . H e i g h t − 1 For i As I n t e g e r = 0 To b b i t s . Width − 1 I f Ma rs ha l . ReadByte ( b b i t s . Scan0 , j ∗ b b i t s . S t r i d e + i ) > 0 Then count += 1 End I f Next Next b l o b . Image . U n l o c k B i t s ( b b i t s ) Dim x C e n t e r t e m p As I n t e g e r, y C e n t e r t e m p As I n t e g e r Dim f o u n d As B o o l e a n f o u n d = F a l s e

Dim rand As New Random

While ( f o u n d = F a l s e)

x C e n t e r t e m p = rand .Next( b l o b . Image . Width + 1 ) y C e n t e r t e m p = rand .Next( b l o b . Image . H e i g h t + 1 )

’ c o n t r o l l i a m o c h e i l punto random non f a c c i a p a r t e d e l l ’ a r e a s a f e

I f ( (Not b l o b . Image . G e t P i x e l ( xCenter temp , y C e n t e r t e m p ) . A <> 2 5 5 ) AndAlso (Not b l o b . Image . G e t P i x e l ( xCenter temp ,

y C e n t e r t e m p ) . B <> 2 5 5 ) AndAlso (Not b l o b . Image . G e t P i x e l ( xCenter temp , y C e n t e r t e m p ) . R <> 2 5 5 ) AndAlso (Not b l o b . Image . G e t P i x e l ( xCenter temp , y C e n t e r t e m p ) .G <> 2 5 5 ) )

Then f o u n d = True End I f End While x C e n t e r = x C e n t e r t e m p + b l o b . L o c a t i o n . X y C e n t e r = y C e n t e r t e m p + b l o b . L o c a t i o n . Y

i n f o s . Add (New F r o n t i e r I n f o (c o u n t / 1 0 0 , xCenter , y C e n t e r ) )

Next

’ c l e a n u p

For Each b l o b As Blob I n b l o b s b l o b . D i s p o s e ( ) Next b l o b s = N o t h i n g End I f Return i n f o s . ToArray End F u n c t i o n  

Facendo ci`o non ci aspettiamo di migliorare le prestazioni in termini di area

mappata, ma di raggiungere risultati simili a quelli gi`a ottenuti e di non

dover pi`u intervenire manualmente sui movimenti dell’agente.

Abbiamo applicato la stessa modifica sia all’interno del nostro software che

in quello sviluppato da AOJRF, che `e possibile trovare nel file compresso

AOJRF2009 V.2.zip del DVD allegato. Gli esperimenti effettuati utilizzando questa versione sono illustrati nella Sezione 5.2 in cui confrontiamo anche il numero di interventi manuali per sbloccare il robot che si sono resi necessari in questo caso con quelli effettuati usando la versione precedente.

Documenti correlati