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ä

  • No labels
You must log in to comment.