expériences robotiques

...on oppimispäiväkirja robottiohjelmoinnin harjoitustyökurssille keväällä 2011. Robottialusta on Lego Mindstorms NXT; kieleksi valitsin Javan (LeJOS). Kerron päiväkirjassa robottiprojektin edistymisestä ja myös satunnaisista kokeiluista ja harhapoluista.

Käsivarsi

Kirjoitti Oona 23.1.2011

Varsi.java on robottikäsi. Se käyttää kolmea moottoria, jotka on liitetty pitkän, nivelletyn varren eri kohtiin. Robotti voisi ehkä tulevaisuudessa käyttää käänteistä kinematiikkaa liikkeidensä koordinointiin. Mahdollisesti sitä voisi myös opettaa kädestä pitäen. Nyt se osaa vain yhden liikkeen.

Värisilmä

Kirjoitti Oona 23.1.2011

NXT:n valosensori on mustavalkoinen. Siispä Varit.java tunnistaa pallon värin (sininen tai punainen) pyörittämällä valosensorin edessä värillisiä, läpinäkyviä Lego-palikoita, jotka toimivat suodattimina. Ohjelma vertailee sensorin eteen asetetun pallon kirkkautta sinisen ja punaisen suodattimen läpi ja päättelee sen värin. Kun pallon asettaa aina samalle etäisyydelle, arvio pitää yleensä jopa paikkansa.

int sininen = light.getNormalizedLightValue();
moottori.rotate(180);
int punainen = light.getNormalizedLightValue();
moottori.rotate(180);
System.out.println((1.0 * punainen / sininen > 1.02) ? "Punainen!" : "Sininen!");

Mönkijä

Kirjoitti Oona 27.1.2011

Mönkijäni on robotti, jonka oli tarkoitus toteuttaa kaksi viime kurssikerralla valitsemaani toimintoa: eteenpäin liikkuminen ja esteen eteen pysähtyminen.

Robotti on rakenteeltaan yksinkertainen ja muistuttaa Mars-mönkijää. Toisaalta se tuo mieleen erään lastenelokuvan, mistä se saikin epävirallisen nimensä Valle. Mönkijä käyttää yhtä moottoria, kaikuluotainta ja äänianturia. Kääntyminen siltä ei onnistu ollenkaan. Robotti soittaa äänitehosteita (wav-tiedostoja) lähtiessään liikkeelle ja pysähtyessään esteen luo sekä kiljaisee kuullessaan kovan äänen. Näppäimet ja LCD-näyttö ovat mönkijän pohjassa, joten niihin on helppo päästä tarvittaessa käsiksi.

Ohjelma etenee suoraviivaisesti:

File brum = new File("start.wav");
Sound.playSample(brum);
Thread.sleep(2000);
moottori.forward();
while (sonar.getDistance() > 10);
moottori.stop();

(Päivitys 28.1.: Lisätty desibelianturi ja huudahdus.)

Desibelimittari

Kirjoitti Oona 29.1.2011

Yritin löytää hyvää kynnysarvoa, jolla äänianturin saisi tunnistamaan sormien napsautuksen. Keksin desibelimittarin, jolla voisi kokeilla reaaliajassa erilaisten äänten voimakkuuksia tarvitsematta tihrustaa lukemia pieneltä LCD-ruudulta. (Lisäys: En tainnut olla tietoinen RConsolesta.)

Piirsin paperille lukuja nollasta sataan niin, että 0 dB = 0° ja 100 dB = 180°. Askartelin moottoriin liitettävän osoitinneulan. Ohjelma kääntää neulaa äänenvoimakkuuden mukaan 10 kertaa sekunnissa:

while (!Button.ESCAPE.isPressed()) {
  moottori.rotateTo((int)(snd.readValue() * 1.8), true);
  Thread.sleep(100);
}

Robotiksi siitä ei kyllä ole. Se ei myöskään kuuntele ollenkaan Thread.sleep()-komennon aikana, joten nopeat äänet jäävät siltä usein huomaamatta. Ehkäpä mittari voisi kerryttää ääntä 100 millisekuntin ajan ja sitten liikuttaa osoitinta keskiarvon mukaan.

Äänitutka

Kirjoitti Oona 30.1.2011

Pohdin, voisiko etäisyysanturi olla tarpeeksi tarkka, jotta sillä voisi piirtää kuvia ympäristöstä. Tuloksena oli Tutka.java, joka kiertää anturia täyden ympyrän ja lähettää tietokoneelle listan kaiuista. Tietokone puolestaan piirtää PerlMagickin avulla hienon tutkakuvan.

Kuvan tutkasta katsoen etuoikealla on robottisetin iso muovilaatikko, takaoikealla yksi pahvilaatikoista yli metrin päässä. Vasemmalla on kirjahylly ja kansioita.

Koska etäisyysanturi aistii hyvin leveästi, tein sille kiikareilta näyttävät aaltoputket paperista. Ratkaisu paransi tutkan erottelukykyä suunnan suhteen varsin näkyvästi.


Seinä vai ei?

Kirjoitti Oona 6.2.2011

Tarkoituksenani oli kehittää mönkijää niin, että se tunnistaisi, onko edessä oleva kohde seinä vai muu esine ja hyökkäisi muiden kuin seinien kimppuun kynnellään. Seiniä se välttelisi. Seinäksi se voisi esimerkiksi tulkita aina kaikkein kaukaisimman kaiun, ja jos kaikuja olisi useampi, edessä voisi olettaa olevan jonkin esineen. Prototyyppi toimi jotenkuten, mutta päätin hylätä mönkijän ja jäädä pohtimaan jotain mielenkiintoisempaa.

Piirtävä käsivarsi

Kirjoitti Oona

Palasin alkuperäiseen ajatukseeni robottikäsivarresta. Vähensin kuitenkin ulottuvuuksien ja moottorien määrää kahteen: ajatuksena on kiinnittää käsivarren päähän kynä ja saada robotti piirtämään vektorimuotoisia kuvioita paperille. Ratkaisuni on hieman poikkeuksellinen, sillä usein piirtävät NXT-robottiratkaisut on toteutettu siten, että ne liikuttavat itseään koordinaatistossa pyörien avulla. Tiesin, että käsivarren nivelten kulmien ratkaiseminen ei tulisi olemaan mitenkään triviaalia.

Kuvassa oikealla on kaavio piirtäjärobottini käsivarresta. Ennen käynnistystä robotti asetetaan asentoon, jossa α = β = 0°. Moottorit kääntävät niveliä A ja B; kynä on kiinnitetty varren päähän C. Olkoot nivelen A koordinaatit (0,0) ja varren pään (xC, yC). Suorakulmaisia apukolmioita ja trigonometriaa soveltaen saadaan

jossa varsien pituudet d = 12 cm ja c = 14,6 cm.

Yhtälöparilla siis saadaan selville kynän sijainti, kun tiedetään moottorien kääntökulmat. Kuitenkin muistissa olevan kuvion piirtäminen paperille vaatisi juuri päinvastaisen ongelman ratkaisemista; tätä kutsutaan robotiikassa käänteisen kinematiikan ongelmaksi. Joudun luultavasti toteuttamaan sen jonkinlaisella hakutaulukolla.

Piirtävä käsivarsi (jatkoa)

Kirjoitti Oona

Suunnittelin, että piirtorobottia voisi ohjata kädestä pitäen, minkä jälkeen se kopioisi paperin täyteen juuri piirrettyä kuviota. Luovuin kuitenkin ideasta, sillä moottorit pyörivät hieman tyhjää ennen kuin alkavat rekisteröidä liikkeitä, minkä tähden kovin pienet liikkeet jäävät niiltä huomiotta.

Robotin käsivarresta tuli varsin raskas ja sen on levättävä pienen tukijalan päällä. Kynän kiinnitys tapahtuu sinitarralla, enkä keveyssyistä liittänyt minkäänlaista kynää nostavaa ja laskevaa moottoria vaan robotti vaatii käyttäjää kiinnittämään kynän.

Käänteisen kinematiikan ongelman ratkaisin tekemällä silmukan, jossa käsivarresta tehtyä näennäistä kopiota käännellään robotin muistissa vähän kerrallaan aina optimaalisimmaksi osoittautuvaan suuntaan, kunnes sen pää on halutussa paikassa. Sitten todellisen varren moottoreita käännetään näin saadut astemäärät. Inspiraationa toimi Hugo Eliasin sivu.