NFDriveAI è un progetto in Unity che implementa un sistema di intelligenza artificiale con apprendimento per rinforzo, utilizzando il Q-Learning. L'obiettivo è permettere all'agente di guidare un'automobile lungo diverse piste.
NFDriveAI: Progetto Unity. Mantiene la tipica gerarchia dei file di Unity.
- Nel subfolder Learning sono presenti la Q-Table di un agente addestrato e gli ultimi risultati ottenuti.
PlotData: Script data visualization
- Per utilizzarlo, salvare i risultati dell'agente come spiegato più avanti.
- Eseguendo da CMD il comando python main.py nel folder PlotData senza inserire i parametri, verranno cercati i risultati nel folder della repository.
- Se i path vengono modificati o se non viene scaricata l'intera repository, bisogna aggiungere al comando python main.py tre argomenti, che saranno i path dei tre file JSON, nell'ordine: collisioni per giro, media collisioni, collisioni totali. Es. python main.py C:\Folder\CollisioniGiro.json C:\Folder\MediaCOllisioni.json C:\Folder\CollisioniTotali.json
Per utilizzare il progetto seguire i seguenti passaggi:
Unity Editor, possibilmente versione 2022.3.2f1 per evitare incompatibilità.
- Scaricare lo Unity Package dalla sezione release
- Creare un progetto 2D
- Importare il package tramite Asset > Import package > Custom package... > Selezionare il package scaricato.
- Accettare di importare il progetto e assicurarsi di importare tutte le voci.
- Se la console restituisce un errore per la libreria Newtonsoft.json, andare in Window > Package Manager > Premere + in alto a sinistra > Add package from git URL... > Inserire com.unity.nuget.newtonsoft-json > Premere Add.
- Tramite la gestione dei folder del progetto, andare nella cartella Assets > Scenes > Cliccare due volte su SampleScene. Rifiutare di salvare la scena, altrimenti verrà sovrascritta la scena del progetto e dovrà essere reimportata.
- Si consiglia di impostare la risoluzione FHD o maggiore nella modalità Play per una migliore qualità.
- Si consiglia di disattivare le icone degli SpriteShape nella modalità Play, premendo sulla freccia della label Gizmos, in alto a destra, scorrendo fino alle icone viola degli SpriteShape e premendo sull'icona di SpriteShapeController.
Il package caricherà anche le Settings del progetto in quanto sono state modificate per far funzionare la fisica nel modo corretto.
Nel package scaricato saranno già presenti piste e agenti.
Di default, quando il package viene importato, si avrà la terza pista, con tutte le impostazioni per il testing e l'agente caricherà la Q-Table.
Assicurarsi che l'inspector sia in modalità Normale per effettuare modifiche alla mappa
Per utilizzare le altre piste basta attivarle dalla Hierarchy e riposizionare la Main Camera e se necessario l'agente.
Nell'inspector sarà possibile modificare i parametri degli agenti. I parametri rilevanti sono quelli dello script CarAgentFixed. Selezionare la Car dalla Hierarchy e nell'inspector scorrere fino allo script CarAgentFixed
.
Il funzionamento dei parametri è il seguente:
- Se viene spuntata la casella Training, l'agente aggiornerà la Q-Table durante la simulazione.
- Se viene spuntata la casella Trained l'agente caricherà la Q-Table presente nel path denominato Q-Table Path.
- Se Trained è spuntata ma Training no, l'agente avrà un exploration rate di 0 e seguirà solo la Q-Table. Questa modalità è utilizzata nel testing del modello addestrato.
- Se nessuna delle due è spuntata, l'agente avrà un exploration rate di 0.9 che non decadrà e non aggiornerà la tabella. Questa modalità è utilizzata nel testing del modello non addestrato.
- Se sono spuntate entrambe, si potranno affinare le conoscenze dell'agente.
- Nella GUI sono presenti due pulsanti:
- Speed: aumenta il clock dell'engine di 100 volte. Permette di addestrare più velocemente senza modificare il comportamento dell'agente.
- Save results: salverà i risultati delle collisioni in un file json, il path viene registrato nella console e può essere modificato alla voce Results Path dell'inspector.
- Premendo il tasto O, sarà possibile salvare la Q-Table, nel path specificato nell'apposita voce dell'inspector.
- Premendo il tasto L è possibile caricare la Q-Table specificata. Non è necessario farlo all'inizio se è stata spuntata la casella Trained.
- Premendo il tasto 2 è possibile inquadrare l'agente da una Camera secondaria. In questa modalità è possibile avvicinare o allontanare l'inquadratura con la rotella del mouse o con un trackpad.
- Premendo il tasto 1 è possibile tornare all'inquadratura originale.
N.B. il tasto O e il tasto Save Results sovrascrivono i dati al path specificato
Una volta configurato l'agente è possibile avviare la simulazione premendo il tasto Play.
Per ottenere gli stessi risultati presenti nella documentazione:
- Togliere la spunta alla casella Trained
- Spuntare la casella Training
- Inserire 5000 giri nel campo Laps to do
- Avviare la simulazione
- Premere il tasto Speed per velocizzare il processo
- Attendere la fine dei giri e premere il tasto Speed
- Premere il tasto O
- Premere il tasto Save Results se si vogliono esportare i dati
- Premere il tasto Play di Unity per fermare la simulazione
A questo punto è possibile usare lo script in Python main.py per visualizzare i grafici come specificato sopra
Per testare l'agente dopo il training precedente:
- Togliere la spunta alla casella Training
- Spuntare la casella Trained
- Inserire 50 giri nel campo Laps to do
- Avviare la simulazione
- Premere il tasto Speed se si vuole velocizzare il processo
- Attendere la fine dei giri e premere il tasto Speed se necessario
- Premere il tasto Save Results se si vogliono esportare i dati
- Premere il tasto Play di Unity per fermare la simulazione
A questo punto è possibile usare lo script in Python main.py per visualizzare i grafici come specificato sopra
n.d.r. nel package è presente una pista aggiuntiva non documentata, non è da considerare.