Roboti za samograditelje

Objavljeno: 9.10.2007 18:26 | Avtor: Primož Gabrijelčič | Kategorija: Preizkusi | Revija: Avgust 2007

Dansko podjetje Lego, ki ga zagotovo poznate po gradbenih kockah, izdeluje tudi najrazličnejše tematske komplete, iz katerih lahko zgradite marsikaj (avtomobile, robote, dinozavre ...), krmilite pa jih lahko tudi z računalnikom. Najnovejši Legov robotski komplet se imenuje Mindstorms NXT in prinaša v vsak dom neskončne možnosti ustvarjanja.

V paketu LEGO Mindstorms NXT je skoraj 600 gradnikov iz sistema Technics. Če ste le bežen poznavalec lego kock, potem si predstavljajte dolge palice z luknjami, osi in zobnike. Vmes je le nekaj "klasičnih" kock, pa še te so prirejene tako, da jih lahko povežemo z drugimi gradniki. Uporabili jih bomo predvsem tedaj, ko bomo Mindstorms povezovali z modeli, zgrajenimi iz "navadnih" lego kock. Priloženih je nekaj zelo zanimivih zobniških prenosov in štiri kolesa, zelo pa smo pogrešali gosenice in verižne prenose. Seveda lahko manjkajoče dele vedno vzamete iz kake druge Legove škatle; v svetu Mindstorms zelo radi kombinirajo s paketi iz serije Bionicle.

V paketu sta še dve žogici (modra in rdeča) in papirnata podloga za testiranje robotov, na kateri je zarisana črna elipsa ter označenih nekaj mest, na katera postavimo robote iz priročnika, da lahko preizkusimo programe zanje. A zdaj se že prehitevamo. Če hočemo sestaviti robota, potrebujemo tudi nekaj, s čimer ga bomo upravljali.

Jedro Mindstorms je bela škatla z majhnim zaslonom LCD in štirimi gumbi, ki od daleč spominja na prve game boye. V Legu ji pravijo kar "opeka" (brick) in moramo reči, da je ime kar primerno. V njej je 32-bitni procesor ARM7 s 64 KB pomnilnikom, pomaga pa mu osembitni mikrokontroler AVR s 512 bajtnim pomnilnikom. Strojna oprema je dovolj zmogljiva, le pomnilnika ni ravno v izobilju. Kljub temu ga med našim preizkušanjem ni nikoli zmanjkalo - največji program ni imel niti 32 KB. Hitreje ga zapolnimo z zvoki (da, v krmilnik je vgrajen tudi zvočnik), ki so osembitni in nestisnjeni.

Vse skupaj poganja šest baterij AA, ki zmorejo kar dolgo delovanje - med preizkušanjem nam je uspelo izprazniti le dva kompleta. Uporabite lahko tudi akumulatorje, vendar imajo ti že v osnovi nižjo napetost, zato bodo zdržali precej manj od baterij. Dokupite lahko zunanji akumulator s polnilcem, a le, če se odpravite čez lužo (a pustimo raje to in druge Legove prodajne norosti za konec članka).

V paketu so še trije servo motorji z dajalniki položaja (položaj lahko programsko beremo) in štiri tipala (za zaznavanje dotika, zvoka, svetlobe in razdalje). Vseh sedem naprav lahko hkrati priključimo na krmilno enoto. Za povezavo uporabimo šestpolne ploščate kable. Ti so različnih dolžin in popolnoma izmenljivi - isti kabel je uporaben tako za priklop motorja kakor tudi poljubnega tipala. Na krmilnik lahko priključimo tudi motorje in tipala iz starejšega sistema RCX, vendar potrebujemo posebne prilagoditvene kable.

Nekaj osnovnega programiranja se lahko gremo kar na sami krmilni enoti. Nastavimo lahko enostaven program, ki izvede dva premika in za vsakim pogleda stanje nekega tipala (in morda počaka, da bo tipalo v želenem stanju), zapremo pa ga lahko v neskončno zanko. Ni kaj dosti, a za osnovne demonstracije bo zaleglo. Prav tako lahko na krmilniku preverimo, ali vsa tipala delujejo in vračajo smiselne vrednosti. Na voljo imamo še vmesnik za poganjanje in brisanje priloženih programov in to je vse. Resne stvari - se pravi programiranje - počnemo na osebnem računalniku. Za to moramo računalnik in krmilnik seveda nekako povezati. Ni problem, krmilnik ima vmesnik USB, pa tudi bluetooth! Kabel USB žal ni priložen, a ker ima krmilnik čisto navaden vhod (tak, kot ga najdemo na tiskalnikih), iskanje kabla ne bo pretežko.

Kako pa krmilnik potuje z našimi roboti po svetu? Odgovor je jasen, saj ga vendar izdeluje Lego. Krmilnik ima dovolj lukenj, da ga brez težav pritrdimo na robota. Pravzaprav lahko krmilnik uporabimo kar za osnovo, okrog katere gradimo naprej. Natanko tako smo naredili robota, ki si ga lahko ogledate na tokratnem Monitor TV.

Grafično programiranje

Pisanje programov za krmiljenje strojev je precej zapletena znanost. Seveda, če se tega ne lotijo pri Legu. Skupaj z gradniki dobimo v paketu Mindstorms NXT tudi CD, na katerem je programersko razvojno okolje. In to ne tako, kakor smo ga vajeni programerji, temveč popolnoma grafično okolje, v katerem programiramo z miško. Pravzaprav gre za slavni LabView podjetja National Instruments, ki je standardna programska oprema za krmiljenje laboratorijev in so ga tokrat priredili za potrebe Lega. Dobra odločitev, saj lahko s takim pristopom k programiranju robote krmili res vsakdo.

Slabost grafičnega programiranja pa je zelo zapleteno programiranje kompleksnih rešitev. Če se grafično okolje dobro obnese pri krmiljenju motorjev in branju tipal, pa je nadvse neuporabno v tistem delu, ki se tiče same programske logike - pisanju krmilne logike in krmilnih zank. Upamo, da bomo kdaj v prihodnosti dočakali tudi bolj besedilno programsko okolje za zahtevnejše uporabnike.

Dediščina LabViewa so tudi razmeroma odprte strojne zahteve, saj deluje programsko okolje Mindstorms tako v Windows XP (Home ali Professional) kakor tudi v MacOS X na procesorjih PowerPC. Deluje tudi na Visti, vendar se mu tam občasno kolca (še bolj kakor v XP), zato večina uporabnikov težko čaka naslednjo različico, ki bo Visto tudi uradno podpirala.

Programsko okolje je malce nenavadno. Poleg običajnega menuja in orodjarne na vrhu zaslona je tu še orodjarna na levi (pravzaprav tri orodjarne), iz katere vlečemo programske gradnike na delovno površino, plošča za nastavljanje lastnosti gradnikov na dnu programa in velik del na desni, ki skriva navodila za sestavljanje in programiranje štirih zanimivih robotov. Preprosta in jasna navodila nas vodijo po sestavljanju, programiranju in preizkušanju. V desnem spodnjem kotu je majhno okno s hitro pomočjo (prek katerega dosežemo tudi zelo kakovostno vgrajeno pomoč, ki se odpre v spletnem brskalniku), ki skriva nekaj nadvse pomembnega - če kliknemo jeziček s sliko povečevalnega stekla, se odpre pogled na celoten program. S klikom miške določimo, kateri del programa bo viden v urejevalniku programa (v največjem, sredinskem delu aplikacije). To je hkrati tudi edini način za premikanje po velikem programu, saj urejevalnik sploh nima drsnikov. Skoraj nepojmljivo za današnje čase, verjetno pa gre za dediščino programa LabView. Kakorkoli že, takega dela se hitro navadimo in drsnikov niti ne pogrešamo preveč.

Na zaslonu je stalno vidna tudi skupina petih gumbov. En je namenjen nadzoru priključenega krmilnika (tu lahko brišemo programe, ko na krmilniku zmanjka prostora, pa si ogledamo stanje baterij), drugi pa so namenjeni prevajanju in nalaganju programov na krmilnik.

Pregled porabe pomnilnika na krmilniku

Osnova programa je letev iz sistema Technics (izrisana, seveda), na katero vlečemo programske gradnike. Letvica predstavlja tok izvajanja programa. Zelo enostavno je omogočeno vzporedno izvajanje - letvico le razvejimo na dva vzporedna dela. Programsko okolje in v krmilnik vgrajeni ARM sama poskrbita za vse potrebno.

Vsak gradnik ima nastavljivih nekaj lastnosti (denimo, za koliko želimo, da se motor premakne, in v katero smer), ki jih lahko nastavimo med programiranjem (na plošči za nastavitev lastnosti na spodnjem delu zaslona) ali pa jih povežemo programsko. Vse vhodne podatke namreč lahko nastavimo na podlagi programskih izračunov ali meritev, tako da ustrezne podatke povežemo s pripadajočimi vhodi gradnika. Večina gradnikov ima tudi nekaj izhodov (stanje tipala, položaj motorja), ki jih lahko povezujemo naprej. Vsak program za Mindstorms je tako dvoplasten - ena plast je logični tok programa (izvajanje programa), druga pa tok podatkov. Pri enostavnih programih se lahko slednji izognemo in napišemo program klasično - tako da ima vse vrednosti nastavljene že vnaprej.

Omenili smo tri palete z gradniki. Na prvi (imenuje se Common) najdemo najpomembnejše gradnike, s katerimi pa že lahko sestavimo čisto uporabne programe. Pravzaprav so vsi programi iz priloženih navodil napisani le z uporabo teh gradnikov. Na drugi (Complete) najdemo vse vgrajene gradnike, na tretji (Advanced) pa tiste, ki jih naložimo iz spleta ali pripravimo sami.

Programsko okolje. Vidna je glavna zanka našega robota.

Najpomembnejši in hkrati najzmogljivejši gradnik premika motorje. Nadzoruje lahko enega, dva ali tri. Kadar krmili dva motorja, lahko nastavimo razmerje hitrosti, tako da se en vrti hitreje od drugega, in tako dosežemo, da robot zavije. Določimo lahko tudi hitrost vrtenja, smer, trajanje (v stopinjah, številu obratov ali časovno), nastavimo pa lahko tudi, da motor deluje "do nadaljnjega". V tem primeru se bo motor pognal, program pa bo takoj nadaljeval izvajanje. Motor lahko seveda tudi ustavimo.

Drugi gradniki, ki izvedejo neko akcijo, so manj zanimivi - na zaslončku krmilnika lahko prikažemo sporočilo, predvajamo zvok ali pošljemo bluetooth sporočilo. No, slednje je zanimivo za vse, ki si lahko privoščijo več kot en komplet Mindstorms. Sporočila bluetooth lahko programsko tudi beremo in tako izdelamo sporočilni sistem za usklajeno delovanje več krmilnikov.

Druga pomembna skupina gradnikov bere tipala. Vsem je skupno to, da lahko določimo, na kateri vhod krmilnika je tipalo priključeno in to, da so v običajni (preberi podatek in nadaljuj izvajanje) in čakajoči različici (čaka, da bo tipalo prešlo v določeno stanje).

Najenostavnejše je tipalo, občutljivo za dotik. Pravzaprav gre za navaden gumb, ki zna sporočiti, kdaj je pritisnjen in kdaj ne. Programsko lahko zaznamo tudi "klik" (pritisk in sprostitev) gumba.

Svetlobno tipalo zna meriti jakost svetlobe (ne pa tudi barve). Vgrajeno ima tudi lučko, ki jo lahko programsko prižgemo, kadar želimo brati stanje odbite svetlobe in ne svetlobe okolja. Čakajoči različici nastavimo mejno jakost svetlobe in povemo, ali želimo čakati na manj svetlo ali na bolj svetlo okolje.

Zelo podobno je zvočno tipalo - nastavimo mejno jakost zvoka in povemo, ali nas zanima manjša ali večja jakost. Podoben je tudi ultrazvočni merilnik razdalje, ki mu poleg mejne razdalje povemo še, ali je podana v centimetrih ali palcih. Prav s tem merilnikom smo imeli največ težav, saj zanesljivo meri razdaljo le do objektov, ki so neposredno pred njim. Razdaljo do predmetov, ki so na robu njegovega vidnega polja, zazna zelo nenatančno.

Poleg teh štirih tipal lahko programsko beremo tudi stanja treh gumbov na krmilniku, položaj motorjev in sporočila bluetooth. Merimo lahko tudi čas - na voljo so trije časovniki, ki jih lahko beremo ali nastavimo na začetno stanje.

Zvočni in svetlobni senzor lahko kalibriramo, tako da izmerimo najmanjšo in največjo jakost signala (recimo svetlobo, odbito od bele in črne barve) in tako prilagodimo robota na spremenljive razmere v prostoru. Kalibracijo lahko izvedemo po potrebi iz programskega okolja ali pa v program robota vstavimo kalibracijski gradnik.

V to skupino gradnikov spada tudi gradnik za snemanje, ki zna shraniti zaporedne položaje vseh treh motorjev. Pozneje lahko posneta stanja z istim gradnikom predvajamo. Tako lahko, recimo, naredimo robotsko roko, ki jo lahko učimo z vodenjem.

Naslednja skupina gradnikov so krmilne strukture. Program lahko zazankamo ali pa dele izvedemo pogojno. Zanka je lahko neskončna ali pa se ustavi, ko izvede prednastavljeno število ponovitev, ko mine dovolj časa, kadar neko tipalo doseže nastavljeno stanje, ali ko neki vhodni podatek postane logično napačen. Vejanje je lahko enostavno, dvostanjsko (deluje kakor stavek "if" v praktično vseh proceduralnih jezikih), lahko pa program razvejimo na več kot dve poti (tako kot "switch" v C ali pa "case" v pascalu). Drugi način je možen le, kadar vejimo na podlagi vrednosti, ki je številska ali besedilna.

Še nekaj podatkovno usmerjenih gradnikov nam je ostalo. Z njimi preračunavamo podatke in logične vrednosti, primerjamo vrednosti med seboj (večje, manjše) in shranjujemo vrednosti v spremenljivke. Na voljo je tudi gradnik, ki podatke zapisuje v datoteke (shranjene v malem, 64 KB pomnilniku krmilnika) ali jih bere iz datotek.

Pri malo bolj naprednem programiranju hitro ugotovimo, da izgubljamo nadzor nad programom zaradi kompleksnosti povezav med gradniki. Takrat pomaga, če del programa predelamo v lastni, uporabniško izdelani blok. Postopek je zelo preprost - označimo nekaj gradnikov na zaslonu in z menuja izberemo ukaz za izdelavo novega gradnika. Določimo ime, opis in ikono in dobili smo nov gradnik, ki ga lahko uporabimo tudi v drugih programih. Malce zoprno postane le distribuiranje programov, ki uporabljajo bloke, saj morajo biti uporabniški bloki shranjeni v mapi Blocks\My Blocks (relativno glede na datoteko z glavnim programom), drugače programa ne moremo prevesti.

Monitorjev robot

Preizkus seveda ne bi bil popoln, če bi samo sestavili nekaj robotov po navodilih in ugotovili, da zadeva deluje. Zgraditi smo morali nekaj svojega. Je bilo težko? Ne. Gradnja robota je bila enostavna, programiranje pa zabavno.

Zgradili smo majhnega trikolesnega "kužka" s tipaloma za zvok in razdaljo in ga naučili nekaj trikov. Če je pred seboj zagledal človeka ali predmet, se mu je približal, a le do neke razdalje. Če se je človek preveč približal, se je začel odmikati od njega. Na zvočni ukaz je naredil obrat za 360 stopinj. Hkrati s tem pa je stalno zahteval pozornost - če se v njegovi bližini ni nič dogajalo, se je odpravil na potovanje po prostoru, znal pa je tudi poiskati najbližji predmet v svoji okolici in se obrniti proti njemu. Njegovo obnašanje si lahko ogledate na tokratnem Monitor TV.

Z naslova www.monitor.si/08_lego lahko prenesete celoten program robota in ga uporabite v svojih projektih. Potrebovali boste tudi dodatka Dynamic Block Update in Mini Block Library (navodila za namestitev najdete v glavnem članku).

Celotnega programa na tem mestu ne moremo predstaviti, ker je preveč zapleten, ogledamo pa si lahko enostaven podprogram (oziroma uporabniški blok v terminologiji razvojnega okolja Mindstorms).

Podprogram za obračanje robota

Blok dobi kot vhod neki kot (majhna oznaka Angle na levi). Vrednost je lahko pozitivna ali negativna. V prvem primeru se mora robot obrniti za podani kot na desno, v drugem pa na levo.

V prvem gradniku to vrednost pomnožimo s 3. S poskušanjem smo namreč ugotovili, da moramo kolesa zavrteti za 3*90 stopinj, če želimo, da se robot obrne za pravi kot. Rezultat peljemo iz gradnika naravnost v dva gradnika za krmiljenje motorjev (skrajno desno).

V drugem gradniku preverimo, če je kot večji od nič. Rezultat (logično vrednost) peljemo v tretji gradnik in jo negiramo. Izhod primerjanja z nič peljem na vhod, ki nadzira smer vrtenja motorja C, negirano vrednost pa na vhod, ki nadzira smer vrtenja motorja B.

Na koncu hkrati izvedemo premik motorjev B in C. Oba gradnika imata vnaprej nastavljenih nekaj vrednosti (polna moč motorja, počakamo na konec premika), na podatkovni vhod pa pripeljemo smer in količino premika, ki smo ju izračunali v prejšnjih treh gradnikih.

Tak podprogram uporabimo enako kot vgrajene bloke. Na spodnji sliki prvi gradnik začne predvajati zvok, drugi poišče najbližji predmet v okolici in vrne njegov kot (tudi tega smo napisali sami, a je preveč zapleten, da bi ga predstavili v reviji), tretji ustavi predvajanje zvoka, četrti pa je ravnokar predstavljeni podprogram za obrat, ki dobi izhod drugega gradnika na svoj vhod.

