Roboto logika

robot-logic-main-cut

Pagaliau atrodo pavyko parašyti tokį kodą, kad mano robotas važinėtų po kambarį išvengdamas kliūčių be jokios pagalbos. Pradėsiu nuo teorinės dalies: roboto logika.

Roboto navigacijos tikslas buvo paprastas: aptikus kliūtį apsidairyti, surasti laisvą kelią, pasisukti į tą pusę ir toliau važiuoti nauju keliu iki kitos kliūties. Aš esu iš tų programuotojų, kurie daugiau stengiasi panaudoti jau kažkieno sukurtus algoritmus ir idėjas, bet šiuo atveju man nepasisekė: niekur negalėjau rasti man tinkamo jau sukurto kodo todėl teko viską kuri pačiam nuo nulio. Sudėliojus pradinį logikos variantą viskas atrodė nesudėtinga, bet realiai susidūriau su keletu labai įdomių iššūkių.

Inercija

Kitaip, nei dauguma savaeigių robotų, kurių video žiūrėjau analizuodamas logiką, maniškis varomas ne servo, o varikliukais. Servo naudojančios parduodamos robotų platformos sustoja praktiškai iš karto, bet už tai yra labai lėti. Arduino mikrokontroleriui detektavus kliūtį ir varikliams nurodžius sustoti, mano žaislinė mašinėlė iš inercijos pavažiuodavo dar 5-10 cm dėl ko imdavo veikti visai kita programos dalis, atsimušdavo į kliūtį ir nebeužtekdavo vietos apsisukti arba robotas pradėdavo „dairytis“ kito kelio dar nesustojęs.

Baterijos

Jeigu robotui važiuojant į priekį staiga pastebėjus kliūtį labai arti perduodavau impulsą iš karto važiuoti atgal baterijos išsikraudavo per pusvalandį. Po sustabdymo teko palaukti ~0,5 s, kad robotas sulėtėtų arba suspėtų visai sustoti ir tik tada siųsdavau kitas komandas.

Nuo baterijos įkrovimo taip pat priklausė ir važiavimo greitis, o nuo jos ir inercija. Dėl šios priežasties naudodamasis ultragarsiniu nuotolio matuokliu pradėjau kaupti informacija apie atstumą iki objekto ir laiką kada matavimas atliktas. Tokiu būdu galėjau įvertinti roboto greitį ir jį dinamiškai reguliuoti, kad išlaikyčiau 35-40 cm/s nepriklausomai nuo baterijų įkrovos.

robot-logic-adjust-speed

Kliūčių išvengimas

Nustatyti į kurią pusę reikia suktis po to kai robotas surasdavo kliūti buvo palyginus nesudėtinga: roboto „galva“ atsistoja -90 laipsnių kampu ir kas 10 lapsnių išmatuoja atstumą iki objektų.

robot-range-finder

Tarkim robotas nustato, kad laisviausias kelias yra 60 laipsnių į kairę kaip tai parodyta viršuje esančiame paveikslėlyje juoda linija. Kaip tuomet nustatyti, kad robotas jau pasisuko 60 lapsnių? Turint magnetinį kompasą būtų labai paprasta, bet kad toks sensorius kainuoja virš £20! Besukant galvą šovė išganinga mintis: tereikia nuspręsti į kurią pusę suktis ir tuomet besisukant matuoti atstumą iki objekto su tuo pačiu atstumo sensorium iki kol bus „surastas“ tas atstumas. Ši geniali idėja pasiteisino iki kol nesusidūriau su kita problema – paklaidom.

Paklaidos

Su paklaidom buvau susidūręs tik spręsdamas fizikos laboratorinius. Kuriant kompiuterines programas paklaidos beveik neegzistuoja, bet viskas apsiverčia aukštyn kojom, kai pradedi programuoti fiziniam pasauliui: į paklaidas teko atsižvelgti robotui sukantis aplink beieškant nustatyto laisvo kelio ir įvertinti, kad matuojant gali būti ~1cm paklaida. Jas taip pat reikėjo įvertinti ir matuojant roboto greitį, nes kartais gaudavau, kad mano robotas kambaryje skrieja 100 km/h greičiu.

Nenumatytos kliūtys

Eksperimentuojant kelyje pasitaikydavo nenumatytų kliūčių: kokia numesta tapkė ar mažas sūnaus žaislas, kurio nuotolio sensorius nedetektuodavo, nes kliūtis būdavo per žemai. Dėl tos priežasties teko sukurti specialų kodą naudojantį atstumo sensoriaus duomenis, kurio pagalba robotas nustatydavo, kad jis užstrigo ir pabandydavo 1s pavažiuoti atgal.

robot-logic-avoid-blocked-path

Dėl šio patobulinimo robotas užstrigęs net ir už netikėtos kliūties sugeba grįžti atgal ir ieškoti kito kelio.

Per arti esantys objektai

Per arti priartėjus prie kokio nors objekto, gali neužtekti vietos apsisukti, todėl sukūriau dar vieną paprogramę, kurios pagalba važiuodamas atgal robotas pabando pasidaryti daugiau vietos ir tik tada apsidairyti.

robot-logic-get-more-space

Čia vėl reikėjo atkreipti dėmesį, kad judėdamas atgal robotas irgi gali užstrigti.

Visa roboto logika

Kartu sudėjus visas viršuje aprašytas paprogrames gavau tokią bendrą roboto logiką:

robot-logic-main

Aišku iki idealios logikos labai toli, nes norint padaryti, kad robotas geriau „jaustų“ aplinką, reikia turėti daugiau sensorių: bent po vieną IR (infraraudonųjų spindulių) atstumo detektorių ties kiekvienu žaislo kampu, akselerometrą, magnetinį kompasą ir nuvažiuoto kelio detektorius. Ghm.. na gal kol kas apsiribosiu su tuom ką turiu. :)

Kituose įrašuose važinėjančio roboto video ir Arduino kodas.

Jeigu šis įrašas patiko, nepatingėkit pakomentuoti arba užsiprenumeruoti RSS srautą.

9 komentarai

  1. Arvydai, Labai sparčiai judi į priekį :) Turiu kelis klausimus, kiek amperų siurbia tavo varikliai? Kalbėdamas apie „IR (infraraudonųjų spindulių) atstumo detektorių“ turi omenyje Sharp GP2xxx seriją? Ar paprastus TSOP?

  2. Arvydai, ką išvis manai apie SHARP IR sensorius ir ar varta juos naudoti kaip pagrindinius? Lietuvos robotistai už ultragarsą nepasisako, ir naudoja IR’ą kaip pagardiną. Tu turbūt domėjaisi labiau iš UK šaltinių ir Howduino, buvai, todėl galvoju, gal ką daugiau galėtum šituo klausimu papasakoti :)

  3. Sveikas Arvydai,
    As ieskau zmogaus norincio prisideti prie elekronikos kurimo megejams grupes/imones kurimo. As esu padares keleta arduino projektu ir pakankamai sekmingai paleides and kickstarterio, bet as labiau megstu daryti PCB ir kurti circuits negu programuoti. Tad ieskau zmogaus kuris noretu prisideti rasant libraries. jaigu domina parasyk Mantas

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *