Krúžok Robotiky na GJH

From RoboWiki
Revision as of 14:32, 24 June 2008 by Palo (talk | contribs)
Jump to: navigation, search

Krúžok robotiky sa zaoberá stavbou a programovaním robotov zo stavebníc LEGO NXT. Učíme sa programovací jazyk NXC. V máji sa chceme zúčastniť na turnaji RoboCup Junior Slovensko v Banskej Bystrici a na jeseň na súťaži First LEGO League.

Pozri stránku RoboCup Junior Slovensko, kde sú aj pravidlá súťažných kategórií Záchranár, Futbal a Tanec robotov.


Stretnutie 22.4.2008

  • Nainštalovali sme si programovací jazyk NXC s prostredím BricX

(treba stiahnuť súbor test_release.zip, rozbaliť ho a spustiť). USB driver: download

  • Napísali sme prvý program pre robota, pomocou ktorého prejde o kúsok vpred:
task main()
{
  OnFwd(OUT_AC, 75);
  Wait(1000);
  Float(OUT_AC);
}

Prvý riadok zapne motory na portoch A a C na rýchlosť 75 (najväčšia rýchlosť je 100). Druhý riadok počká 1 sekundu (ale motory sú už zapnuté, takže robot ide 1s vpred). Tretí riadok vypne motory na portoch A a C.

  • Potom si krúžkari sami zmenili program tak, aby robot prešiel do štvorca, použili sme

pritom príkaz:

OnRev(OUT_AC, 75);

ktorý zapne motor v spätnom chode (rýchlosťou 75 - tú môžeme samozrejme meniť).

Videli sme, že bolo zložité vyladiť dĺžku čakania pri zatáčaní a preto sme využili príkaz

RotateMotor(OUT_A, 75, 45);

ktorý spôsobí, že motor na porte A sa otočí len o 45 stupňov a potom zastane - využíva pritom otáčkové snímače, ktoré sú zabudované do motorov.

  • Napokon sme na papieri fixkou nakreslili čiaru a naprogramovali sme robota tak, aby

chodil do kola po čiare (keď sme konečne našli správne príkazy :). Tu je výsledný program:

int s;
task main()
{
  SetSensorType(S1, SENSOR_TYPE_LIGHT_ACTIVE);
  SetSensorMode(S1, SENSOR_MODE_PERCENT);
  ResetSensor(S1);

  while (1)
  {
    if (Sensor(S1) < 48) 
    {
      OnFwd(OUT_A, 75);
      Float(OUT_C);
    }
    else
    {
      OnFwd(OUT_C, 75);
      Float(OUT_A);
    }
  }
}

Program najskôr nastaví typ senzora na porte 1 (čiže S1) na aktívny svetelný senzor. Potom opakuje donekonečna (lebo podmienka 1 je vždy splnená) jeden jednoduchý test: ak je intenzita odrazeného svetla menšia ako 45, robot je na čiernej čiare a má zatáčať vpravo. V opačnom prípade je robot na bielom papieri a má zatáčať vľavo. Takto robot sleduje hranu čiary medzi bielou a čiernou... Tento program treba prispôsobiť podľa toho, aká tmavá je čiara (hodnota 48 v podmienke) a podľa toho, na ktorých portoch má robot pripojené motory a ktorým smerom sú otočené (t.j. vymeniť časti podmienok).

Kruzok gjh sledovanie ciary.jpg

Spoločné stretnutia pre všetkých zaújemcov budú pokračovať každý týždeň v utorok o 14.

Stretnutia 24. - 27. 4. 2008

Nasledujúci program vypisuje hodnoty ultrazvukového snímača na porte 1 na meranie vzdialenosti na LCD:

int s;
task main()
{
  SetSensorType(S1, SENSOR_TYPE_LOWSPEED);
  ClearScreen();
  while(1)
  {
    ClearScreen();
    NumOut(10,10,SensorUS(S1));
    Wait(500);
  }
}

Typy senzorov:

SENSOR_TYPE_TOUCH        tlakový snímač (tlačidlo)
SENSOR_TYPE_TEMPERATURE  tepelný snímač (doplnkový senzor)
SENSOR_TYPE_LIGHT        svetelný snímač zo stavebnice RCX
SENSOR_TYPE_ROTATION     otáčkový snímač zo stavebnice RCX
SENSOR_TYPE_LIGHT_ACTIVE svetelný NXT snímač v aktívnom režime
SENSOR_TYPE_LIGHT_INACTIVE svetelný NXT snímač v pasívnom režime (dióda nesvieti)
SENSOR_TYPE_SOUND_DB     zvukový snímač
SENSOR_TYPE_SOUND_DBA    zvukový snímač (iné jednotky)
SENSOR_TYPE_LOWSPEED     ultrazvukový snímač

Snímače sa v programe čítajú pomocou funkcíí Sensor(S1) - Sensor(S4),
ale ultrazvukový snímač sa číta pomocou SensorUS(S1) - SensorUS(S4).

Na začiatku programu treba snímače nastaviť pomocou príkazu:

SetSensorType(S1,jeden_z_tychto_typov);
SetSensorMode(S1,SENSOR_MODE_PERCENT);
ResetSensor(S1);

Ak nechceme hodnoty 0-100, môžeme použiť iný mód, jeden z nasledujúcich:

SENSOR_MODE_RAW        priama "surová" hodnota od 0 do 1023
SENSOR_MODE_BOOL	0 alebo 1
SENSOR_MODE_EDGE	počíta koľkokrát prejde senzor z 0 do 1 alebo z 1 do 0
SENSOR_MODE_PULSE	počíta koľkokrát prejde senzor z 0 do 1 a naspäť
SENSOR_MODE_PERCENT	hodnota 0 až 100
SENSOR_MODE_FAHRENHEIT	jednotky F (pre tepelný snímač)
SENSOR_MODE_CELSIUS	stupne C (pre tepelný snímač)
SENSOR_MODE_ROTATION	počet otáčok (pre RCX otáčkový snímač)

Senzory HiTechnic na snímanie IR lotpy, farby, naklonenia a smeru (kompasový) sa nastavujú ako keby boli ultrazvukový senzor. Ak potrebujeme čítať hodnoty aj z iných I2C adries, ako 42H (pozri dokumentáciu k senzorom), môžeme použiť takýto program: accel.nxc - číta presné hodnoty naklonenia akceleračného snímača podľa troch osí X,Y,Z.

Podobne nasledujúci program číta presné hodnoty R,G,B zo svetelného senzora: color.nxc, a nasledujúci prečíta hodnoty pre všetkých 5 IR senzorov zabudovaných do IRSeeker senzora vrátane smeru 1-9: irseeker.nxc


Nasledujúca funkcia prikáže motorom urobiť zadaný počet otáčok v zadanom výkone:

void go(int powerA, int powerB, int rotations)
{
  SetOutput(OUT_A,
            TachoLimit, rotations,
            Power, powerA,
            OutputMode,
            OUT_MODE_MOTORON,
            RunState,
            OUT_RUNSTATE_RUNNING,
            UpdateFlags, UF_UPDATE_MODE + UF_UPDATE_SPEED + UF_UPDATE_TACHO_LIMIT );

  SetOutput(OUT_B,
            TachoLimit, rotations,
            Power, powerB,
            OutputMode,
            OUT_MODE_MOTORON,
            RunState,
            OUT_RUNSTATE_RUNNING,
            UpdateFlags, UF_UPDATE_MODE + UF_UPDATE_SPEED + UF_UPDATE_TACHO_LIMIT );
 while( GetOutput ( OUT_A, RunState ) != OUT_RUNSTATE_IDLE);
}

napríklad:

go(75,75,1000);  - prejdi 1000 krokov (stupňov otočenia motora) vpred rýchlosťou 75
go(-75,-75,1000); - prejdi 1000 krokov vzad...
go(75,-75,1000); - otáčaj sa jedným smerom...
go(-75,75,1000); - otáčaj sa druhźm smerom...
Stavba rcj1 s.jpg Stavba rcj2 s.jpg Stavba rcj3 s.jpg Stavba rcj4 s.jpg Stavba rcj5 s.jpg
(+) (+) (+) (+) (+)

Nasledujúca funkcia využíva kompasový senzor na porte 1 a vráti uhol 0-180 - smer oproti začiatočnému smeru pri odštartovaní programu.

int r;
int uhol()
{
  int u, mensi, vacsi, roz1, roz2;
  u = SensorUS(S1);
  if (u > r) { mensi = r; vacsi = u; }
  else { mensi = u; vacsi = r; }
 
  roz1 = vacsi - mensi;
  roz2 = mensi + 180 - vacsi;
 
  if (roz1 < roz2) return 2*roz1;
  return 2*roz2;
}

Môžeme ju v programe použiť takto:

task main ()
{
  SetSensorType(S1,SENSOR_TYPE_LOWSPEED); // compass
  Wait(1000); // pocka 1 sekundu 
  
  r = (SensorUS(S1));  // nacita pociatocnu hodnotu snimaca
  while(ButtonPressed(BTN2,true) == false); // pocka na stlacenie sipky vpravo
  PlayTone(2000,500);  // potom zapiska

  ...
  if (uhol() < 90)
  {
    // robot je otoceny spravnym smerom
  }
  else
  {
    // robot je otoceny opacnym smerom
  }
}

V dňoch 1. a 2. mája sme sa zúčastnili Súťaže v stavbe a programovaní robotov RoboCup Junior Slovensko 2008 v Banskej Bystrici s týmami v kategóriách Futbal 2-na-2 a Záchranár. Hoci náš záchranársky robot nedopadol veľmi dobre - keďže sme mali na prípravu menej ako 2 týždne, futbalové roboty boli postavené a naprogramované spoľahlivo a získali pekné 3. miesto (2. v kategórii stredných škôl). Tu sú súťažné roboty:

Futbalista1.jpg Futbalista2.jpg

Záchranárske roboty odvtedy vylepšujeme/staviame odznova. Tu sú dve verzie z polovičky mája, ktoré čoskoro otestujeme:

Zachranar1.jpg Zachranar2.jpg

Staviame i novú verziu futbalistických robotov, ktoré v prototypoch vyzerajú takto:

Novy futbal.jpg Novy futbal2.jpg


Stretnutie 20.5.2008

Prvý dnešný program hľadá ľudí dookola a keď niekoho nájde, ide za ním, až kým nepríde bližšie, keď zastane: hladac.nxc.

Druhý program naopak chodí vpred dokiaľ nepríde k prekážke, ktorej sa vyhne a pokračuje ďalej:vyhybac.nxc.

A takto vyzerá zábava s robotom:

Nahanac1.jpg Nahanac2.jpg Nahanac3.jpg


Stretnutie 24.6.2008

Tvoríme 3D model zachranárskych robotov. Vymýšlame algoritmus pre futbalistické roboty:

1.Nacitanie vstupnych udajov
   kam som otoceny
   na ktorej som polke(svetla/tmava)
   cakanie na stlacanie startovneho tlacidla

nekonecny cyklus(do vypnutia programu):
{
  2. Ak nevidim loptu : 
                       Hladanie :  
			  Otocka na mieste 360 deg
			  ked ju stale nevidi pojde na svoju polku kontrolujuc
                           prekazku (ktore obide) natoci sa na supera 
			    a bude pozerat po lopte

     ak vidi loptu :
		a)je otoceny na svoju polku:
                   - obide ju: skusi ju obist nalavo,
                     ak je tam prekazka tak ju obide napravo
                     pocas obchadzania kontroluje prekazku  
                   // a pojde na superovu branku
		
		b)je otoceny na supera- utoci:
                   - ak je lopta daleko (t.j. prekazkovy senzor dava hodnotu > 5 cm):
                     nastavi motory tak, aby sa robot tocil na loptu
                   - ak je lopta blizko, plnou rychlostou vpred na kratku vzdialenost,
                      a potom zastavit na chvilku
} 


3.spracovanie prekazky : ak je predo mnou prekazka a  
			 nie je to lopta treba sa jej vyhnut: 
                           zastat, 
                           vratit sa o kusok spat
                           otocit sa smerom k superovej strane (vlavo alebo vpravo o 60 stupnov)

Tu je program, ktorý otočí robotom na mieste o 360 stupňov, pričom počas otáčania beží cyklus while a tak robot môže priebežne reagovať na vnemy zo snímačov: p1.nxc