Ampujarobotti
Alla oleva esimerkkikoodi hyödyntää Vision Subsystem v4 for NXT- kameraa ja sitä varten rakennettiin varta vasten koulun perusroboteista poikkeava robotti. Robottissa ei käytetä muita sensoreita ja se sisältää pallonampujan.
Toiminta: Robotti pyörii aluksi ympäri, kunnes se havaitsee halutun värisen kohteen, tässä tapauksessa punaisen kohteen, ja alkaa tämän jälkeen lähestymään kohdetta. Kun robotti havaitsee kohteen määritellyn arvon korkuisena, se kääntyy hetken aikaa vasemmalle, tähdäten ampujan kohti kohdetta, ja ampuu. Tämän jälkeen robotti alkaa jälleen pyörimään ja etsimään uutta kohdetta ja toistaa samat operaatiot kuin edellä. Kohteiden määrä on määritelty kolmeen kappaleeseen tässä esimerkissä.
HUOM! Kamera saattaa sammua, mikäli ohjelma pysäytetään kesken ajon (=kameran punainen valo sammuu), jolloin ohjelmaa uudelleen ajettaessa robotti vain pyörii ympyrää tunnistamatta mitään. Esim. kun robotti on ampunut kerran ja se sammutetaan sen jälkeen. Mikäli näin tapahtuu, kytke kameran piuha irti ja takaisin, jolloin punainen valo syttyy, jonka jälkeen voit kokeilla ohjelmaa uudelleen.
Koodinpätkän alapuolelta löytyy ohjetta NXTCamView-ohjelman käyttöönotosta ja linkki, josta saa ohjeita sen käytöstä. Ohjelmalla voidaan määritellä kameran seuraamat väriskaalat.
#pragma config(Sensor, S4, Kamera, sensorI2CCustomFastSkipStates) #pragma config(Motor, motorA, Oikea, tmotorNormal, PIDControl, encoder) #pragma config(Motor, motorB, Vasen, tmotorNormal, PIDControl, encoder) #pragma config(Motor, motorC, Ampuja, tmotorNormal, PIDControl, encoder) #define KohteidenMaara 3 // Kohteiden lukumaara #define NOPEUS 20 // Etenemisnopeus #define NOPEUS2 100 // Tykin nopeus #define ResX 88 // NXTcamin resoluutio (Loydettavissa kameran dokumentaatiosta) #define ResY 144 #define KpX 0.3 #define KpH 0.8 #define KohteenKorkeus 130 // Kohteen haluttu korkeus #define Odotusaika 75 #include "rdpartyrobotcdr-v2.6/drivers/common.h" // Sisallyttaa ajuripaketista ajurit koodiin #include "rdpartyrobotcdr-v2.6/drivers/NXTCAM-driver.h" void Pysayta(); // Pysayta kaikki moottorit void Etsi(); // Etsi kohde void Ammu(); // Ammu pallo task main() { blob_array blobs; memset(blobs, 0, sizeof(blob_array)); int nblobs = 0, errX = 0, errH = 0, BlobN = 0, TargetNum = 0; eraseDisplay(); //Tyhjentaa robotin ruudun Pysayta(); if(NXTCAMinit(Kamera)) { PlaySound(soundUpwardTones); //Mikali kamera kaynnistyy oikein, tulee soundUpwardTones aanimerkki while(bSoundActive); } else { PlaySound(soundDownwardTones); //Mikali kamera ei kaynnisty oikein, tulee soundDownwardTones aanimerkki while(bSoundActive); StopAllTasks(); //Pysayttaa kaikki toiminnot } wait1Msec(100); while(true) { eraseDisplay(); //Tyhjentaa robotin ruudun nblobs = NXTCAMgetBlobs(Kamera, blobs, true); nxtDisplayCenteredTextLine(1, "blobs: %d", nblobs); nxtDisplayCenteredTextLine(3, "Targets Down: %d", TargetNum); if(nblobs > 0) { BlobN = -1; for(int i = 0; i < nblobs; i++) // Seuraa vain kohteita, joiden Korkeus > Leveys (ei "jahtaa" kaatuneita kohteita) { if((blobs[i].x2 - blobs[i].x1) < (blobs[i].y2 - blobs[i].y1)) { BlobN = i; break; } } if(BlobN != -1) { errX = (blobs[BlobN].x1 + blobs[BlobN].x2) / 2 - ResX/2; //X-suunnassa blobsin vas. reunan arvo + oik. reunan //arvo jaettuna 2 - X:n resoluutio jaettuna 2 errH = KohteenKorkeus - (blobs[BlobN].y2 - blobs[BlobN].y1); //Kohteen korkeus - (y-suunnassa blobsin maksimi - minimi) if(abs(errX) > 4) //Pyorimisnopeus etsiessa { motor[Vasen] = errX * KpX; motor[Oikea] = -errX * KpX; } else if(abs(errH) > 6) { motor[Vasen] = errH * KpH; motor[Oikea] = errH * KpH; } else { Pysayta(); Ammu(); Pysayta(); TargetNum++; if(TargetNum == KohteidenMaara) //Jos kohteiden maara on yhta kuin asetettu kohteiden tavoitemaara -> Pysayta kaikki { PlaySound(soundUpwardTones); while(bSoundActive); StopAllTasks(); } else Etsi(); } } else { Etsi(); } } else { Etsi(); } wait1Msec(Odotusaika); } } void Pysayta() //Pysayttaa kaikki liikkeet { motor[Vasen] = 0; motor[Oikea] = 0; motor[Ampuja] = 0; } void Etsi() //Etsintatila { blob_array blobs; memset(blobs, 0, sizeof(blob_array)); int nblobs = 0, BlobN = -1; for(int i = 0; i < 1750 * 4.5 / Odotusaika; i++) { BlobN = -1; motor[Vasen] = NOPEUS; motor[Oikea] = -NOPEUS; nblobs = NXTCAMgetBlobs(Kamera, blobs, true); nxtDisplayCenteredTextLine(1, "blobs: %d", nblobs); if(nblobs > 0) { for(int j = 0; j < nblobs; j++) { if((blobs[j].x2 - blobs[j].x1) < (blobs[j].y2 - blobs[j].y1)) { BlobN = j; break; } } if(BlobN != -1) break; } wait1Msec(Odotusaika); } Pysayta(); if(BlobN == -1) { motor[Vasen] = NOPEUS; motor[Oikea] = NOPEUS; wait1Msec(2000); } } void Ammu() { Pysayta(); motor[Vasen] = -20; //"Tahtays" eli kaantyy vasemmalle 200ms ajan motor[Oikea] = 20; wait1Msec(200); Pysayta(); for(int i = 0; i < 3; i++) { PlayImmediateTone(440, 10); while(bSoundActive); wait1Msec(100); } Pysayta(); nMotorEncoder[Ampuja] = 0; nMotorEncoderTarget[Ampuja] = 360; motor[Ampuja] = NOPEUS2; while(nMotorRunState[Ampuja] != runStateIdle); Pysayta(); while(bSoundActive) {} }
NXTCamView:n ja ajureiden asennus sekä käyttöönotto
Lego Mindstorms robotteihin liitettävän mindsensors:n Vision Subsystem v4 for NXT (NXTCam-v4)-- kameran asetuksia ja väriskaaloja määritellään PC:lle asennettavalla erillisellä NXTCamView- ohjelmalla. Jos haluat muokata kameran kohdevärejä, lataa ohjelma koneellesi täältä (versio 0.21).
HUOM! Jos koneelle on jo asennettu NXTCamView, niin on todennäköistä, että myös ajurit on asennettu. Tällöin voit katsoa ohjeita ohjelman käytöstä suoraan kohdasta 4.
Asennusohje (Windows 7):
1. Lataa ja asenna NXTCamView oletushakemistoon.
2. Seuraavaksi pitää asentaa kameran vaatimat USB-ajurit
2.1 Lataa zippipaketti täältä (kirjoitushetkellä nimellä NXTCam_v3p0.zip)
2.2 Pura paketti vaikkapa työpöydällesi
2.3 Kytke kamera kiinni koneeseen USB:lla
Windows yrittää asentaa joitain ajureita ja antaa ilmoituksen, että ajureiden asennus on epäonnistunut.
2.4 Avaa Control Panel ja valitse Hardware and Sound -> Devices and Printers ja alhaalla pitäisi näkyä NXTCamv3.0
2.5 Paina hiiren oikealla painikkeella kuvakkeen päällä ja valitse Properties
2.6 Avautuvassa ikkunassa siirry Hardware-välilehdellä ja paina Properties -painiketta
2.7 Avautuvassa ikkunassa valitse Change settings
2.8 Valitse Update Driver
2.9 Avautuvassa ikkunassa valitse alempi vaihtoehto: Browse my computer for driver software ja selaa siihen kansioon johon purit zippipaketin. (Esim. C:\Users\mXXXXXXX\Desktop\NXTCam_v3p0 Drivers) ja Paina Next
2.10 Windows aloittaa ajurin asennuksen ja antaa turvailmoituksen. Paina Install this driver
software anyway ja asennus jatkuu ja ensimmäinen ajuri asentuu
2.11 Kun se on asennettu, sulje auki oleva ikkuna ja paina hiiren oikealla painikkeella NXTCamv3.0 kuvakkeen päällä uudestaan (kuten kohdissa 2.4&2.5) ja valitse Properties
2.12 Avautuvassa ikkunassa siirry Hardware-välilehdellä ja varmista, että USB Serial Port on valittuna ja paina sitten Properties
2.13 Avautuvassa ikkunassa valitse Change settings ja avautuvassa ikkunassa Update Driver
2.14 Avautuvassa ikkunassa valitse alempi vaihtoehto: Browse my computer for driver software. Ajurikansion pitäisi olla oletuksena ajurikansion sijainti (jos ei ole niin toimi kuten kohdassa 2.9). Paina Next
2.15 Windows aloittaa ajurin asennuksen ja antaa turvailmoituksen. Paina Install this driver
software anyway ja asennus jatkuu ja toinen ajuri asentuu.
2.16 Ajurien asennus on valmis
3. Nyt voit avata NXTCamView:n. Mene asetuksiin (Tools -> Options) ja valitse Comport-kohtaan NXTCAM (Esim COM3: NXTCAM) ja paina ok
4. Nyt voit painaa Connect-painiketta ja ottaa kameralla kuvan tai pari painamalla Capture (HUOM! Muista poistaa linssinsuojus).
5. Katso ohjeita ohjelman käytöstä täältä