Inhoudsopgave:

Schaakrobot gemaakt met LEGO en Raspberry Pi - Ajarnpa
Schaakrobot gemaakt met LEGO en Raspberry Pi - Ajarnpa

Video: Schaakrobot gemaakt met LEGO en Raspberry Pi - Ajarnpa

Video: Schaakrobot gemaakt met LEGO en Raspberry Pi - Ajarnpa
Video: Magic LEGO chess board VS Dylan Haegens 2024, November
Anonim
Image
Image

Verbaas je vrienden met deze schaakrobot!

Het is niet zo moeilijk om te bouwen als je al eerder LEGO-robots hebt gemaakt en als je op zijn minst een elementaire kennis hebt van computerprogrammering en Linux.

De robot maakt zijn eigen bewegingen en gebruikt visuele herkenning om de zet van de menselijke speler te bepalen.

Een van de nieuwe dingen in deze robot is de code voor bewegingsherkenning. Deze vision-code is ook bruikbaar voor schaakrobots die op veel andere manieren zijn gebouwd (zoals mijn ChessRobot met Lynxmotion-robotarm).

Er zijn geen speciaal schaakbord, reed-schakelaars of wat dan ook nodig (aangezien de beweging van de mens wordt bepaald door visuele herkenning).

Mijn code is beschikbaar voor persoonlijk gebruik.

Stap 1: Vereisten

Licht, camera, actie!
Licht, camera, actie!

Alle code is geschreven in Python, die onder andere op een Raspberry Pi zal draaien.

Raspberry Pi is een computer ter grootte van een creditcard die kan worden aangesloten op een scherm en een toetsenbord. Het is een goedkope (ongeveer $ 40), capabele kleine computer die kan worden gebruikt in elektronicaprojecten en robotica, en voor veel van de dingen die uw desktop-pc doet.

Mijn robot gebruikt een Raspberry Pi en Lego. De hardware-interface tussen de RPi en de Lego Mindstorms EV3-motoren en sensoren wordt geleverd door BrickPi3 van Dexter Industries.

De Lego-build is gebaseerd op "Charlie the Chess Robot", door Darrous Hadi, door mij aangepast, inclusief mods om een RPi te gebruiken, in plaats van de Lego Mindstorms-processor. Er wordt gebruik gemaakt van Lego Mindstorms EV3-motoren en sensoren.

Je hebt ook een tafel, een camera, verlichting, een toetsenbord, scherm en aanwijsapparaat (bijvoorbeeld muis) nodig.

En natuurlijk schaakstukken en een bord.

Ik beschrijf al deze dingen in meer detail in de volgende stappen.

Stap 2: De hardware-build

Image
Image

Zoals ik eerder al aangaf, zal het hart van de vision-code werken met verschillende builds.

Ik heb mijn robot gebaseerd op "Charlie the Chess Robot" (EV3-versie) van Darrous Hadi, op die pagina staat hoe je de bouwinstructies kunt krijgen. De onderdelenlijst staat hier.

Ik heb de robot op een aantal manieren aangepast.

1. De grijper. Dit werkte niet voor mij. De tandwielen slipten, dus ik voegde extra Lego-stukken toe om dat te voorkomen. En toen de kraan werd neergelaten, liep hij vaak vast, dus ik voegde een Watt-koppeling toe om dat te voorkomen.

Hierboven is de grijper in actie, met de gewijzigde koppeling.

2. De originele build maakt gebruik van de Lego Mindstorms EV3-processor, maar ik gebruik een Raspberry Pi, waardoor het gemakkelijk is om Python te gebruiken.

3. Ik gebruik een Raspberry Pi 3 Model B.

4. Om de RPi aan de Lego te koppelen, gebruik ik BrickPi3 van Dexter Industries. De BrickPi hecht aan de Raspberry Pi en samen vervangen ze de LEGO Mindstorms NXT of EV3-steen.

Als je het Lego Digital Designer-bestand hebt, dan is het de vraag om de LEGO-stukken te krijgen. Je kunt stenen rechtstreeks uit de LEGO-winkel halen en dit is de goedkoopste manier om ze te krijgen. Ze zullen echter niet alles hebben wat je nodig hebt, en het kan een paar weken of langer duren voordat de stenen aankomen.

Je kunt ook Rebrickable gebruiken: open een account, upload het LDD-bestand en krijg van daaruit een lijst met verkopers.

Een andere goede bron is Bricklink.

Stap 3: De software die de robot laat bewegen

Alle code is geschreven in Python 2.

  1. Dexter Industries levert code ter ondersteuning van het verplaatsen van de EV3-motoren, enz. Deze wordt meegeleverd met de BrickPi3.
  2. Ik geef de code om de motoren zo te laten bewegen dat de schaakstukken bewegen!
  3. De schaakengine is Stockfish - die elk mens kan verslaan! "Stockfish is een van de sterkste schaakmotoren ter wereld. Het is ook veel sterker dan de beste menselijke schaakgrootmeesters."
  4. De code om de schaakengine aan te sturen, te valideren dat een zet geldig is, enzovoort, is ChessBoard.py
  5. Ik gebruik een code van https://chess.fortherapy.co.uk om daarmee te communiceren.
  6. Mijn code (in 2 hierboven) sluit daar dan op aan!

Stap 4: De software om de beweging van de mens te herkennen

Nadat de speler zijn zet heeft gedaan, maakt de camera een foto. De code snijdt en roteert dit zodat het schaakbord precies in het volgende beeld past. De schaakbordvierkanten moeten er vierkant uitzien!. Er is vervorming in het beeld doordat de randen van het bord verder van de camera af staan dan het midden van het bord. De camera staat echter ver genoeg weg zodat deze vervorming na het uitsnijden niet significant is. Omdat de robot weet waar alle stukken zijn nadat de computer heeft gezet, hoeft de code alleen nog maar het verschil te zien tussen de volgende drie gevallen:

  • Een leeg vierkant
  • Een zwart stuk van welke aard dan ook
  • Een wit stuk van welke aard dan ook.

Dit omvat alle gevallen, inclusief rokeren en en passant.

De robot controleert of de beweging van de mens correct is en informeert hen als dit niet het geval is! Het enige geval dat niet wordt behandeld, is waar de menselijke speler een pion promoveert tot een niet-vrouw. De speler moet dan de robot vertellen wat het gepromoveerde stuk is.

We kunnen het beeld nu beschouwen in termen van schaakbordvierkanten.

Bij de initiële bordopstelling weten we waar alle witte en zwarte stukken zijn en waar de lege velden zijn.

Lege vierkanten hebben veel minder kleurvariatie dan bezette vierkanten. We berekenen de standaarddeviatie voor elk van de drie RGB-kleuren voor elk vierkant over al zijn pixels (behalve die in de buurt van de randen van het vierkant). De maximale standaarddeviatie voor elk leeg veld is veel kleiner dan de minimale standaarddeviatie voor elk bezet veld, en dit stelt ons in staat om na een volgende spelerzet te bepalen welke velden leeg zijn.

Nadat we de drempelwaarde voor lege versus bezette velden hebben bepaald, moeten we nu de stukkleur voor bezette velden bepalen:

Op het eerste bord berekenen we voor elk wit vierkant, voor elk van R, G, B, de gemiddelde (gemiddelde) waarde van zijn pixels (anders dan die in de buurt van de randen van het vierkant). Het minimum van deze gemiddelden voor elk wit vierkant is groter dan het maximum van de gemiddelden over elk zwart vierkant, en dus kunnen we de kleur van het stuk bepalen voor bezette vierkanten. Zoals eerder vermeld, is dit alles wat we hoeven te doen om te bepalen wat de zet van de menselijke speler was.

De algoritmen werken het beste als het schaakbord een kleur heeft die ver verwijderd is van de kleur van de stukken! In mijn robot zijn de stukken gebroken wit en bruin, en het schaakbord is met de hand gemaakt in kaart en is lichtgroen met weinig verschil tussen de "zwarte" en "witte" vierkanten.

