1 
 
 
 
Sommario 
 
L’intento di questa tesi è lo sviluppo di un path planner (pianificatore di percorsi) per 
robot mobili situati in un ambiente marziano o lunare. Il path planner sviluppato è basato 
su A-star, algoritmo in grado di pianificare percorsi discreti a partire da un punto di start 
per arrivare ad un punto di goal prescelti su una mappa. La mappe utilizzate sono delle 
DEM (Digital Elevation Map), ovvero indicanti le altezze del terreno rispetto ad un  
riferimento fisso.  
Il path planner realizzato non è un puro e semplice pianificatore: per la scelta del percorso 
non si tiene in considerazione la sola distanza dal nodo obiettivo, ma si considereranno 
anche fattori come i dislivelli da superare, i fattori di pericolo e l’esposizione solare. Il 
pianificatore garantisce inoltre una certa libertà di scelta sulla tipologia di pianificazione da 
effettuare fornendo la possibilità all’utente di variare il grado di autonomia assegnata al 
sistema (concetto di Sliding Autonomy). 
L’obiettivo della prima parte della tesi è un’analisi teorica del problema e dello stato 
dell’arte sulla pianificazione discreta, in seguito si passerà alla descrizione dell’algoritmo 
utilizzato. 
Si sono sviluppate, a partire dal classico A-star, un certo numero di varianti dell’algoritmo 
utili a diminuire i tempi di calcolo. Inoltre ci si è concentrati sulla generazione di percorsi 
che prediligano caratteristiche differenti (ad es. assetti attesi, traversabilità di un terreno, 
ecc.), consentendoci quindi di ottenere più percorsi che, a partire da un punto di partenza 
fisso, raggiungano lo stesso punto obiettivo.  
Successivamente si descriveranno dei metodi di analisi focalizzati sui percorsi ottenuti. In 
primis verranno presentati i dati che possono essere estrapolati da un percorso e che lo 
caratterizzano (lunghezza, consumi, grafici sugli assetti, ecc.). In seguito verranno illustrati 
metodi di validazione statica dei path per l’introduzione di perturbazioni nei percorsi 
individuati. Metodi che permettono la verifica di fattibilità del path in condizioni 
d’incertezza in modo da individuare eventuali pericolosità. 
In appendice alla tesi vi è inoltre uno studio sulla valutazione dell’esposizione solare su 
Marte utile a determinare l’illuminazione delle celle solari a bordo del rover.
Capitolo 2 - Definizione del problema e stato dell’arte 
 
11 
 
2.3. Pianificazione discreta 
La pianificazione che vogliamo ottenere, come già detto, è una pianificazione di alto 
livello. Le informazioni a nostra disposizione sono quelle che un ipotetico satellite può 
fornire, ovvero una DEM (Digital Elevetion Map) della zona limitrofe alla posizione del 
rover. Non abbiamo ulteriori informazioni forniteci dai sensori a bordo del rover. 
Per questo motivo possiamo fare l’ipotesi che gli stati assumibili dal sistema siano finiti e 
numerabili, di conseguenza è possibile utilizzare algoritmi di pianificazione discreta. Non 
sono necessari modelli geometrici o equazioni differenziali per descrivere il problema e 
tantomeno vengono considerati problemi di incertezza. 
Il risultato restituito dal pianificatore sarà un elenco di punti componenti un ipotetico 
tracciato da percorrere. Non si otterrà un percorso continuo, ma una sequenza di azioni che 
spostino il robot tra i punti appartenenti alla DEM. Per approfondimenti sulla 
pianificazione discreta vedere [1] e [4]. 
 
2.3.1. Formulazione del problema 
Si può rappresentare ogni singolo stato raggiungibile dal sistema con   e l’insieme di tutti 
gli stati con  . Per passare da uno stato all’altro è necessario applicare un azione 
rappresentata dalla funzione  . Possiamo quindi esprimere il passaggio dallo stato x allo 
stato successivo  
 
 nel modo seguente: 
 
 
        
