Frispel

sedan 2001

Datorstyrt flipper med AI

BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
Hej alla flipperfantaster.

Jag har börjat klura på en grej som ingen verkar ha provat tidigare, jag har inte hittat något på Google i allafall.

Jag tänker bygga ett datorstyrt flipperspel (det har jag hittat) som kan lära sig att spela flipper och lista ut reglerna på vilket spel som helst.

Målet är att skapa en AI som kan lista ut det mest optimala sättet att bygga poäng på och att kunna slå en mänsklig spelare

Jag har börjat skissa på hur det ska fungera och jag tänkte ventilera lite av mina idéer här för att se vad ni tycker.

Den hårdvara som jag tänkt använda är: ett flipperspel, en dator, 1 eller 2 webbkameror och någon typ av IO modul för att styra flipprar och uppskjutare.

Webbkamerorna kommer att fungera som datorns ögon. Jag är lite osäker på vad som blir enklast, men en webbkamera kommer i allafall att monteras ovanför flippret för att ”titta” ner på spelplanen och hålla reda på var kulan är. Den andra webbkameran är tänkt att hålla reda på poängen.

Man kan troligen lösa bollkoll & poängräkning med bara en webbkamera genom att ha den vinklad så att kameran ser både poäng och spelplan, eller att rikta med en spegel.

Ett annat alternativ som också bör fungera och tar mindre cpukraft, är att läsa ut poängen digitalt från flippret. Jag har inte kollat upp om det går, men jag gissar att det går. Det enda som skulle kunna vara något negativt med det som jag kommer på är att man då behöver dubbelriktad datakommunikation.

Programmet för att styra flippret har jag tänkt skriva i C++.

Så här har jag tänkt att styrningen/Ai:n ska fungera:

Det första steget är att ta en bild av en neutral spelplan precis som det ser ut efter att man startat ett nytt spel. Den bilden kommer att vara själva grunden som man sedan använder för att kunna spåra både kulans rörelser och förändringar på spelplanen. Förändringar på spelplanen är tex. att en lampa tänds.

Att hålla reda på poäng, styra flipprar och läsa bollposition borde vara rätt ”straight forward” att göra, det ser jag som den enklare delen av problemet.

Sedan till själva inlärningsdelen.

Jag har inte funderat så mycket på detta ännu, och jag hoppas att jag kan få lite tips och idéer om hur man på bästa sätt kan hantera detta.

Det här har jag kommit fram till:

Alla positioner kommer till en början att sparas i en databas. Bollpositionen kommer att läsas av så många gånger per sekund som kameran uppdateras. Jag har tänkt att använda en ps3 eye kamera, den kan köra i 60 fps - 640x480 eller 120 fps – 320x240. Högre fps = snabbare reaktion, men jag vet inte om den låga upplösningen räcker till att kunna spåra bollen tillräckligt bra. Det blir nog lite trail and error.

Genom att jämföra med tidigare postioner av kulan så kan man räkna ut intressanta saker som acceleration, hastighet och förväntad bana.

Efter en viss tid eller tex. när man missat en kula så gör man en operation för att frigöra minne och lära upp AI:n.

Om vi säger att ett spel tagit 37 sekunder och vi sparar i 60 fps så blir det  2220 positioner.

Det första man gör är att minska ner på antalet postioner genom att hitta avvikande punkter som man sedan kan interpolera mellan. Man kanske bör spara hastighet/acceleration i varje kontrollpunkt för att spara tid i eventuella senare beräkningar.

Sen till själva AI delen.

Jag tänker  att man gör så att varje gång en flipper skjuter iväg en kula så börjar man en ny poängkurva. En poängkurva börjar med en startposition där kulan lämnar flippern och slutar när kulan träffar en flipper igen eller förloras. Förutom själva kurvan så sparar man också poängskillnanden mellan start och stopp.

På så vis kan man betygsättea varje försök som AI:n gör. Kurvor som resulterar i drain tex. inte intressanta att spara.

Till en början när man inte har några poängkurvor alls så kommer AI:n att göra slumpmässiga försök och helt enkelt testa sig fram.

Efter ett tag när man har börjat få in data så kommer AI:n att börja prova tidigare ”lyckade” försök. Dels för att avgöra vad som går att återskapa gång på gång, och även att kasta bort såna kurvor som leder till slumpat beteende som tex. att skjuta på bumprar.

