Robotas, surenkantis Rubiko kubą

Idėja pabandyti padaryti tokį robotą kilo bebraidant internete. Ten galima rasti keletą panašių projektų. Naudojamas koks nors mechanizmas kubo sukinėjimui ir koks nors būdas spalvų nuskaitymui. Mechanizmą galima atsispausdinti.

Spalvų nuskaitymui norėjau panaudoti telefono kamerą. Šiais laikais tai pats prieinamiausias būdas. Iš pirmo žvilgsnio atrodo, kad atpažinti spalvas turėtų būti paprasta. Bet taip tik atrodo…

Pirmiausiai pabandžiau padaryt Android programą, kuri atpažintų kubo spalvas. Iki šiol nebuvau nieko daręs su telefono kamera. Todėl pradžia buvo sunkoka. Norėjau, kad kameros vaizdas būtų lange, o šalia galėčiau nupiešti visas kubo puses. Ilgokai vargau, kol pavyko “susikalbėti” su kamera. Dar reikėjo nupiešti tiesiog ant vaizdo 9 kvadratų tinklelį, kuriame ir bus nuskaitinėjamos spalvos. Kai tai pavyko, paaiškėjo, kad spalvų atpažinimas žymiai sudėtingesnė užduotis nei aš galvojau. Iš pradžių bandžiau imti RGB spalvų reikšmes. Tačiau taip nieko gero nesigavo. Tada pabandžiau HSV (hue, saturation, value) spalvų modelį. Taip reikalai pagerėjo. Atskirti šešias reikiamas spalvas jau buvo galima, tačiau bėda tame, kad tai labai priklauso nuo apšvietimo. Po galybės derinimų pavyko gauti pakenčiamą rezultatą. Jei apšvietimas tinkamas (tereikia tik pasukti kubą taip, kad šviesa nekristų statmenai), atpažinimas suveikia visada teisingai. Jokio papildomo apšvietimo nenaudoju, nors tokia mintis irgi buvo. Kaip paaiškėjo, sunkiausia atskirti vieną nuo kitos oranžinę ir raudoną spalvas. Nors žiūrint atrodo, kad jos skiriasi stipriai.

Kai jau buvo aišku, kad spalvas atpažinti pavyks, reikėjo pasirinkti kokį nors mechanizmą. Pasirinkau gana paprastą konstrukciją su dviem griebtuvais (gripper). Galima rasti internete jo 3D modelį, kad atsispausdinti 3D spausdintuvu. Ten kubo laikymui ir sukimui naudojami servo mechanizmai. Aš griebtuvus šiek tiek perdariau. Laikymui naudoju servo mechanizmus, o sukimui žingsninius variklius. Man atrodė, kad taip bus paprasčiau ir tiksliau.

Konstrukcija nebloga, viskas surenkama varžtų pagalba. Servo mechanizmai – MG996R.

Varikiai NEMA17, tie patys, kurie buvo nadojami robote, balansuojančiame ant kamuolio. Laikikliai irgi atspausdinti.

Elektronika – Arduino mini, du žingsninių variklių draiveriai DRV8825, 5V, 2A reguliatorius, ir bluetooth modulis.

Toks mechanizmas turi būti sureguliuotas labai tiksliai. T.y. 90 laipsnių kampas tarp griebtuvų ir tikslus atstumas tarp jų. Kitaip kubą apsukus, kitas giebtuvas jau sugriebia netiksliai. Čia teko daug derinti. Bet kiek aš nevargau, tiksliai vis tiek nesigavo. Jei pasukus 90 laipsnių kampu viskas gerai, tai pasukus 180 laipsnių, jau sugriebia netiksliai. Čia kalba ne apie žingsninių variklių pasisukimą. Su jais jokių problemų, pasisuka tiksliai kiek nurodyta. Esmė pačiame kubo laikyme. Kada kubą laiko vienas griebtuvas, kartais jis kažkiek praslysta ir viskas susimaišo. Nors tose vietose, kurios laiko kubą yra užklijuota guma, vis tiek tai ne visai sprendžia problemą. Išbandžiau visokiausius variantus, viskas daugybe kartų matuota ir permatuota, bet vis tiek kažkur yra netikslumas.

Dėl šios priežasties robotas buvo ilgą laiką numestas. Taip pragulėjo beveik metus. Bet vėliau atsirado noras jį užbaigti. Atradau paprastą sprendimą. Kai kubas apsukamas 180 laipsnių, trumpam atleidžiami abu griebtuvai (tai matosi video). Tada jis vėl paprasčiausiai įkrenta į vietą.

Arduino programoje yra suprogramuoti visi pasisukimo variantai. Pradinėje padėtyje abu griebtuvai uždaryti. Sakykim, kad žalia spalva priekyje. Jei šią sienelę reikia pasukti, tai reikia atlikti tokius veiksmus: atidaryti antrą griebtuvą, pirmą pasukti 180 laipsnių, uždaryti antrą griebtuvą, pasukti antrą griebtuvą į reikiamą pusę. Tokiomis sekomis yra suprogramuoti visi galimi pasukimai.

Taigi, Android programa nuskaito visas spalvas. Po kiekvieno SCAN paspaudimo perduoda komandą pasukti kubą sekančios sienelės nuskaitymui. Visos nuskaitytos spalvos matosi ekrane. Suformuojama tam tikra spalvų išdėstymo seka, kuri perduodama sprendimo suradimo programai. Čia aš pats nieko nekūriau, tai jau seniai yra sukurta ir galima tiesiog pridėti reikiamą biblioteką.

Yra įrodyta, kad iš bet kokios padėties kubą galima surinkti padarant ne daugiau kaip 20 pasukimų. Mažiau gali būti. Tačiau daugiau – niekada. Tai vadinama God’s number. Sprendimas kaip surinkti padarant 20 pasukimų buvo apskaičiuotas 2010 metais. Kam įdomu, apie tai galima paskaityti internete. Surastas sprendimas perduodamas į Arduino. Daugiau telefonas nieko nedaro, sprendimą vykdo Arduino programa. Tiesa, dar perdavinėja atgal į telefoną kokią komandą šiuo metu vykdo.

Pradiniam variante, kad būtų paprasčiau, po kiekvieno pasukimo grįždavo į pradinę padėtį. Tai labai supaprastina surinkimo programą, nes nereikia galvoti kokioje padėtyje po eilinio sienelės pasukimo yra kubas. Bet taip daroma daug nereikalingų veiksmų.

Vėliaus aš pakeičiau algoritmą, kad nereikėtų grįžti į pradinę padėtį. Taip surenka gerokai greičiau.

Suprantama, tobulinti čia dar galima daug. Galima būtų dar nedaryti ir nereikalingų sugriebimo veikmų. Taip algoritmas pasidarytų dar sudėtingesnis, be to atsirastų problema, kad gali susisukti servo mechanizmų laidai. T.y. dar tektų sekti kokioje padėtyje dabar yra griebtuvai, ir ar nereikia prieš darant sekantį pasukimą atsisukti atgal, kad nenutraukti laidų.

Bet aš neturėjau tikslo padaryti kuo geresnį surinkimo algoritmą. Mane labiau domino Android programavimas. Tokie projektai leidžia neprarasti kvalifikacijos. Programavimas toks dalykas, jei su tuo pastoviai nedirbi – labai užsimiršta. Paskui reikia nemažai laiko, kad vėl prisiminti kaip ten kas daroma…

This entry was posted in Programavimas, Robotai. Bookmark the permalink.

One Response to Robotas, surenkantis Rubiko kubą

  1. Gintaras says:

    Šaunuolis, puikiai padirbėta!

Leave a Reply

Your email address will not be published. Required fields are marked *