Robottiohjelmoinnin harjoitustyö : Moottorit ja ajoneuvot

 

Moottorit

NXT-sarjaan kuuluu kolme servomoottoria, joiden asennon voi lukea moottorin kierroslaskurista asteen tarkkuudella, mistä on hyötyä muun muassa moottorien synkronoinnissa ja matkan mittaamisessa.

Moottorit ovat hieman epätavallisen muotoisia ja painavia, joten voi olla usein järkevää rakentaa robotti niiden ympärille. Moottorin pyörimisen voi muuttaa lineaariseksi liikkeeksi esimerkiksi männällä, matorattailla tai saksimaisilla virityksillä.

Moottori

Huom.: moottoreissa on kohtalaisesti vääntöä, ja etenkin jos hammasrattaiden avulla sitä kasvattaa, kannattaa olla varovainen etteivät osat väänny ja mene pirstaleiksi. Servojen ei ole myöskään hyvä antaa olla liian pitkään jumiutuneessa tilassa.

Random-tieto: paitsi että moottori muuttaa sähköä liikkeeksi, käsin kääntämällä se muuttaa myös liikettä sähköksi. Koita kytkeä kaksi moottoria johdolla kiinni toisiinsa ja pyöritä toista.

Moottorien toimintoja

Aseta moottorin nopeus Motor motor = Motor.A;
// 250 astetta sekunnissa
motor.setSpeed(250);
Käännä moottoria 90 astetta eteenpäin motor.rotate(90);
Käännä moottori haluttuun kulmaan motor.rotateTo(-1458);
Nollaa takometri motor.resetTachoCount();
Tutki moottorin oikea nopeus
  • Tätä ei oikeasti tarvitse itse tehdä, koska NXT osaa laskea oikean nopeuden itse ja arvon saa aina luettua:

return motor.getRotationSpeed();

motor.resetTachoCount();
// aseta suuri nopeus
motor.setSpeed(800);
// moottori pyörimään
motor.forward();
// odota 5s
try{Thread.sleep(5000);}catch(Exception e) {}
motor.stop();
// palauta asteina sekunnissa
return motor.getTachoCount()/5;
Lukitse moottori // moottori pyrkii pysymään paikallaan,
// voimalla 1-100
motor.lock(100);
Vapauta moottori motor.flt();

 

Ajoneuvot

Jos robotissa on kaksi itsenäisesti ohjattavaa pyörää, voidaan käyttää Pilot-rajapintaa abstrahoimaan rakenteen yksityiskohdat pois. Pilotissa on määritelty monia korkean tason toimintoja kaksipyöräisille ajoneuvoille, kuten tietyn astemäärän kääntyminen, halutun matkan kulkeminen ja kaaressa ajaminen.

Pilotin konstruktorille annetaan pyörien halkaisija (setin kumirenkaat = 56mm) ja pyörien välinen etäisyys mielivaltaisella mutta samalla yksiköllä.

Myös edelleen korkeamman tason luokat kuten CompassPilot ja SimpleNavigator (lejos.robotics.navigation) käyttävät Pilotia. lejos.robotics.proposal-pakkaus sisältää yhä hienostuneempia mutta viimeistelemättömiä toimintoja. Osa toiminnoista ei kuitenkaan toimi, mm. navigaattorin kääntymiskoodi tuntuu tällä haavaa olevan vähintäänkin osittain rikki. Esimerkeissä oletetaan ettei bugeja ole.

 

Kaksipyöräisten toimintoja

Luo Pilot-olio ja navigaattori // luo Pilot. Yksiköillä ei ole väliä, tässä cm
Pilot car = new TachoPilot(5.6f, 9.5f, Motor.A, Motor.B);
// luo autoa ohjaava SimpleNavigator
// huom. voi olla joissain versioissa TachoNavigator
SimpleNavigator nav = new SimpleNavigator(car);
Aja 50 cm eteenpäin car.travel(50);
Aja ympyrän kaarta pitkin // säde 50cm, 90 astetta
car.arc(50, 90);

Navigoi koordinaatteihin

  • SimpleNavigator käyttää merkintälaskumenetelmää (Dead reckoning) arvioidakseen sijaintinsa koordinaatistossa. Navigaattoria voi käskyttää ohjaamaan robotin haluttuun kohtaan. Menetelmä ei ole sellaisenaan kovin tarkka, koska virhettä kertyy joka liikkeellä.
// liiku kohtaan (100,30)
// (tässä tapauksessa senttimetreissä)
nav.goTo(100,30);
Sijainti Point home = new Point(45f,45f);
// lue robotin nykyinen sijainti ja suunta
Pose robot = nav.getPose();
// laske etäisyys kotiin
float matka = robot.distanceTo(home);
float kulma = robot.angleTo(home);
// jos liian kaukana kodista, liiku sinne
if (matka > 100) nav.goTo(home.getX(), home.getY());

Nopeus

  • Huomaa, että liikkumisnopeutta ei anneta kulmanopeutena vaan etäisyysyksikköinä sekunnissa.
// 15 cm/s
nav.setMoveSpeed(15);
// 90 astetta/s
nav.setTurnSpeed(90);
Väistä este UltrasonicSensor sonic = new UltrasonicSensor(SensorPort.S4);
int dist = 255;
car.forward();
// ajetaan kunnes jotain tulee eteen
while(dist > 50) {
    dist = sonic.getDistance();
}
// väistetään oikean kautta ohi
car.rotate(-90);
// ajetaan kaaressa, säteenä etäisyys esteeseen
car.arc(dist, 90);
// väistö päättyy
. . .

 

Lisätietoa