Ju fler kuvor som sparas destå bättre kommer även AI:n att förstå spelplanen. Genom att gå igenom alla punkter  i databasen så kan man bygga en virituell fysisk modell av spelplanen som sedan används till att ännu bättre kunna beräkna förväntad bana. Genom analysering av accelerationer kan man troligen även beräkna höjdskillnader på spelplanen (ramper).

Då och då kan man även på samma sätt som man rensade bort onödiga positioner även rensa bort "dåliga" kurvor.

Om flera kurvor liknar varann och har samma poäng så lägger man ihop dom och skapapar en starkare kurva. På så vis bygger man fram en vinnande stategi.

Sen börjar det bli riktigt klurigt.

När man har tusentals (miljontals?) kurvor sparade så är nästa steg att försöka lista ut serier av vinnande strategier och koppla ihop med förändringar av spelplanen. Jag lite osäker på hur man egentligen löser detta, men kanske man kan koppla kurvorna till en ny uppsättning data som försöker koppla ihop en serie av kurvor i någon sorts följd/tidsbaserad trädstruktur.

Det är här som spelets regler skapas.

Om du läst så här långt så är det nu dags att föja upp med en kommentar om vad du tycker om det hela.

Är det en bra idé?
Ser du några svagheter, brister, fel?
Har du förslag på förbättringar, frågor?

Jag är tacksam för all respons och ser gärna att du kommenterar.

/Björn

Ps. För tillfället äger jag inget flipperspel, men det kommer att införskaffas under nästa år.


rasmadrak

  • Sr. Member
  • ****
    • Antal inlägg: 373
    • Visa profil
  • Stad: Göteborg
Låter som att neural network AI kan vara något att tillämpa här, för att "summera" inlärningen av kurvor etc.

Coolt projekt, om än kanske mer häftigt än praktiskt? :)

Det finns en stor risk att kameran blir förvirrad av alla ljus etc, så jag skulle nog nästan rekommendera två kameror, en med infrarött som följer bollen och en för vanligt ljus som håller koll på tända lampor etc.
Att beräkna höjdskillnader m.h.a acceleration är nog inte heller en rekommenderad väg utan satsa istället på en kamera som kan läsa i 3D.

Kan tänka mig att man får skapa en ny kulbana för varje gång kulan byter riktning etc.

En betydligt enklare, men mindre ambitiös idé är ju att helt enkelt hålla koll på vart kulan är i förhållande till flipprarna och att datorn skjuter på måfå. Det skulle bara krävas en simpel automatisk kalibrering för varje nytt spel så datorn vet vad som rör sig när man flipprar etc.
Att därifrån räkna ut vilka skott som ger längst boll-tider är ju en lättare sak att göra, tror jag.
Robert Bjärmyr


JPN

  • Donator Silver
  • Sr. Member
  • *****
    • Antal inlägg: 261
    • Visa profil
  • Stad: Lund
Det låter som ett väldigt kul men omfattande projekt. Frågan är vad du tycker är mest intressant i första skedet, lära upp AI:t eller låta datorn spela flipper. Om det är att lära upp AI:t så kanske du skulle kolla på om du inte kan koppla upp dig mot virtual pinball via ett API eller liknande istället. Då slipper du första "uppförsbacken" med kameror, elektronik som aktiverar flipprar och plunger etc. Jag tror (rätta mig om jag har fel ni som är mer erfarna) att en dator dessutom är helt chanslös om den inte har möjligheten att fysiskt "skaka" lite på spelet också så att den kan rädda annars "oräddbara" bollar som går mot mitten eller outlane.


Bundy

  • Hero Member
  • *****
    • Antal inlägg: 678
    • Visa profil
  • Stad: Sandviken
Och vitsen med allt detta jobb skulle vara?
Quit playing with the clock!


BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
rasmadrak: Ett neuralt nätverk kan nog vara lösningen på problemet. Jag har aldrig byggt någon sånt och vet knappt hur det funkar, men det lilla jag vet så känns det som att det kan vara passande.

