Enable JQuery execution.
Abilitare l'esecuzione di JQuery
Use an SVG enabled browser (eg Chrome, Firefox) for a proper visualization of the content.
See instructions here.
Per una corretta fruizione dei contenuti del sito deve essere utilizzato un browser abilitato alla visualizzazione di SVG (es. Chrome, Firefox).
Vedere le istruzioni qui.

Minecraft Pilot

L'obiettivo di questo progetto è di controllare in maniera automatica il proprio personaggio per fargli compiere delle (semplici) azioni.

 

Il client del gioco è scritto in Java e questo ha portato allo sviluppo di client modificati dagli usi più disparati. A mia conoscenza, ci sono dei problemi nel seguire questa strada. Innanzi tutto si deve conoscere (molto) bene il linguaggio Java e avere a disposizione un apposito ambiente di sviluppo che non sempre è aggiornato. Inoltre c'è il rischio concreto che un client modificato venga individuato dal server di gioco grazie ad anomalie nei comandi inviati. In tal caso il giocatore verrebbe classificato come imbroglione ed escluso permanentemente dal server.

 

Si è deciso di seguire una strada diversa, grazie ad una funzionalità offerta dal gioco stesso. Infatti è possibile attivare una sorta di modalità debug in cui a video compaiono molte informazioni riguardo al personaggio e al mondo.

Ad esempio vengono fornite le coordinate del personaggio e le caratteristiche del blocco puntato in quel momento.

 

Immagine1

 

Tali informazioni sono disponibili solo su schermo. Purtroppo non è noto un modo di accedere direttamente ai dati.

Per la decodifica delle informazioni si è realizzato una sorta di OCR per leggere i caratteri.

I caratteri sono generalmente ben definiti rispetto allo sfondo e si riescono ad isolare.

 

 

Per accedere alla schermata visualizzata si sono utilizzate delle funzioni di accesso al device context dello schermo fornite dal sistema operativo e disponibili in Lazarus/FreePascal

 

Ottenuta l'immagine della schermata si sono letti i singoli caratteri.

Conoscendo le posizioni in cui i caratteri vengono visualizzati, si è realizzato un programma che permette di definire le regole per il riconoscimento di ogni carattere.

In pratica si definiscono dei punti "strategici" in cui un carattere ha i pixel accesi o spenti. Un po' rozzo, ma funziona bene.

 

Ad esempio, per riconoscere la "M" si definisce la larghezza in pixel del carattere, i punti accesi (blu) e i punti spenti (rossi) da usare per il riconoscimento

Riconosciuta la "M" si passerà al successivo carattere.

 

 

Immagine2

 

 

Immagine3

Una volta realizzato l'archivio dati per il riconoscimento, la procedura OCR legge tutti i testi riportati nella schermata:

 

 1>Minecraft 1.13.2 (1.13.2/vanilla)   <

 2>60 fps (0 chunk updates) T: 100 vsync vbo   <

 3><

 4>C: 80/51984 (s) D: 28, L: 0, pC: 000, pU: 0, aB: 40   <

 5>E: 29/76, B: 0   <

 6>P: 154. T: All: 76   <

 7>MultiplayerChunkCache: 12<

 8>minecraft:overworld FC: n/a   <

 9>   <

10>XYZ: -9144.591 / 68.00000 / 2366.531   <

...

 

Ci sono scritte allineate a sinistra e scritte allineate a destra.

In caso di errato riconoscimento di un carattere basta definire con maggiore precisione il criterio di riconoscimento.

 

In un computer un po' datato, la decodifica viaggia a circa 20 fotogrammi al secondo.

 

Una volta ottenute le informazioni si deve controllare il personaggio come farebbe un umano, cioè tramite tastiera e mouse.

Usando Linux ci si è interfacciati con X11 e si è simulata la pressione dei tasti e il movimento del mouse.

Non è stato facile, ma spulciando il web con tanta pazienza si trova un po' di documentazione e codice C di esempio.

Il ricorso a programmi di sistema tipo "xdotool" non è opportuno per la scarsa precisione nella simulazione dei tempi di pressione dei tasti (o almeno questo risulta con le tecniche applicate).

 

Alla fine si è riusciti a muovere il personaggio, a ruotare la visuale e a controllare i click del mouse.

Allo stato attuale non si è ancora riusciti ad avere un controllo preciso del movimento.

Ci sono problemi nel controllare con precisione i tempi di pressione dei tasti.

 

Il programma finale è diviso in due parti: quella che ottiene lo screenshot e decodifica le informazioni e quella che elabora i comandi da inviare.

Con il multithreading si sono ottenuti risultati deludenti (sembrava monothread). Non è chiaro se ciò dipenda dal sistema Linux o dai meccanismi di sincronizzazione del FreePascal.

Nella versione finale sono presenti due programmi distinti che comunicano mediante IPC su area di memoria condivisa.

 

I concetti di robotica intervengono nei meccanismi di controllo dei movimenti, in cui si deve tenere conto dei tempi di risposta, delle informazioni limitate, della risposta che dipende dall'ambiente e non sempre come ci si aspetta, del controllo a retroazione per ottenere il comportamento desiderato senza innescare comportamenti instabili.

L'intelligenza artificiale interviene nello stabilire le azioni da compiere per raggiungere un certo risultato date delle informazioni limitate sul mondo.