Zgled rabe podprograma za obračanje robota

Praksa

Rečemo lahko, da smo Mindstorms NXT temeljito preizkusili. Zelo temeljito. Sestavili smo tri od štirih primerov iz navodil in enega popolnoma svojega robota, o katerem si lahko več preberete v okvirčku. Mimogrede, sestavljanje po navodilih priporočamo prav vsem, tudi če ste vajeni sistema Technics. Spoznali boste celo vrsto gradbenih zvijač (denimo prenos iz motorja na noge pri robotu-škorpijonu) in se naučili osnov programiranja.

Še pred programiranjem pa nadgradite programsko opremo krmilnika. Na našem preizkusnem je bila že zelo zastarela. V programskem okolju izberite Help, Online Updates, prenesite LEGO MINDSTORMS NXT Firmware in sledite navodilom.

Ko boste že bolj izkušeni v programiranju robotov, si namestite (z iste strani z nadgradnjami) še paketa Dynamic Block Update in Mini Block Library.

Omenili smo, da je grafično programiranje kompleksnih programov zelo nerodno. Še huje je to, da je Legovo programje zelo nestabilno. Še posebej, kadar dosti dodajamo in brišemo podatkovne povezave, se rado sesuje. Upamo, da bo naslednja različica - tista, ki bo podpirala Visto -, kaj bolj stabilna.

Programsko okolje je včasih prav obupno nestabilno.

Ni pa nujno, da čakate na naslednjo različico okolja Mindstorms. V Legu so naredili po našem mnenju odlično potezo in so programsko opremo krmilnika izdali z odprto licenco. Poleg nje na strani mindstorms.lego.com/Overview/NXTreme.aspx dobite tudi navodila za razvijanje združljive programske in strojne opreme. Za tiste bolj podjetne so že na voljo alternativna razvojna okolja - Microsoftov Robotics Studio (msdn.microsoft.com/robotics/) in zbirniku ter C-ju podobna Next Byte Codes in Not eXactly C (bricxcc.sourceforge.net/nbc/).

Sploh je v internetu najti zelo veliko zgledov robotov, zgrajenih z Mindstorms. Priporočamo, da začnete na strani mindstorms.lego.com in si ogledate vse povezave, ki vodijo z nje. Našli boste navodila za nove projekte (na primer uro s kukavico), projekte uporabnikov, tekmovanja robotov in še marsikaj. Oglejte si še www.ortop.org/NXT_Tutorial/ (učbenik za programiranje) in www.nxtasy.org (skupnost uporabnikov), če vam štiri priložena tipala ne zadoščajo, pa skočite še na www.hitechnic.com, kjer delajo merilnik pospeška, barvno občutljivo tipalo in kompas.

Lego Mindstorms NXT je res odličen paket za učenje robotike, ki ga brez trohice slabe vesti priporočamo prav vsakomur, ki ga to zanima, veseli pa bi ga bili tudi na marsikateri šoli. Žal pa dobre ocene skazi visoka cena. Oziroma, bolje rečeno, nora cenovna politika.

Kratek skok na shop.lego.com namreč pokaže, da Mindstorms NXT v ZDA stane 250 dolarjev (187 evrov), v Angliji 180 funtov (265 evrov), v preostanku zahodne Evrope 280 evrov, pri nas pa - podatek smo dobili od prodajalca, ker spletna trgovina ne seže do Slovenije - reci in piši 360 evrov. Halo? Za ta denar lahko v ZDA kupimo skoraj dve škatli! In pri tem gre za evropsko podjetje, ki ima proizvodnjo v Evropi. Da ne govorimo o tem, da so dodatna tipala in akumulatorski komplet na voljo samo v ZDA ...

Če se sprijaznimo s ceno (ali poiščemo koga v tujini, ki bo naročeno robo sprejel in jo poslal naprej), pa Lego Mindstorms NXT res postane igrača za vse - od starejših otrok do otročjih starcev.

LEGO Mindstorms NXT

Kaj: Komplet za sestavljanje in programiranje robotov.

Izdeluje: LEGO, www.lego.com.

Cena: 360 EUR.

Prodaja: Profidtp d.o.o., www.irt3000.si, (01) 600 3000.

Za: Enostavno programiranje, neverjetna prilagodljivost in razširljivost, neomejene možnosti ustvarjanja, alternativna razvojna okolja.

Proti: Nestabilna programska oprema, napredno programiranje je zelo zapleteno, cena.

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!
Prijava

ph

Komentirajo lahko le prijavljeni uporabniki