Útvonalkövetés


1. A feladat leírása

Feladatunk egy olyan robot készítése, amelyik képes egy megadott útvonalat követni. Az útvonal alatt egy megfelelõ szélességû, tetszõlegesen kanyarodó, a padlózat színétõl jelentõs mértékben eltérõ csíkot értünk.

A feladat kivitelezésében fontos szerepet jatszakan a következõ tényezõk:


2. Megoldásaink

Ebben a dokumentációban a feladat megoldásának kétféle változata kerül bemutatásra. Az elsõ változat tulajdonképpen csak a megépített robot tesztelésére szolgál, többnyire csak alapfunkciókat valósít meg, míg a második verzióban történtek a részletek alaposabb kidolgozásai, illetve a különbözõ extra funkciók megvalósításai (lásd késõbb).
 

3. A robot

A megépített robot tulajdonképpen egy lánctalpas kiskocsi, amit az alábbi képek szemléltetnek. A két lánctalpat két külön motor üzemelteti, ezen kívül mindkét motor rendelkezik egy-egy fényérzékelõvel is. A kiskocsi elején található fehér, nyomógombra emlékeztetõ szerkezet nem más, mint egy ütközésérzékelõ, aminek megnyomása a robot megállását eredményezi. (ez azt jelenti, hogy ha a robot nekimegy valaminek, akkor automatikusan megáll). Ezen kívül a robot elsõ részének közepén egy újabb fényérzékelõ található, aminek szerepe a kocsit az útvonalon tartani.
 

4. Az útvonal

Az általunk megépített robot sötét háttérre ragasztott világos színû (fehér) útvonalat képes követni. Nem célszerû az útvonalat túl fényes felületre


 
 

ragasztani, illetve maga az út se legyen fényes (pl. ragasztószalag), mert a fényvisszaverõdés megzavarja a robot fényérzékelõit, amelyek azután nem bitzos, hogy helyesen mûködnek majd. A legcélszerûbb (a tesztelést is ilyen körülmények között végeztük) a papírcsíkokból készített útvonal.
 

5. Az elsõ változat

(két érzékelõs változat; a középsõ, utat figyelõ érzékelõ nincs beleépítve)

Az A, B, C érzékelõk közül:

Az 1, 2, 3 erõforrás: A program elején definiálnunk kell a robot haladási sebességét.

#define SPEED 4
int rnd;

A programozási fázis megkezdése elõtt kikisérleteztük azokat a küszöbértékeket, amelyek alapján a fényérzékelõk meg tudják határozni, hogy utat látnak-e vagy nem.

#define HATAR 40

Ezután következett a fõprogram megírása, amely az alábbi fontosabb részekbõl  áll:

Amíg az ütközésérzékelõ értéke kisebb, mint 1000, a robot halad elõre. Ha ez az érték 1000 fölé ugrott, az azt jelenti, hogy az ütközésérzékelõ gombja meg lett nyomva, azaz a robot nekiment egy akadálynak, és nem tud továbbhaladni. Amennyiben a bal fényérzékelõ nem érzékel utat, akkor kikapcsolja a bal motort, azaz a kocsi balra fordul. Hasonlóképpen mûködik a jobb oldali fényérzékelõ is. Különben a robot halad elõre a kezdetben definiált sebességgel. Ezt a feladatot a következõ programrész valósítja meg:

  while(SENSOR_2 <1000)         
          {if(SENSOR_1 >= HATAR) 
              { Off(OUT_A);
              }
           else  
              {SetPower(OUT_A, SPEED); 
               OnFwd(OUT_A);
              }
           if(SENSOR_3 >= HATAR) 
              {Off(OUT_C);
              }
           else  
              {SetPower(OUT_C, SPEED); 
               OnRev(OUT_C);
              }
           }
Gond akkor lép fel, ha a robot mindkét érzékelõje útra téved. Ekkor ahhoz, hogy erre a helyzetre is reagálni tudjon valamit a robot, bevezettük azt a megoldást, hogy ilyenkor véletlenszerû sebességgel egy bizonyos ideig hátrafelé halad.
  if (SENSOR_1 >=HATAR && SENSOR_3 >=HATAR) 
          {
             rnd=Random(5);
             SetPower(OUT_A, rnd);
             rnd=Random(5);
             SetPower(OUT_C, rnd);
             OnRev(OUT_A); OnFwd(OUT_C); 
             Wait(50);
             Off(OUT_A+OUT_C);
           }


6. A második változat

Ez tulajdonképpen már a három fényérzékelõs változat, amit úgy oldottunk meg, hogy a középsõ érzékelõre (B) két eszközt tettünk (fény- és ütközésérzékelõt). A program kezdeti mintavételezéssel indul.

A robot az olyan helyzeteket detektálja útként, amikor teljesül, hogy a középsõ fényérzékelõje fehér csíkon van, a szélsõ kettõ pedig nem. Kezdetben a program feltételezi ezt az állapotot. Ez azt jelenti, hogy amennyiben a bal érzékelõ is utat érzékel, a robotnak balra kell fordulnia, illetve, ha a jobb érzékelõ is útra téved, akkor jobbra fordulással próbálja visszaállítani az alapállapotot. A robot leállásának a feltétele is változott, miszerint a kocsi addig mûködik, amíg akadályba nem ütközik, vagy 3 mp. elõrehaladás után sem érzékel utat. Abban a szélsõséges esetben, amikor a két külsõ érzékelõ utat érzékel, viszont a középsõ nem, a robot hátratolat, amig ez az állapot meg nem szûnik.

A feladatot megvalósító programkódrészlet:

task main()
        {
        inicializáló rész
           while(END && (no_road==FALSE || (no_road==TRUE &&    
           Timer(1)<30))) 
              {
                 if(!LEFT && !RIGHT && !CENTER) 
                    {
                    go_forward(); 
                    }

                 if(LEFT && !RIGHT && !CENTER)
                    {
                    turn_left();
                       panic=FALSE;
                       panicleft=TRUE;


           while(LEFT && END && (panic==FALSE || (panic==TRUE && panicleft==FALSE)))
              {
                 if(RIGHT && panic==FALSE)
                    {
                       SetPower(OUT_A, TURN_SPEED);
                       SetPower(OUT_C, INIT_SPEED);
                       OnFwd(OUT_A);OnFwd(OUT_C);
                       panic=TRUE;
                    }
 
               }
               ...
          }
A dõlt betûvel jelölt kódrészlet általunk megvalósított függvényeket, eljárásokat, illetve inicializációs részt tartalmaz.