Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

Tok programa

Cilj

Definirati tok programa.

Program

...
void RobotSoccer::catchBall() {
	...
}
...
void RobotSoccer::idle() {
	...
}
Nazovimo izvršenje zadatka postavljenog robotu "akcijom". Primjeri akcija su:
  • vrati se pred gol
  • uhvati loptu
  • gurni loptu u protivnički gol.
Uobičajena implementacija (način na koji pišemo kod) akcije će biti funkcija. Na taj način ćemo moći pozvati izvršenje akcije Bluetooth terminalom.

To već znamo: tipkajući "loo", pokrenut ćemo funkciju "loop()", odnosno kod u njoj. Znači, možemo pokrenuti akciju telefonom, ali to nije dovoljno. Moramo imati način pokrenuti ju u kodu.

...
void RobotSoccer::idle() {
	...
	catchBall();
	...
}
...
void RobotSoccer::catchBall() {
	...
	idle();
	...
Pretpostavimo još da ste promijenili sadržaj navedene 2 funkcije, tako da čine što njihova imena nagovještavaju: "catchBall()" će pokušati uhvatiti loptu, idle() će vratiti nogometaša pred vlastiti gol, zato što više ne vidi loptu.

Sad natrag na naš problem: kako načiniti cijeli program u kojem će se ove funkcije izvršavati naizmjence? Prva naivna, ideja bi mogao biti program lijevo.

Dakle, u procesu povratka pred vlastiti gol, ako nogometaš ugleda loptu, treba pokrenuti funkciju "catchBall()". Ovo će raditi.

Kasnije, tokom izvrašanja "catchBall()", robot izgubi loptu pa ćemo pozvati funkciju "idle()". Do ovog časa je sve bilo u redu., ali uočite prikriveni problem: ukopavate se sve dublje u ugnježđene pozive funkcija. Možda ne razumijete bit problema, ali trebate prihvatiti da je ovo loše i da se nećete moći vratiti u program na mjesto s kojeg ste krenuli. Ne možete kombinirati akcije na ovaj način.

...
void RobotSoccer::idle() {
	...
	actionSet(actionCatchBall);
	...
}
...
void RobotSoccer::catchBall() {
	...
	actionSet(actionIdle);
	...
}
Napravimo sad točan program.

Pojavila se nova naredba. Dosad smo koristili "end()" za okončane trenutne akcije (odnosno funkcije). Naredba "actionSet()", koju uvodimo ovdje, ne završava program, nego mijenja trenutnu akciju u drugu. U slučaju lijevo, naredba
actionSet(actionCatchBall);
ne završava program, nego mijenja pokreće akciju "actionCatchaBall", koja pokreće svoju funkciju "catchBall()". Rezultat je prebacivanje izvršavanja programa iz "idle()" u "catchBall()". Možemo bez problam skočiti natrag:
"actionSet(actionIdle);"
Izvršavanje programa će se nastaviti. Bilo koja akcija može imat svoju kraticu u meniju. "actionCatchBall" ju ima: "cat". Možete pokrenuti akciju utipkavanje "cat" u svoj mobitel.

Zadatak: proučite kod.

Otvorite datoteke mrm-robot-soccer.cpp i mrm-robot-soccer.h. Proučite kako je sve implementirano u kodu.

Primjedbe



Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a". Relevantne stranice: Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.