Och angående förvirring av kameror så kan det nog stämma, det hade jag inte tänkt på. Jag har ju faktiskt en kinect kamera, det kanske vore bättre att använda den. Fast jag vet inte om kinecten är tillräckligt snabb.

När det gäller själva byggandet av spelplanen så kanske det är en grej som inte ens behövs egentligen. Höjdberäkning osv kan vara överkurs.

JPN: Troligen är projektet mycket mer omfattande än jag inser just nu :)

Jag vill inte koppla ihop med ett vr pinball för att då blir man beroende av att det ska finnas en modell av det aktuella spelet. Min idé är att programmet ska kunna lära sig vilket flipper som helst.

Jag inser också att det troligen kan bli svårt att slå en mänsklig spelare pga. "fusk" som att skaka flippret.

Jag tänker mig att om man ska utmana datorn så ska det vara på samma villkor, alltså inget skakande.

Sedan tror jag det blir stort sett omöjligt att lära den diverse trick som att flytta kulan till den andra flippern m.m. Så där kommer människan helt klart att ha ett övertag.

Det jag är mest intresserad av att göra är själva AI delen. Till en början så skulle man kunna göra så att man sätter ett antal punkter där man vill att bollen ska komma. Då borde man rätt enkelt kunna matcha upp dessa punkter mot kurvorna.


johan

  • Sr. Member
  • ****
    • Antal inlägg: 432
    • Visa profil
  • Stad: Stockholm
Bundy: För att det är roligt?

Jag skulle tro att en väldigt stor andel av den tekniska utvecklingen sker för att någon tänkt att det vore roligt att testa om X funkar.

BjornEkelof: Börja med att kolla på ett gammalt elektromekaniskt spel, där har du fördelen att displayen alltid visar aktuell poäng och lamporna visar alltid exakt vilket läge spelet är i. Modernare spel visar gärna nåt annat på displayen och okynnesblinkar ofta med spelplanslamporna.
Det är lika för alla


BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
Bundy: Vitsen är väl bara att se om det går att genomföra.

Jag ser egentligen inget vettigt användningsområde för det hela.

Det skulle kunna vara en rolig grej att ställa upp ett sånt spel på en tävling.


BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
När jag tänker efter så skulle man ju kunna göra ett annat inlärningsläge också där man själv spelar och AI:n bara observerar.

Det kanske skulle ge en ännu snabbare inlärningstid.

På så sätt skulle man också kunna lära datorn små trick som att förflytta kulan till andra flippern. Där man manuellt programerar in själva nyttan av ett sånt drag.


Bundy

  • Hero Member
  • *****
    • Antal inlägg: 678
    • Visa profil
  • Stad: Sandviken
Hela vitsen med flipper, för mig i alla fall, är ju att uppleva det fysiska spelandet inte att titta på när någon annan spelar, speciellt inte en dator.
Quit playing with the clock!


gondar

  • Jr. Member
  • **
    • Antal inlägg: 74
    • Visa profil
  • Stad: Borås
Hur skall datorn "se" vilket spel det är då? Bildigenkänning?
Datorn måste veta att den ställer sig vid ett spel den spelat innan för att det ens skall vara intressant att "lära sig". Annars är det lika bra att bara hålla koll på kulans position vid flipprarna och eventuellt hastighet samt vinkeln den kommer från, för att räkna ut ett skott med minst chans till drain. Lite åt det hållet som rasmadrak sa.

Alla former av beräkningar tar tid, och i ett flipperspel är det inget du har mycket av. Beräkningarna måste nästan vara klara innan kulan börjar rulla på flippern = ytterligare svårighet.

Jag ser så många problemområden i det du försöker göra. Det är svårt att lära en dator ett enda spel, att göra det för vilket spel som helst är en näst intill omöjlig uppgift inom en livstid som hobbyprojekt. Detta om du inte "fuskar" till intelligensen d.v.s.

Jag måste också ifrågasätta ditt val av programmeringsspråk om du skall programmera en självlärande AI. C++ låter i mina öron inte som det bäst lämpade språket för denna typ av program. Du skulle nog spana in Haskell eller LISP. Möjligen kan du skriva vissa delar i C++. Jag tänker inte gå in på detaljer om detta då vi är på ett flipperforum och inte ett programmeringsforum.

Bästa rådet jag kan ge är nog: tänk om. Bestämmer du dig för att fortsätta med projektet så skala ner det om det någonsin skall bli i närheten av funktionsdugligt. Inte meningen att låta negativ. Det är som sagt kul att leka lite för att lära sig. Men du får nog se det som just ett lekprojekt för att lära dig saker (och även då skulle jag råda dig till att hitta på ett "enklare" projekt för att lära dig AI programmering).

Usch... nu kännes det som jag spottat ut massa negativa saker. Kör på så länge du tycker det känns roligt!


INK

  • Donator Silver
  • Hero Member
  • *****
    • Antal inlägg: 12168
    • Visa profil
  • Stad: Borås


BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
gondar: Jag tror man helt enkelt får säga åt programmet vilket spel som ska spelas och välja rätt databas efter det. Sedan för att den gamla inlärningen ens ska fungera så krävs det ju att kameran sitter på exakt samma ställe vid varje inlärning.

Jag tror att själva spelande delen egengtligen bara behöver bestå av att välja bland lyckade tidigare försök och inte bestå av så mycket beräkningar. Till att börja med i allafall.

Jag är medveten om att det troligen finns en hel del problem som jag inte ens har tänkt på ännu. Till att börja med så kommer jag självklart att börja med endast ett spel för att se om det ens verkar vara möjligt.

Om det finns andra mer lämpade programmeringsspråk så är det mycket möjligt att jag istället väljer något annat än c++. Tanken med den här posten är just att få förslag på vad som skulle vara det bästa tillvägagångssättet.

Jag har varit en aktiv programmerare i allafall de senaste 15 åren och är en inbiten datanörd sen barnsben. Så att lära mig ett till programmeringsspråk ser jag inte som någon omöjlighet. Men jag börjar nog med något jag redan kan.

Som du säger så kommer detta uppenbarligen bli ett lek/hobby projekt, om jag ens kommer att komma igång med det. Jag äger som sagt inte ens ett flipper just nu så det blir det första att ta tag i.

Jag tycker inte alls du är negativ utan ger bra konstuktiv kritik. Tack för det.


BjornEkelof

  • Newbie
  • *
    • Antal inlägg: 12
    • Visa profil
  • Stad: Hudiksvall
INK: Trevligt, då finns det i allafall någon som gjort något liknande.

Visserligen en enklare approach, men det kanske är så man får börja.

Jag ska kolla igenom deras dokumentation och se om jag hittar någon nyttig info där.


CKR

  • Donator Silver
  • Hero Member
  • *****
    • Antal inlägg: 1020
  • www.flippercenter.se
    • Visa profil
  • Stad: Torslanda
Jag tycker det låter som ett roligt projekt, men det kommer nog att bli tufft att få datorn att slå de lite mer kvalificerade spelarna, men definitivt är det ju intressant och se hur bra den skulle kunna bli.

Addams Family har ju en liten kort flipper som lär sig att träffa in i ett hål (swamp) genom att det finns stand-up targets ovanför och under detta hål. På det exemplar som jag hade så träffade nog jag procentuellt sett swamp lika ofta som "Thing" (automatflipp-funktionen) gjorde det (Eller så är det bara det jag vill minnas.), och då räknas inte jag in som en av de kvalificerade spelarna.

Det är klart att det finns helt annan hårdvara att tillgå idag, fast i TAF kommer kulan kontrollerat ur en ramp och med en hyfsat kontrollerad hastighet så jag tycker nog att man kunde ha förväntat sig högre träffsäkerhet av Thing.

Angående att lära datorn att spela olika spel, så skulle jag tro att det nog blir väldigt svårt att ens byta till ett annat exemplar av samma spel, då spelens lutning i båda led, hur välpolerad spelplan och kulor är, hur hårt gummit i flipprarna är osv. varierar. Och fasen vet varför, men det kan vara otroligt stor skillnad på hur svåra olika exemplar av samma spel är att spela.
En annan svårighet är ju också att förutsättningarna ändrar sig hela tiden genom att flippermekaniken slits och flipperarmarna blir lite tröttare, gummit på flipprarna hårdnar och slits, spelplan blir smutsigare osv. osv.

Men låt dig nu inte nedslås, utan kämpa på.

Lycka till.
www.flippercenter.se
flippercenter@gmail.com


Tags: