Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Kus kohtuvad tippsport ja robootika

Kristjan Palusalu robotid lavalSelle aasta pidulik gala Spordiaasta Tähed 2011 Nokia Kontserdimajas toimus oma tavapärases headuses, kuid lõbus naer vallandus mu mõtetes kui nägin laval nelja Kristjan Palusalu robotit ringi vuramas.

Välja kuulutati Gerd Kanter kui Eesti Meessportlane 2011 ja Triin Aljand kui Eesti Naissportlane 2011.

Ja selliste tippudega koos on laval 4 robotit – see on super-lahe näide selle kohta et kus kohtuvad tippsport ja robootika.

Me oleme õigel teel Smile

Pilt võetud Õhtulehe galeriist.http://www.ohtuleht.ee/457802

Informaatika olümpiaadi põhikooli eelvoor – Jada seest numbri leidmine

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

3. Jada - 1 sekund - 50 punkti

Vaatleme (lõpmatut) numbrijada, mille saame kõigi positiivsete täisarvude kasvavas järjekorras üksteise järele kirjutamisega: 123456789101112131415...

Kirjutada programm, mis leiab selles jadas positsioonidel N ja N + 1 olevad numbrid.

Sisend. Tekstifaili jada.sis ainsal real on täisarv N (1 <= N <= 109).

Väljund. Tekstifaili jada.val ainsale reale väljastada kaks numbrit — jada otsitavad elemendid. Numbrid väljastada vahetult üksteise kõrvale, ilma tühikuteta.

Näide. jada.sis

5

jada.val

56

Näide. jada.sis

14

jada.val

12

Hindamine. Testides summaarse väärtusega 30 punkti on N <= 106 ja nende hulgas testides summaarse väärtusega 15 punkti on N <= 103.


Selle lahenduse väljamõtlemine oli kõige keerulisem. Siin tekkis mitu lahendusvarianti kuid kas alljärgnev on kõige efektiivsem, selles pole ma kindel. Sisetunne ütleb, et seda saaks intelligentsemalt teha, kuid minu arvuridade seaduspärade õppimine on üsna kaugesse kooliaega libisenud seega lähenesin nö. “brutal force” meetodil ülesande lahendamisele.

Alljärgnevaga on ülesanne lahendatud, aga äkki on kellelgi parem meetod?

Code Snippet
  1. #include <stdio.h>
  2.  
  3. FILE *jada, *valf;
  4.  
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.     int temp;
  8.     int sisend;
  9.     int i;
  10.     int tulemus;
  11.     int jrk;
  12.     int end = 0;
  13.  
  14.     jada = fopen("jada.sis", "r");
  15.     fscanf( jada, "%i", &sisend);
  16.  
  17.     for(i=1; i<100000000; i++)
  18.     {
  19.         temp = i;
  20.         jrk = 0;
  21.         //järgmise while tsükli abil saame teada mis number on sisend positsioonil
  22.         //ja mitmendal kohal antud numbri sees on otsitav arv
  23.         while(temp > 0) {
  24.             temp = temp/10;
  25.             end++;
  26.             jrk++;
  27.             if(end == sisend)
  28.                 break;
  29.         }
  30.         if(end == sisend)
  31.             break;
  32.     }
  33.  
  34.     //saame teada numbri positsioonide arvu
  35.     temp = i;
  36.     end = 0;
  37.     while(temp > 0) {
  38.         temp = temp/10;
  39.         end++;
  40.     }
  41.  
  42.     //vastavalt postisioonile leiame numbri seest arvu
  43.     temp = i;
  44.     for(int k = jrk; k <= end; k++)
  45.     {
  46.         tulemus = temp%10;
  47.         temp = temp/10;
  48.     }
  49.  
  50.    printf("arv on %i\n", tulemus);
  51.    valf = fopen("jada.val", "w");
  52.    fprintf(valf, "%i%i\n", tulemus, tulemus+1); 
  53.    fclose(valf);                                      
  54.    return 0;
  55. }

Informaatika olümpiaadi põhikooli eelvoor – Kurgipeenar

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

2. Kurgid - 1 sekund - 30 punkti

Talunikul on ristküliku kujuline põld ja ta tahab sellele teha kurgipeenra. Selleks, et peenart oleks parem masinatega harida, peab ka peenar olema ristküliku kujuline ja selle servad peavad olema paralleelsed põllu servadega.

Põllul on kaks mobiilimasti. Selleks, et peenart saaks öökülmade kaitseks kilega katta, ei tohi mastid olla peenra sees.

Kirjutada programm, mis leiab peenra maksimaalse võimaliku pindala.

Sisend. Tekstifaili kurgid2.sis esimesel real on põllu pikkus X (0 < X <= 109) ja laius Y (0 < Y <= 109). Faili teisel real on esimese masti koordinaadid X1 (0 <= X1 <= X) ja Y1 (0 <= Y1 <= Y ), mis näitavad, et mast on põllu vasakust otsast kaugusel X1 ja alumisest küljest kaugusel Y1. Faili kolmandal real on teise masti koordinaadid X2 ja Y2. Kõik arvud on täisarvud. Masti läbimõõt on põllu suurusega võrreldes nii väike, et seda pole vaja arvestada.

Väljund. Tekstifaili kurgid2.val ainsale reale väljastada täisarv S — otsitav pindala.

Näide. kurgid2.sis

10 5

4 1

8 4

kurgid2.val

32

Näide. kurgid2.sis

10 5

4 1

7 4

kurgid2.val

30

Alloleval joonisel on vasakul kujutatud esimese ja paremal teise näite lahendus.

clip_image001

Hindamine. Testides summaarse väärtusega 10 punkti on X <= 100 ja Y <= 100.


Kuna selle kohta initsiaalset (ka mittetöötavat) lahendust polnud siis siin on puhtalt minu lahendusvariant.

Code Snippet
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.   FILE *sisf;
  5.   FILE *valf;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int  x, y, x1, y1, x2, y2;
  10.   int val[4];
  11.  
  12.   sisf = fopen( "kurgid2.sis", "r" );
  13.   fscanf( sisf, "%i %i\n%i %i\n%i %i", &x, &y, &x1, &y1, &x2, &y2 );
  14.  
  15.   val[0]= abs((x2-x1)*y);
  16.   val[1] = abs((y2-y1)*x);
  17.  
  18.   val[2] = x1>x2 ? (x-x2)*y1 : (x-x1)*y2;
  19.   val[3] = y1>y2 ? (y-y2)*x1 : (y-y1)*x2;
  20.  
  21.   int max = val[0];
  22.   for(int i=0; i<4;i++)
  23.       max = max < val[i] ? val[i] : max ;
  24.  
  25.    printf("Max on %i\n", max);
  26.  
  27.   valf = fopen("kurgid2.val", "w");  
  28.   fprintf(valf, "%i\n", max);  
  29.   fclose(valf);      
  30.   return 0;
  31. }

Informaatika olümpiaadi põhikooli eelvoor – Summa arvutamine

Põhikooli ja muidugi ka gümnaasiumi õpilased on ikka mega-targad. Informaatika olümpiaad tekkis sel aastal päevakorda ning siis mõtlesin, et proovin kõige lihtsamad ehk põhikooli ülesanded ära lahendada. No ausalt öeldes võttis mul ikka aega, et meelde tuletada mingeid lihtsaid matemaatika põhitõdesid ja alljärgnevale ülesandele lahendus kirjutada. Keeleks valisin puhta C, mis lisas omakorda veidi keerukust keele õppimise näol.

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

1. Summa - 0,5 sekundit - 20 punkti

Kirjutada programm, mis leiab antud täisarvude A ja B vahele jäävate täisarvude summa (A ja B ise kaasa arvatud).

Sisend. Tekstifaili summa.sis ainsal real on tühikuga eraldatud täisarvud A (−109 <= A <= 109) ja B (−109 <= B <= 109).

Väljund. Tekstifaili summa.val ainsale reale väljastada täisarv S — otsitav summa.

Näide. summa.sis

1 5

summa.val

15

Näide. summa.sis

3 2

summa.val

5

Hindamine. Testides summaarse väärtusega 10 punkti on liidetavate arv <= 10 000.


Lahenduse tegemisel võtsin aluseks Rao koodi ning täiendasin seda viisil, et tööle hakkaks.

