Viimased viimistlused robotite häälestamisel ja homme pealelõunal astub tiim Robootika.COM oma kolme robotiga lennuki peale.
PuckCollect, Line Leader ja LEGO Sumo
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:
Tä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.
3. 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.
Tunni teema ikka endine, jätkata RobotChallenge võistluse robotite ehitamist.
Pealkirja tänasele postitusele andis oma küsimusega Marko.
Pildid räägivad enda eest
Ja lõpuks oli kommentaar, et “Ma ei teadnudki et robootika võib nii lahe olla…”
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.
PS! Miks Robo’d?
Selle nime pani robootikapoistele Laura. Üks robootik on robo ja palju robootikuid on robo’d.
10-11 märts 2012 toimub Viinis suur Euroopa meistrivõistlused robootikas RobotChallenge.
http://www.robotchallenge.org/
Võisteldakse kuues erinevas roboti-kategoorias:
- Robot 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 poistel 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.
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
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace Project_FRANK
- {
- class Program
- {
- static void Main(string[] args)
- {
- int F;
- int K;
- int R;
- int O;
- int A;
- int N;
- int res;
- int res2;
- for (F = 1; F < 10; F++)
- {
- for (K = 1; K < 10; K++)
- {
- for (R = 0; R < 10; R++)
- {
- for (O = 0; O < 10; O++)
- {
- for (A = 0; A < 10; A++)
- {
- for (N = 0; N < 10; N++)
- {
- res = K * 10000 + R * 1000 + O * 100 + N * 10 + A;
- res2 = F * 10000 + R * 1000 + A * 100 + N * 10 + K;
- 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)
- {
- Console.WriteLine(res);
- Console.WriteLine(res2);
- Console.WriteLine("************");
- }
- }
- }
- }
- }
- }
- }
- Console.ReadLine();
- }
- }
- }
See töötab. Päris kiiresti. Rao.
Selle 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
Pilt võetud Õhtulehe galeriist.http://www.ohtuleht.ee/457802
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
- #include <stdio.h>
-
- FILE *jada, *valf;
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- int temp;
- int sisend;
- int i;
- int tulemus;
- int jrk;
- int end = 0;
-
- jada = fopen("jada.sis", "r");
- fscanf( jada, "%i", &sisend);
-
- for(i=1; i<100000000; i++)
- {
- temp = i;
- jrk = 0;
- //järgmise while tsükli abil saame teada mis number on sisend positsioonil
- //ja mitmendal kohal antud numbri sees on otsitav arv
- while(temp > 0) {
- temp = temp/10;
- end++;
- jrk++;
- if(end == sisend)
- break;
- }
- if(end == sisend)
- break;
- }
-
- //saame teada numbri positsioonide arvu
- temp = i;
- end = 0;
- while(temp > 0) {
- temp = temp/10;
- end++;
- }
-
- //vastavalt postisioonile leiame numbri seest arvu
- temp = i;
- for(int k = jrk; k <= end; k++)
- {
- tulemus = temp%10;
- temp = temp/10;
- }
-
- printf("arv on %i\n", tulemus);
- valf = fopen("jada.val", "w");
- fprintf(valf, "%i%i\n", tulemus, tulemus+1);
- fclose(valf);
- return 0;
- }