Bewerken 17 okt 2018: Ik heb nu de bruine stukken mat zwart geverfd, waardoor het algoritme werkt onder meer variabele lichtomstandigheden.

Stap 5: Lichten, camera, actie

Lichten

Je hebt een gelijkmatige lichtbron nodig die over het bord wordt geplaatst. Ik gebruik deze, die erg goedkoop is, van amazon.co.uk - en er is ongetwijfeld iets soortgelijks op amazon.com. Met de kamerverlichting uitgeschakeld.

Update: ik heb nu twee lampen, voor een meer gelijkmatige lichtbron

Camera

Je kunt ongetwijfeld de speciale Raspberry Pi-cameramodule gebruiken (met een lange kabel), maar ik gebruik een USB-camera - "Logitech 960-001064 C525 HD Webcam - Zwart" - die werkt met de RPi. Je moet ervoor zorgen dat de camera niet beweegt ten opzichte van het bord, door een toren te bouwen of ergens stevig te bevestigen. De camera moet redelijk hoog boven het bord hangen om geometrische vervorming te verminderen. Ik heb mijn camera 58 cm boven het bord.

Update: ik geef nu de voorkeur aan de HP Webcam HD 2300, omdat ik deze betrouwbaarder vind.

Tafel

Je hebt een stevige nodig. Ik heb deze gekocht. Bovendien zie je dat ik een vierkant van MDF heb, met wat spullen om te voorkomen dat de robot gaat rondspringen als de trolley beweegt. Het is een goed idee om de camera in dezelfde positie boven het bord te houden!

Toetsenbord

De RPi heeft een USB-toetsenbord nodig voor de eerste installatie. En dat gebruik ik voor het ontwikkelen van de code. Het enige waar de robot een toetsenbord voor nodig heeft, is om het programma te starten en het slaan van de schaakklok te simuleren. Ik heb er zo een. Maar eigenlijk heb je alleen een muis of een GPIO-knop nodig die is aangesloten op de RPi

Weergave

Ik gebruik een groot scherm voor ontwikkeling, maar het enige dat de robot nodig heeft, is je vertellen dat je zet ongeldig is, controleren, enz. Ik heb er een, ook verkrijgbaar op amazon.com.

Maar in plaats van een display nodig te hebben, spreekt de robot deze zinnen! Ik heb dit gedaan door tekst naar spraak om te zetten met behulp van code zoals hier beschreven, en een kleine luidspreker aan te sluiten. (Ik gebruik een "Hamburger mini-speaker").

Zinnen die de robot zegt:

  • Rekening!
  • Schaakmat
  • Ongeldige zet
  • Jij hebt gewonnen!
  • patstelling
  • Tekenen door drievoudige herhaling
  • Regel voor tekenen met 50 zetten

De vijftig-zettenregel in het schaken stelt dat een speler remise kan claimen als er in de laatste vijftig zetten geen slag is gemaakt en geen pion is verplaatst (hiervoor bestaat een "zet" uit een speler die zijn beurt voltooit gevolgd door de tegenstander die zijn beurt voltooit).

Je kunt de robot horen praten in de korte "fool's mate" video hierboven (als je je geluid behoorlijk hoog zet)!

Stap 6: Hoe de software te krijgen

1. Stokvis

Als je Raspbian op je RPi draait, kun je de Stockfish 7-engine gebruiken - het is gratis. Ren gewoon:

sudo apt-get install stockfish

2. Schaakbord.py

Haal dit hier.

3. Code gebaseerd op

Wordt geleverd met mijn code.

4. Python-stuurprogramma's voor BrickPi3:

Haal deze hier.

5. Mijn code die alle bovenstaande code oproept en die de robot de bewegingen laat maken, en mijn visiecode.

Krijg dit van mij door een reactie te plaatsen, en ik zal reageren.

Aanbevolen: