* * * *
8 Visitatori, 1 Utente

Autore Topic: Minecraft Pilot  (Letto 58 volte)

SB

  • Scrittore
  • Full Member
  • *****
  • Post: 192
  • Karma: +0/-0
Minecraft Pilot
« il: Luglio 09, 2019, 12:42:00 pm »
Motivazione
Per chi non conosce Minecraft, si tratta di un gioco 3D multiplayer client/server in cui si interagisce in un mondo costituito da blocchi di vari materiali che si possono piazzare e raccogliere.
Mi sono chiesto se fosse possibile controllare in maniera automatica il personaggio per fargli compiere delle (semplici) azioni.
L'obiettivo finale (se mai lo raggiungerò) sarebbe quello di introdurre i ragazzi alle problematiche della robotica e dell'intelligenza artificiale utilizzando un ambiente/gioco che conoscono.

Progetto
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.
Ho quindi 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.

(vedi img 1)

Tali informazioni sono disponibili su schermo e non ho accesso diretto ai dati.
Ho pensato quindi di realizzare una sorta di OCR per leggere i caratteri.
Sono stato facilitato in questo: i caratteri sono generalmente ben definiti rispetto allo sfondo e si riescono ad isolare.

(vedi img 2)

Per accedere alla schermata visualizzata ho utilizzato apposite funzioni di accesso al device context dello schermo fornite dal sistema operativo e disponibili in Lazarus

Ottenuta l'immagine ho dovuto leggere i singoli caratteri.
Sapendo le posizioni in cui i caratteri vengono visualizzati, ho realizzato un programma che mi permette di definire le regole per il riconoscimento di ogni carattere.
In pratica definisco 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" definisco la larghezza in pixel, i punti accesi (blu) e i punti spenti (rossi)
Riconosciuta la "M" si passerà al successivo carattere.

(vedi img 3)

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   <
...

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.

Nel mio 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 ho dovuto interfacciarmi con X11 e simulare 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" è poco preciso per quanto riguarda la simulazione dei tempi di pressione dei tasti (o almeno per quello che sono le mie competenze)

Alla fine sono riuscito a muovere il personaggio, a ruotare la visuale e a controllare i click del mouse.
Allo stato attuale non sono ancora riuscito ad avere un controllo preciso del movimento.
Ho problemi nel controllare con precisione i tempi di pressione dei tasti.

Il programma è diviso in due parti: quella che prende lo screenshot e decodifica le informazioni e quella che elabora i comandi da dare.
Avevo tentato con il multithreading, ma ho ottenuto risultati deludenti (sembrava monothread). Non ho capito/approfondito se ciò dipenda dal sistema Linux o dal FreePascal.
Ho quindi realizzato due programmi distinti che comunicano mediante IPC su area di memoria condivisa.

La robotica interviene 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.

Piattaforma
Linux


Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1934
  • Karma: +4/-0
Re:Minecraft Pilot
« Risposta #1 il: Luglio 09, 2019, 12:56:51 pm »
Ciao.Hai scartato https://github.com/minetest/minetest?Sembra abbia delle interfacce per LUA.
Facendo uno scriptino di connessione tra i due applicativi?La butto lì senza passare per l'ocr.
Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2643
  • Karma: +7/-0
Re:Minecraft Pilot
« Risposta #2 il: Luglio 09, 2019, 02:03:02 pm »
Per il movimento di mouse e pressione di tastiera potevi comodamente usare il package LazMouseAndKeyInput. Per il resto sembra un progettino interessante
Ieri è passato, domani è futuro, oggi è un dono...

SB

  • Scrittore
  • Full Member
  • *****
  • Post: 192
  • Karma: +0/-0
Re:Minecraft Pilot
« Risposta #3 il: Luglio 10, 2019, 07:25:34 am »
Ciao.Hai scartato https://github.com/minetest/minetest?Sembra abbia delle interfacce per LUA.
Facendo uno scriptino di connessione tra i due applicativi?La butto lì senza passare per l'ocr.
Stilgar

Interessante.

Però riuscire ad usare Minecraft ha tutto un altro appeal  ;)

SB

  • Scrittore
  • Full Member
  • *****
  • Post: 192
  • Karma: +0/-0
Re:Minecraft Pilot
« Risposta #4 il: Luglio 10, 2019, 07:29:39 am »
Per il movimento di mouse e pressione di tastiera potevi comodamente usare il package LazMouseAndKeyInput. Per il resto sembra un progettino interessante

Grazie della segnalazione. Usano la stessa libreria Xtst.

 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
Utenti
  • Utenti in totale: 623
  • Latest: AleV68
Stats
  • Post in totale: 12476
  • Topic in totale: 1551
  • Online Today: 25
  • Online Ever: 520
  • (Novembre 04, 2018, 12:00:31 pm)
Utenti Online
Users: 1
Guests: 8
Total: 9

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.