Projekt Lego RoboLab - Software



RoboLab software

RoboLab software je program dodávaný do škôl v rámci projektu Infovek. Ide o software pre programovanie a riadenie RCX kocky pomocou programovacieho počítačového jazyka LabView. Grafické vývojové prostredie je prispôsobené už pre žiakov 1. stupňa ZŠ. Vlastné programovanie je realizované návrhom vývojových diagramov pomocou ikonografického jazyka.

RoboLab software umožňuje:


Pre ilustráciu práce "mladého programátora" v RoboLab software uvedieme program, ktorým sa rozsvieti žiarovka na výstupe A toľko krát, koľko krát je zatlačený tlakový snímač na vstupe 1 počas 10 sekúnd.

Program v RoboLab software

Hore

NQC

Pôvodným autorom jazyka NQC (Not Quite C) je Dave Baum. V súčasnosti na jeho vývoji pracuje John Hansen (v súvislosti s projektom BricxCC) . Jazyk NQC vychádza z jazyka C. Ako vývojové prostredie k jazyku NQC doporučujeme práve BricxCC.

Autorom IDE (vývojového prostredia) BricxCC (Bricx Command Center) Mark Overmars z holandskej univerzity v Utrechte. BricxCC (aj verziu pre nové Lego NXT kocky) možno stiahnuť zo stránok Johna Hansena http://bricxcc.sourceforge.net.

Učebnicu jazyka NQC pre programovanie RCX kocky v prostredí BricxCC možno stiahnuť zo stránok Marka Overmarsa [ tutorial.pdf ], prípadne jej český preklad Roberta Seiferta [ nqctutor.zip ]. Túto učebnicu považujeme za povinnú literatúru!

Po výmene batérií v RCX kocke (doporučujeme 1.2V NiMH 2600mAh nabíjateľné batérie) je treba do RCX kocky downloadnúť firmware [ firm0328.lgo ].

Pre ilustráciu práce "mladého programátora" v NQC uvedieme tri možné riešenia problému robotického vozítka sledujúceho čiernu čiaru na bielom podklade (súťaže typu Linefollower (Istrobot), Slalom a Slalom Enhanced (RobotChallenge) a Rescue (RoboCup Junior)).


Linefollower s jedným svetelným snímačom

Snímač osciluje nad hranou čiary. V prípade prerušenia čiary sa robot vracia naspäť po druhej hrane čiary. Robot nesmie ísť príliš rýchlo. Nevhodné pre žiadnu zo súťaží ale zaujímavá problémová úloha.

/* Linefollower
   Snimace: 1ks Light Sensor
   Robot sleduje lave rozhranie ciary
*/

#define DARK 45 // ak je menej tak je na ciare
#define SPEED 3 // rychlost motorov

#define IS_DARK (SENSOR_2 < DARK)

void Init () {
  SetSensor (SENSOR_2, SENSOR_LIGHT);
  SetPower (OUT_A + OUT_C, SPEED);
}

task main () {
  Init ();
  while (true) { // nekonecny cyklus
    if (IS_DARK) {
      OnFwd (OUT_C);
      Off (OUT_A);
    }
    else {
      OnFwd (OUT_A);
      Off (OUT_C);
    }
  }
}    


Linefollower s dvomi svetelnými snímačmi (pomalý)

Snímače sú umiestnené ďalej od seba a čiara sa (väčšinou) nachádza medzi nimi. V prípade prerušenia čiary v rovnom úseku robot toto prerušenie ani nezbadá a pokračuje v sledovaní čiary ďalej. Ak je prerušenie v oblúku, treba túto udalosť detekovať a softwareovo ošetriť. Robot nesmie ísť príliš rýchlo. Keďže robot je vždy "vycentrovaný" nad čiarou, je tento algoritmus vhodný pre súťaž Rescue (RoboCup Junior). V príklade je ilustrované použitie paralelného behu dvoch úloh.

/* Linefollower
   Snimace: 2ks Light Sensor
   Robot ma ciaru medzi snimacmi (paralelne ulohy)
*/

#define DARK 45 // ak je menej tak je na ciare
#define SPEED 3 // rychlost motorov

#define S1_IS_DARK (SENSOR_1 < DARK)
#define S3_IS_DARK (SENSOR_3 < DARK)

void Init () {
  SetSensor (SENSOR_1, SENSOR_LIGHT);
  SetSensor (SENSOR_2, SENSOR_LIGHT);
  SetPower (OUT_A + OUT_C, SPEED);
  OnFwd (OUT_A + OUT_C); // ciara je medzi snimacmi
}

task left_side () { // lavy snimac (1) a lavy motor (A)
  while (true) {
    while (S1_IS_DARK) {
      OnRev (OUT_A);
    }
    OnFwd (OUT_A);
  }
}

task right_side () { // pravy snimac (3) a pravy motor (C)
  while (true) {
    while (S3_IS_DARK) {
      OnRev (OUT_C);
    }
    OnFwd (OUT_C);
  }
}

task main () {
  Init ();
  start left_side;
  start right_side;
}    


Linefollower s dvomi svetelnými snímačmi (rýchly)

Snímače sú umiestnené tesne pri sebe a čiara sa (občas) nachádza pod nimi. V prípade prerušenia čiary (a to aj na rovnom úseku) treba túto udalosť detekovať a softwareovo ošetriť. Robot môže ísť veľmi rýchlo. Keďže robot často vychádza mimo čiaru, nie je tento algoritmus vhodný pre súťaž Rescue (RoboCup Junior). Pre veľkú rýchlosť robota je však vhodný pre súťaže Linefollower (Istrobot) a Slalom a Slalom Enhanced (RobotChallenge).

/* Linefollower
   Snimace: 2ks Light Sensor
   Robot ma ciaru pod snimacmi
*/

#define DARK 45 // ak je menej tak je na ciare
#define SPEED 7 // rychlost motorov

#define S1_IS_DARK (SENSOR_1 < DARK)
#define S3_IS_DARK (SENSOR_3 < DARK)
#define OUTSIDE (!S1_IS_DARK && !S3_IS_DARK)

int last_dark; // kde robot "videl" naposledy ciaru

void Init () {
  SetSensor (SENSOR_1, SENSOR_LIGHT);
  SetSensor (SENSOR_2, SENSOR_LIGHT);
  SetPower (OUT_A + OUT_C, SPEED); 
}

task main () {
  Init ();
  while (true) {
    if (S1_IS_DARK ) {
      OnFwd (OUT_A + OUT_C);
      last_dark = 1;
    }
    if (S3_IS_DARK) {
      OnFwd (OUT_A + OUT_C);
      last_dark = 3;
    }
    if (OUTSIDE) {
      if (last_dark == 1) {
        Off (OUT_A);
        until (S1_IS_DARK);
      }
      if (last_dark == 3) {
        Off (OUT_C);
        until (S3_IS_DARK);
      }
    }
  }
}    

Hore