Per ogni stato esiste un determinato numero di azioni applicabili rappresentabile come 
U(x). Tale insieme non è detto che sia differente da quello di un secondo stato  
 
 in quanto 
le stesse azioni possono essere applicate a più di uno stato. Lo stato di partenza è  
 
   
mentre quello desiderato, ovvero quello di arrivo, con  
 
  . Alcuni algoritmi accettano 
più di un nodo possibile di arrivo. 
L’obiettivo del planning è trovare una determinata sequenza di azioni che applicate allo 
stato iniziale portino il sistema nello stato finale. 
I problemi di ricerca sono spesso formulati in termini di alberi (o più generalmente di 
grafi). Ogni nodo rappresenta uno stato del sistema, dove il nodo iniziale è la radice 
dell’albero e il nodo goal una delle foglie. Le azioni sono rappresentate dagli archi 
connettenti due nodi. Ogni nodo può essere classificato secondo la sua profondità, ovvero 
il numero di nodi che occorre attraversare dallo stato di partenza per raggiungerlo.
Capitolo 2 - Definizione del problema e stato dell’arte 
 
12 
 
Nel caso specifico di nostro interesse possiamo supporre che il robot si muova su una 
griglia, ogni punto di questa griglia è individuabile da coordinate intere nella forma      . 
Il robot compie passi discreti in una della 8 direzioni, incrementando o decrementando le 
due coordinate (avanti, avanti-sinistra, sinistra, indietro-sinistra, indietro, indietro-destra, 
destra, avanti-destra).  
 
 
 
Un requisito importante per gli algoritmi di ricerca è che siano sistematici. Se così non 
fosse si rischierebbe di incorrere in cicli che impedirebbero di trovare una soluzione al 
problema. 
 
2.4. Algoritmi di ricerca in avanti 
Gli algoritmi di ricerca in avanti (forward) mirano alla costruzione di un percorso a partire 
dal nodo di partenza avvicinandosi, fino a raggiungere, il nodo di arrivo. Durante lo 
svolgimento dell’algoritmo, possiamo suddividere gli stati in 3 categorie: 
 non visitati: tutti i nodi non ancora visitati. Inizialmente questo insieme comprende 
tutti gli stati del sistema ad eccezione del nodo di partenza; 
 aperti (o vivi): nodi già visitati e quindi già raggiunti dalla ricerca ma i cui nodi 
adiacenti non sono ancora stati tutti visitati; 
 chiusi (o morti): nodi già visitati i cui vicini sono stati tutti visitati. 
I nodi aperti sono memorizzati in una coda prioritaria che chiameremo Open. Ciò che 
distingue i vari algoritmi è la funzione utilizzata per ordinare questa lista di nodi. Di 
seguito riporto un pseudo codice rappresentante uno schema generale per un algoritmo di 
ricerca in avanti. 
 
G 
S 
Profondità = 0 
Profondità = 1 
Profondità = 2 
Profondità = 3 
Figura 2-2: Un esempio di albero (grafo) per un problema di ricerca di 
percorso, con indicazione sui rispettivi livelli di profondità.
Capitolo 2 - Definizione del problema e stato dell’arte 
 
13 
 
 
RICERCA_IN_AVANTI 
Open.insert(x
s
) 
Mark x
s
 as visited 
while (Open not empty) do 
x = Open.GetFirst() 
if (x == x
g
) 
return SUCCESS 
forall u in U(x) 
x
i
 = f(x,u) 
if x
i
 not visited 
Mark x
i
 as visited 
Open.insert(x
i
) 
else 
resolve duplicate x
i
 
return FAILURE 
 
Per semplicità possiamo inizialmente assumere la lista Open come una coda FIFO (First In 
First Out). Un ciclo esegue continuamente il corpo del programma fino a quando vi è 
almeno un elemento all’interno della lista dei nodi Open. Ad ogni iterazione viene 
prelevato un elemento dalla lista Open, se questo corrisponde al nodo  
 
 l’algoritmo ha 
trovato una soluzione è termina con successo. Al contrario, se la lista è vuota e non si è 
individuata una soluzione e l’algoritmo restituisce come risultato fallimento. Come si può 
evincere dallo pseudocodice (Codice 1) occorre tener traccia dei nodi visitati. Vi sono 
molteplici strutture dati che possono assolvere questo compito, come tabelle di hash, 
alberi, matrici, ecc.. A seconda del tipo di problema si andrà a scegliere la struttura più 
adatta a tale rappresentazione. 
Alcuni algoritmi necessitano il calcolo di uno, o più, costi da associare ad ogni stato. Se 
uno nodo è raggiunto più di una volta da percorsi differenti, il costo deve essere 
aggiornato. Questo costo può essere usato, mediante una qualche euristica, per ordinare la 
lista dei nodi Open. Solitamente tali costi devono avere la proprietà di monotonicità: man 
mano che ci si avvicina al risultato desiderato il costo deve aumentare e mai diminuire. 
Tale accorgimento evita il crearsi di fastidiosi cicli. 
Possiamo dare una visione unificata del generico funzionamento degli algoritmi di ricerca 
in avanti: 
1. Inizializzazione: vengono inizializzate le strutture dati ed inserita nella lista Open 
il nodo di partenza; 
2. Selezione di un vertice: selezione di un vertice da espandere (secondo una qualche 
euristica) dalla lista Open; 
3. Applicare un azione: selezione di un azione in modo da generare un nuovo stato; 
Codice 1: Pseudo codice di un generico algoritmo di ricerca in avanti trato da [1].
Capitolo 2 - Definizione del problema e stato dell’arte 
 
14 
 
4. Inserire un arco di congiunzione sull’albero di ricerca: generazione di un arco di 
congiunzione tra il nodo corrente ed il nuovo nodo trovato. Se il nodo non è 
presente nella lista dei nodi Open verrà inserito; 
5. Controllare la soluzione: si verifica se il nodo trovato corrisponde al nodo goal. In 
caso affermativo l’algoritmo termina con successo; 
6. Ritornare a 2: itera l’algoritmo fin quando non si trova una soluzione. Quando la 
lista Open risulta essere vuota l’algoritmo termina restituendo fallimento. 
 
2.5. Ricerca indietro e ricerca bilaterale 
Vi sono altre tecniche di ricerca, che non sono algoritmi in avanti, più o meno performanti 
a seconda dei problemi analizzati. 
Come è facilmente intuibile un primo approccio può essere quello di ribaltare il problema,  
partire dal nodo goal per cercare una strada verso il nodo di partenza, una ricerca 
all’indietro (backward). Gli algoritmi applicabili a tale scopo sono i medesimi del caso in 
avanti. Ovviamente gli obiettivi da cercare saranno invertiti, i nodi goal diventeranno di 
start e viceversa. Algoritmi di questo genere possono essere vantaggiosi in termini di tempi 
di ricerca, ma le performance variano da problema a problema. 
Un altro approccio è quello della ricerca bilaterale (bidirectional), ovvero un unione tra 
ricerca in avanti e ricerca all’indietro. Due alberi di ricerca vengono creati, uno con radice 
il nodo iniziale e uno con radice il nodo finale.  La ricerca termina con successo non 
appena i due alberi si incontrano, ovvero non appena si identifica un nodo in comune. Si 
possono creare versioni della maggior parte degli algoritmi che analizzeremo in seguito per 
sfruttare la ricerca bidirezionale. Nel caso si utilizzino algoritmi di ricerca ottimi il risultato 
ottenuto è l’unione di due percorsi ottimi, generando un path globale teoricamente sub-
ottimo, a vantaggio di tempi di ricerca inferiori. 
 
2.6. Algoritmi di pianificazione discreta 
Riportiamo di seguito alcuni dei più famosi algoritmi di ricerca discreta. Esistono molte 
varianti ai casi proposti, frequentemente queste nascono dalla fusione di 2 approcci ad 
algoritmi differenti.