Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Overrask vennene dine med denne sjakkroboten!
Det er ikke så vanskelig å bygge hvis du har laget LEGO -roboter før, og hvis du har minst en elementær kunnskap om dataprogrammering og Linux.
Roboten gjør sine egne trekk, og bruker visuell gjenkjenning for å bestemme den menneskelige spillerens bevegelse.
En av de nye tingene i denne roboten er koden for bevegelsesgjenkjenning. Denne visjonskoden er også brukbar for sjakkroboter bygget på mange andre måter (for eksempel min ChessRobot som bruker Lynxmotion robotarm).
Ingen spesielle sjakkbrett, sivbrytere eller hva som helst er nødvendig (ettersom menneskets bevegelse bestemmes av visuell gjenkjenning).
Koden min er tilgjengelig for personlig bruk.
Trinn 1: Krav
All koden er skrevet i Python, som blant annet skal kjøres på en Raspberry Pi.
Raspberry Pi er en datamaskin i kredittkortstørrelse som kan kobles til en skjerm og et tastatur. Det er en liten (ca. $ 40), liten datamaskin som kan brukes i elektronikkprosjekter og robotikk, og for mange av tingene den stasjonære PC -en din gjør.
Min robot bruker en Raspberry Pi og Lego. Maskinvaregrensesnittet mellom RPi og Lego Mindstorms EV3 motorer og sensorer er levert av BrickPi3 fra Dexter Industries.
Lego -bygget er basert på "Charlie the Chess Robot", av Darrous Hadi, modifisert av meg, inkludert mods for å bruke en RPi, i stedet for Lego Mindstorms -prosessoren. Lego Mindstorms EV3 motorer og sensorer brukes.
Du trenger også et bord, et kamera, belysning, et tastatur, skjerm og pekeenhet (f.eks. Mus).
Og selvfølgelig sjakkbrikker og et brett.
Jeg beskriver alle disse tingene mer detaljert i de påfølgende trinnene.
Trinn 2: Maskinvarebygningen
Som jeg tidligere antydet, vil hjertet i visjonskoden fungere med en rekke bygninger.
Jeg baserte roboten min på "Charlie the Chess Robot" (EV3 -versjon) av Darrous Hadi, info på siden sier hvordan du får byggeinstruksjonene. Delelisten er her.
Jeg modifiserte roboten på et par måter.
1. Griperen. Dette fungerte ikke for meg. Girene gled, så jeg la til flere legobiter for å forhindre det. Og da kranen ble senket, ville den ofte syltetøy, så jeg la til en watts kobling for å forhindre det.
Over er fangeren i aksjon, som viser den modifiserte koblingen.
2. Den originale bygningen bruker Lego Mindstorms EV3 -prosessoren, men jeg bruker en Raspberry Pi, som gjør det enkelt å bruke Python.
3. Jeg bruker en Raspberry Pi 3 modell B.
4. For å koble RPi til Lego bruker jeg BrickPi3 fra Dexter Industries. BrickPi festes til Raspberry Pi og sammen erstatter de LEGO Mindstorms NXT eller EV3 Brick.
Når du har Lego Digital Designer -filen, så er det spørsmålet om å få LEGO -brikkene. Du kan få klosser direkte fra LEGO -butikken, og dette er den billigste måten å skaffe dem på. Imidlertid vil de ikke ha alt du trenger, og det kan ta et par uker eller mer før klossene kommer.
Du kan også bruke Rebrickable: åpne en konto, last opp LDD -filen og få en liste over selgere fra den.
En annen god kilde er Bricklink.
Trinn 3: Programvaren som får roboten til å bevege seg
All koden er skrevet i Python 2.
- Dexter Industries leverer kode for å støtte flytting av EV3 -motorer osv. Dette følger med BrickPi3.
- Jeg gir koden for å få motorene til å bevege seg på en slik måte at sjakkbrikkene flyttes!
- Sjakkmotoren er tørrfisk - som kan slå ethvert menneske! "Tørrfisk er en av de sterkeste sjakkmotorene i verden. Den er også mye sterkere enn de beste menneskelige sjakkmestrene."
- Koden for å drive sjakkmotoren, validere at et trekk er gyldig, og så videre er ChessBoard.py
- Jeg bruker noen kode fra https://chess.fortherapy.co.uk for å koble til det.
- Koden min (i 2 ovenfor) grensesnitt deretter med det!
Trinn 4: Programvaren for å gjenkjenne menneskets bevegelse
Etter at spilleren har gjort sitt trekk, tar kameraet et bilde. Koden beskjærer og roterer dette slik at sjakkbrettet passer nøyaktig til det påfølgende bildet. Sjakkbrettene må se firkantede ut! Det er forvrengning i bildet fordi kantene på brettet er lenger borte fra kameraet enn midten av brettet er. Kameraet er imidlertid langt nok unna, slik at denne forvrengningen etter beskjæring ikke er signifikant. Fordi roboten vet hvor alle brikkene er etter datamaskinens bevegelse, er alt som må gjøres etter at mennesket har gjort et trekk at koden skal kunne se forskjellen mellom følgende tre tilfeller:
- En tom firkant
- Et sort stykke av noe slag
- Et hvitt stykke av noe slag.
Dette dekker alle saker, inkludert castling og en passant.
Roboten sjekker at menneskets bevegelse er riktig, og informerer dem om det ikke er det! Det eneste tilfellet som ikke dekkes er hvor den menneskelige spilleren promoterer en bonde til en ikke-dronning. Spilleren må deretter fortelle roboten hva det promoterte stykket er.
Vi kan nå vurdere bildet når det gjelder sjakkbrettfirkanter.
På den første tavleoppsettet vet vi hvor alle de hvite og svarte brikkene er og hvor de tomme rutene er.
Tomme firkanter har mye mindre variasjon i farge enn de som har okkuperte firkanter. Vi beregner standardavviket for hver av de tre RGB -fargene for hver firkant på tvers av alle pikslene (andre enn de nær kvadratets grenser). Det maksimale standardavviket for et tomt felt er mye mindre enn minimumsstandardavviket for et okkupert kvadrat, og dette lar oss, etter et påfølgende spillerbevegelse, bestemme hvilke ruter som er tomme.
Etter å ha bestemt terskelverdien for tomme kontra okkuperte firkanter, må vi nå bestemme brikkens farge for okkuperte firkanter:
På det første tavlen beregner vi for hver hvit firkant, for hver av R, G, B, gjennomsnittlig (gjennomsnittlig) verdi av pikslene (andre enn de nær kvadratets grenser). Minimumet av disse midlene for en hvit firkant er større enn maksimumet av midlene på tvers av en svart firkant, og så kan vi bestemme brikkens farge for okkuperte firkanter. Som nevnt tidligere, er dette alt vi trenger å gjøre for å finne ut hva den menneskelige spillerens trekk var.
Algoritmene fungerer best hvis sjakkbrettet har en farge som er langt fra fargen på brikkene! I roboten min er brikkene off-white og brune, og sjakkbrettet er håndlaget i kort, og er en lysegrønn med liten forskjell mellom de "svarte" og "hvite" rutene.
Rediger 17. oktober 2018: Jeg har nå malt de brune bitene matt svarte, noe som får algoritmen til å fungere under mer varierende lysforhold.
Trinn 5: Lys, kamera, action
Lys
Du trenger en jevn lyskilde plassert over brettet. Jeg bruker denne, som er veldig billig, fra amazon.co.uk - og det er uten tvil noe lignende på amazon.com. Med lysene på rommet slått av.
Oppdatering: Jeg har nå to lys, for å gi en jevnere lyskilde
Kamera
Ingen tvil om at du kan bruke den spesielle Raspberry Pi -kameramodulen (med en lang kabel), men jeg bruker et USB -kamera - "Logitech 960-001064 C525 HD Webcam - Black" - som fungerer med RPi. Du må sørge for at kameraet ikke beveger seg i forhold til brettet, ved å bygge et tårn eller ha et sted å fikse det godt. Kameraet må være ganske høyt over tavlen for å redusere geometrisk forvrengning. Jeg har kameraet mitt 58 cm over brettet.
Oppdatering: Jeg foretrekker nå HP Webcam HD 2300, da jeg synes det er mer pålitelig.
Bord
Du trenger en solid. Jeg kjøpte denne. På toppen av det kan du se at jeg har en firkant av MDF, med noen ting for å stoppe roboten som hopper rundt når vognen beveger seg. Det er en god idé å holde kameraet i samme posisjon over brettet!
Tastatur
RPi trenger et USB -tastatur for sitt første oppsett. Og jeg bruker det for å utvikle koden. Det eneste roboten trenger et tastatur for er å starte programmet og simulere å treffe sjakkuret. Jeg har en av disse. Men egentlig trenger du bare en mus eller en knapp GPIO-koblet til RPi
Vise
Jeg bruker en stor skjerm for utvikling, men det eneste roboten trenger er å fortelle deg at flyttingen din er ugyldig, sjekk osv. Jeg har en av disse, også tilgjengelig på amazon.com.
Men i stedet for å kreve en visning, vil roboten snakke disse setningene! Jeg har gjort dette ved å konvertere tekst til tale ved hjelp av kode som beskrevet her, og legge ved en liten høyttaler. (Jeg bruker en "Hamburger minihøyttaler").
Setninger roboten sier:
- Kryss av!
- Sjakkmat
- Ugyldig trekk
- Du vant!
- Fastlåst situasjon
- Tegn ved tre gjentagelser
- Regelen for tegning med 50 trekk
Femtrekksregelen i sjakk sier at en spiller kan kreve uavgjort hvis ingen fangst er gjort og ingen bonde har blitt flyttet i de siste femti trekkene (for dette formålet består et "trekk" av at en spiller fullfører sin tur etterfulgt av motstanderen fullfører sin tur).
Du kan høre roboten snakke i den korte "dårens kompis" -videoen ovenfor (hvis du skrur lyden ganske høyt)!
Trinn 6: Slik får du programvaren
1. Tørrfisk
Hvis du kjører Raspbian på din RPi kan du bruke Stockfish 7 -motoren - det er gratis. Bare løp:
sudo apt-get install tørrfisk
2. ChessBoard.py
Få dette her.
3. Kode basert på
Kommer med koden min.
4. Python -drivere for BrickPi3:
Få disse her.
5. Koden min som påkaller all koden ovenfor og som får roboten til å gjøre bevegelsene, og visjonskoden min.
Få dette fra meg ved å legge ut en kommentar, så svarer jeg.