Code Snippet
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.   FILE *sisf;
  5.   FILE *valf;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int  x, y, hoidja;
  10.   double summa;
  11.  
  12.   sisf = fopen( "summa.sis", "r" );
  13.   fscanf( sisf, "%i %i", &y, &x );
  14.  
  15.   printf("X on %i\n", x);
  16.   printf("Y on %i\n", y);
  17.   if(y > x)
  18.   {
  19.        hoidja = y;
  20.        y = x;
  21.        x = hoidja;
  22.   }
  23.  
  24.   for(summa = 0; y <= x; y++)
  25.     {
  26.            summa += y;
  27.     }
  28.  
  29.   printf("Summa on %.f\n", summa);
  30.   valf = fopen("summa.val", "w");      /* avame faili kirjutamiseks */
  31.    fprintf(valf, "%.f\n", summa);                           /* v?¤ljastame */
  32.    fclose(valf);                                        /* sulgeme faili */
  33.    return 0;
  34. }

Tunnitöö: Explorer 4 – maadeavastaja robot

explorer

Ülesanne 4

Ehita BOT, millel on peal mootoriga Ultrasonic ning allpool asuvate objektide jaoks lülitiandur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel või põrkab lülitiga mõne väiksema takistuse vastu. Takistuse avastamisel robot peatub, vaatab Ultrasonic anduriga paremale / vasakule ning see kummal pool on rohkem ruumi (ehk US andur näeb kaugemale), sinna sõidab.

Lahendus

Käesolev explorer kasutab kahte andurit, seega lisandub veidi keerukust roboti programmeerimisele.

task main(){
SetSensorLowspeed(S1);
SetSensorTouch(S2);

int Kaugus;
int ParemPool;
int VasakPool;
Kaugus = 20;

while (TRUE){
	if(SensorUS(S1) < Kaugus || Sensor(S2)){
		Off(OUT_BC);
		if(Sensor(S2))
			{
			RotateMotor(OUT_BC, -50, 360);
			}

		RotateMotor(OUT_A, 50, 90);
		ParemPool = SensorUS(S1);
		RotateMotor(OUT_A, -50, 180);
		VasakPool = SensorUS(S2);
		RotateMotor(OUT_A, 50, 90);
		
		if(ParemPool > VasakPool)
			RotateMotorEx(OUT_BC, 50, 217, -100, TRUE, TRUE);
		else
			RotateMotorEx(OUT_BC, 50, 217, 100, TRUE, TRUE);
		}
	else{OnFwd(OUT_BC, 100);}
	}
}

Tunnitöö: Explorer 3 – maadeavastaja robot

image

Ülesanne 3 (Exploreri sarjast)

Ehita BOT, millel on peal mootoriga Ultrasonic andur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel. Seina nägemisel robot peatub, vaatab Ultrasonic anduriga paremale / vasakule ning see kummal pool on rohkem ruumi (ehk US andur näeb kaugemale), sinna sõidab.

 

Lahendus

Ultrasonic anduriga paremalt-vasakult kaugust mõõtes peab selle salvestama muutujatesse ning siis neid omavahel võrdlema. Selle põhjal otsustab robot kuhu keerata.

 

task main(){
SetSensorLowspeed(S1);

int Kaugus;
int ParemPool;
int VasakPool;
Kaugus = 20;

while(TRUE){
	if(SensorUS(S1) < Kaugus){
		Off(OUT_BC);
		RotateMotor(OUT_A, 25, 90);
		ParemPool = SensorUS(S1); //mõõdab paremal kaugust
		RotateMotor(OUT_A, 25, -180);
		VasakPool = SensorUS(S1); //mõõdab vasakult poolt kaugust
		RotateMotor(OUT_A, 25, 90);
		if(ParemPool > VasakPool){
			RotateMotorEx(OUT_BC, 50, 217, 100, TRUE, TRUE); //keerab paremale
			}
		else{
			RotateMotorEx(OUT_BC, 50, 217, -100, TRUE, TRUE); //keerab vasakule
			}
		}
	
	else{
		OnFwdSync(OUT_BC, 100, 0);
		}
	}
}

Tunnitöö: Explorer 1 ja 2 – maadeavastaja robot

Explorer

Ülesanne 1

Ehita BOT, millel on ees Ultrasonic kauguseandur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel. Seina nägemisel robot peatub, tagurdab ja keerab kas paremale või vasakule (valitakse juhuslikkuse meetodil, funktsiooniga Random()).

 

Ülesanne 2

Ehita BOT, millel on ees lülitiandur.

Kirjuta programm, mille käigus robot sõidab otse kuni lüliti vajutamiseni ehk seina vms takistuseni. Takistuse avastades robot peatub, tagurdab ja keerab kas paremale või vasakule (valitakse juhuslikkuse meetodil, funktsiooniga Random()).

 

Lahendus ülesannetele 1 ja 2

Mõlemad ülesanded on sarnased, erinedes ainult selle poolest, et ühel puhul keerab robot tagasi kauguseandurist saabuva signaali tõttu ning teisel juhul lülitist saabuva signaali tõttu.

Alljärgnevas näites on kasutatud switch-elementi, kuid selle võib asendada ka if-else lausega.

task main(){
/*
KAUGUS muutuja abil määrab robot kas peab tagasi sõitma
RAND muutuja abil määrab robot kas ta sõidab paremale või vasakule
*/
SetSensorLowspeed(S4);
int KAUGUS = 20;
int RAND;
while (TRUE){
      if (SensorUS(S4) < KAUGUS){          //Kui robot näeb seina lähedamal kui 20 cm siis ta sõidab tagasi
        RAND = Random(2);
        switch (RAND)
        {
          case 0:                          //Robot sõidab paremale
          RotateMotorEx(OUT_BC, 100, 335, -50, TRUE, TRUE);
          break;
          case 1:                          //Robot sõidab vasakule
          RotateMotorEx(OUT_BC, 100, 335, 50, TRUE, TRUE);
          break;
        }
      }
      else {
           OnRevSync(OUT_BC, 100, 0);      //Muidu sõidab robot edasi
      }
}
}

2. koht Eesti Lego-roboti võistluselt !

RobotFLL ehk Lego-roboti võistlus mis on suunatud põhikoolile vanuses 9-16 aastased saavutas tiim Robootika.COM 2. koha.

Tegelikult koosnes võistlus 4-st osast, millest kõige vaatemängulisem on muidugi roboti platsivõistlus, kus robot peab 2,5 minuti jooksul ära lahendama suure hulga keerulisi ülesandeid. Platsivõistlusel saavutas Kivilinn 147 punkti ning Robootika.COM tiim 140 punkti. Kolmas koht Master (Narva) saavutas 128 punkti.

Kui aga võistluse kolm ülejäänud ala juurde arvestati – projekt koos esitlusega, roboti disaini ning programmeerimise hindamine ja tiimitöö tulemuslikkus - jäi lõpptulemus ikka samaks, ehk esikohad on järgmised, vahetus vaid kolmas koht.

  1. Kivilinna gümnaasium
  2. Robootika.COM
  3. Öökullid

Vähemalt kahel esimesel kohal oli robot arvestatud tegema ca 200 punkti, kuid mõlema tiimi robot tegi platsil ettearvamatuid liigutusi ja nõnda jäid kodustes testides saavutatud paremad punktid võistlusel täitmata.

Igatahes minu poolt tiimile PALJU ÕNNE!

Te kõik olite väga tublid ning täna võite julgelt öelda, et te olete Eesti ainukese segakoolide tiimina Eesti teine koht!!

Kui programmeerimises olite selgelt Eesti parim! Selle eest ka pildil nähaolev karikas.

Parim Lego-robot joonejälgija

Veelkord palju õnne tiimile Robootika.COM!

Robotexi joonejälgimise võistlusel oli palju vingeid joonejälgijaid ning esikohad läksid kõik välismaale.

Lego-robotite hulgast oli tiimi Robootika.COM robot nimega LegoPID kõige kiirem. Kui arvestada et kokku oli roboteid umbes 30 ja kolm esikohta läksid Eestist välja, on LegoPID roboti saavutatud ca 10. koht ülikõva tulemus. Joonejälgija klassis olid ülejäänud võistlejad valdavalt kõrgkoolidest.

Täpsustan lõpliku tulemuse kui need üles laetakse.

Rao LegoPID joonejälgija robotiga

Xbox party vol.2

Laupäeval toimus järjekordne xbox party. Meil oli seal ülilõbus, mängisime Halo 3, Halo CE anniversary ja ka palju Kinecti mänge. Oli väga lahe, ootan huviga järgmist partyt