Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

PID-kontrolleri ja kompassi abil robot otse sõitma

17.veebruari tund möödus puhtalt selle tähe all, et kuidas ehitada PuckCollect robotile süsteem kompassi ja PID-kontrolleri abil otsesõitmiseks.

Rao tuli päris keerulise matemaatilise loogikaga lagedale, mille peale mul lihtsalt aju suitsema hakkas ja ma mõtlesin excelis välja sama asja ainult et lihtsamal moel. Õnneks leidis Rao sellest ka väikese vea, enne kui robotisse programmeerima hakkas.

Seega kompassi ja  PID-kontrolleriga otsesõitmine. Tegelikult kasutame ainult P-kontrolleri osas, sellest piisab meie robotile.

task PID()
{
	int compass;
	float error;
	int turn;
	int speed1;
	int speed2;
	float  Kp = 5;
	compass = SensorHTCompass(S3);
while(1)
{
		if(MindSensorTouch(S4, 2))
			break;
		error = compass - SensorHTCompass(S3);
		if(error < -180)
				error += 360;
		if(error > 180)
				error -= 360;
		turn = error * Kp;
		speed1 = BAASKIIRUS + turn;
		speed2 = BAASKIIRUS - turn;
		if(speed1 > 100)
			speed1 = 100;
		if(speed1 < -100)
			speed1 = -100;
		if(speed2 > 100)
			speed2 = 100;
		if(speed2 < -100)
			speed2 = -100;
		
		OnFwd(OUT_B, speed2);
		OnFwd(OUT_C, speed1);
}  	
Off(OUT_BC);
}

Robot ise näeb täna juba välja selline:

IMG_1360

Puck collect roboti testimine - hea tulemus

Puck CollectTäna said poisid nii kaugele, et saime Puck Collect roboti põrandal käima panna ning testida kas eraldamine üldse toimub. Ja või öelda et toimis – ning veel suurepäraselt sealjuures.

Enamikel testikordadel suutis robot kõik sinised/punased ära eraldada, kui aga liiga tihedalt ette anda siis jäid need roboti suudmesse troppi ja kinni. Selles osas peame veel mõtlema kas on mooduseid parendamiseks.

Järgmised taskid selle robotiga:

1. Otsesõitmine korda saada kompassi abil. Kui lihtsalt mootorite järgi lasta sõita siis robot kaldub oma raskuse ja vildakuse tõttu ära, kompassi abil aga suudame panna roboti otse sõitma.

2. Platsil sõitmise algoritm. Mida teeb robot peale starti ja kuidas iseseisvalt navigeerib platsil. Abiks saavad olema ette ja taha paigaldatavad puutesensorid.

Puck Collect3. Baasi tagasisõitmise algoritm, kasutades kompassi navigeerib robot oma baasi.

4. Oma litrite eraldamine baasi.

5. Vastase litrite eraldamine kusagile kõrvale seina äärde.

6. Vastase baasi sõitmine (kui ajaliselt jõuab).

7. Stardihetkel õige programmi valimine – kas punased või sinised nööbid on “omad”. Algtuvastamist teha baasi põranda värvuse järgi.

Robo’d Euroopa Meistrivõistlusteks valmistumas

10-11. märtsil toimub Viinis suur robotivõistlus RobotChallenge 2012. See kannab ühtlasi Euroopa Meistrivõistluste tiitlit ning meeskond Robootika.COM ehitab selle tarbeks roboteid. http://www.robotchallenge.org/ 

Tänase tunni töövahendid olid saag, plekikäärid, frees, teip, liivapaber, tangid ning vaid Raol oli võimalus arvutis programmeerida.

imageIMG_1280

IMG_1279image

PS! Miks Robo’d?

Selle nime pani robootikapoistele Laura. Üks robootik on robo ja palju robootikuid on robo’d.

Robootika EM RobotChallenge Viinis

RobotChallenge 201210-11 märts 2012 toimub Viinis suur Euroopa meistrivõistlused robootikas RobotChallenge.

http://www.robotchallenge.org/ 

Võisteldakse kuues erinevas roboti-kategoorias:

  • imageRobot Sumo – selles kategoorias on kaasalöömiseks spetsiaalselt LEGO-sumo klass.
  • Line Follower / Enhanced – joonejälgimise võistlus lihtne/keeruline. Viimasel Robotexi võistlusel näitas Robootika.COM joonejälgija robot päris head tulemust. Seda edasi arendades on meil suurepärane võimalus osaleda joonejälgija võistlusel.
  • Puck Collect  – see on värviliste „nööpide“ kogumine 2x2m platsilt robotiga. Siin saab edukalt LEGO-robotiga osaleda.
  • Humanoid Sprint – inimesekujuliste robotite võidujooks 2,1 meetri pikkusel lõigul. See on ehitusmehaaniliselt üsna keeruline ning siin tuleb ilmselt imagepoistel veel paar aastat õppida.
  • Freestyle – vabakava, kus tiimid näitavad mida toredat nad on ise välja mõelnud.
  • Air Race  – lendavate robotite võistlus. Siin LEGO-ga ei saa osaleda kuna see ei lenda.

 

 

Sisuliselt saavad poisid edukalt võistelda kolmes kategoorias ning omandada hulgaliselt robootika-alast kogemust.

Täna aitab kogu meeskond ehitada selleks võistluseks roboteid. Sumo robot on põhimõtteliselt valmis. PuckCollect roboti ehitamine on planeerimisjärgus ja samuti on joonejälgija robot poolel teel.

KRONA + KRONA + KRONA = FRANK

Ramsesele anti koolis selline ülesanne:


KROMA
KROMA
+KROMA
-----------
FRANK

Ramses ja Leivo lahendasid seda tahvlijuures otsides seoseid ja värki, samal ajal kirjutasin mina C#-pis programm selle lahendamiseks.

Code Snippet
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Project_FRANK
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             int F;
  13.             int K;
  14.             int R;
  15.             int O;
  16.             int A;
  17.             int N;
  18.             int res;
  19.             int res2;
  20.             for (F = 1; F < 10; F++)
  21.             {
  22.                 for (K = 1; K < 10; K++)
  23.                 {
  24.                     for (R = 0; R < 10; R++)
  25.                     {
  26.                         for (O = 0; O < 10; O++)
  27.                         {
  28.                             for (A = 0; A < 10; A++)
  29.                             {
  30.                                 for (N = 0; N < 10; N++)
  31.                                 {
  32.                                     res = K * 10000 + R * 1000 + O * 100 + N * 10 + A;
  33.                                     res2 = F * 10000 + R * 1000 + A * 100 + N * 10 + K;
  34.                                     if (res * 3 == res2 & F != K & F != R & F != O & F != A & F != N & K != R & K != O & K != A & K != N & R != O & R != A & R != N & O != A & O != N & A != N)
  35.                                     {
  36.                                         Console.WriteLine(res);
  37.                                         Console.WriteLine(res2);
  38.                                         Console.WriteLine("************");
  39.                                     }
  40.                                 }
  41.                             }
  42.                         }
  43.                     }
  44.                 }
  45.             }
  46.             Console.ReadLine();
  47.         }
  48.     }
  49. }
See töötab. Päris kiiresti.

Rao.

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. }