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.
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ų.
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.
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.
Č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ą:
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.
Ultragarsas blogis, nes jo greitis priklauso nuo oro temperatūros, drėgmes ir net sudėties. Beje su kuo darai veikimo diagramas?
Nėra jis ten jau toks didelis blogis, nes kambario sąlygomis rezultatai pakankamai tikslūs. Lauke nebandžiau.
Diagramas piešiau su OpenOffice Draw.
Lauksim Arduino kodu ir video :)
Patys su kolega bandome Arduino pagrindu susikonstruoti CNC stakles bei ju valdyma.
Cia musu CNC video:
http://www.youtube.com/watch?v=6YSdN1bsByo
Geras! Gaila man tokiems projektams namie vietos neužtenka…
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?
Į priekį judėčiau dar greičiau jeigu rasčiau daugiau laiko :)
Kiek amperų rija neskaičiavau, bet žinau, kad čipo limitas yra 2A. Apie konkrečius IR atstumo detektorius negalvojau, bet Sharp atrodo yra populiariausias. Kiek žinau, galima ir pasidaryti savo:
http://letsmakerobots.com/node/2907
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 :)
Viskas priklauso nuo tavo poreikių. Ultragarsiniai turi problemą, kad garsas kartais neatsispindi, kai daiktas yra tam tikru kampu su kuo pats susidūriau, o IR sensoriai blogai veikia ant juodų objektų. Abu tipai turi savų pliusų ir minusų, bet laikoma, kad ultragarsiniai yra tikslesni.
Daugiau apie jų palyginimą:
http://www.societyofrobots.com.....ls/node/71
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