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

Održavanje smjera

Cilj

Želimo da robot uvijek gleda u smjeru u kojem je gledao kod uključivanja. Na taj način robot cijelo vrijeme "zna" u kojem je smjeru njegov, a u kojem protivnički gol. Za ovo će nam poslužiti kompas i to na način da na početku zapamtimo smjer u kojem se gleda robot kako bismo ga kasnije uvijek mogli okrenuti u istom smjeru.

Program

void RobotSoccer::loop() {
	if (setup())
		headingToMaintain = heading();
	go(0, 0, pidRotation->calculate(heading() - 
		headingToMaintain));
}
Prve 2 linije programa su uobičajeni način pokretanja jedne naredbe ("headingToMaintain...") samo jednom. U ovom slučaju postavljamo vrijednost varijable "headingToMaintain" na trenutni položaj (rotacija oko vertikalne osi), koju daje funkcija "heading()" (kompas).

"headingToMaintain" je već deklarirana varijabla i općenito služi za spremanje početne orijentacije robota.

Ključna je funkcija go(). Zasad preskočimo prva dva argumenta, koji su 0, i pogledajmo treći. Definira brzinu rotacija oko vertikalne osi i prima vrijednosti od -100 do 100. Nemojte nikad koristiti tako velike brojeve jer će se robot okretati jako brzo i bit će ga gotovo nemoguće zaustaviti rukom.

Cilj je održavati konstantni smjer rotacije robota. Zato brzina rotacije mora korigirati greške i vraćati robota u početni smjer - znači treba nam povratna sprega.
void RobotSoccer::loop() {
	if (setup())
		headingToMaintain = heading();
	go(0, 0, heading() - headingToMaintain);
}
Pogledajmo alternativu gornjem programu. Pojednostavnili smo brzinu rotacije i sad je samo razlika trenutnog smjera i željenog smjera (greška).

Ovo bi rješenje također vraćalo robota u prvobitni smjer, ali ne bi uzimalo u obzir brzinu korekcije greške. Ako vas više zanima o tom problemu, pogledajte na internetu pojam "PID controller".
RobotSoccer::RobotSoccer(char name[]) : Robot(name) {
	...
	pidRotation = new Mrm_pid(2.0, 100, 0); 
		// PID controller, regulates rotation 
		around z axis
	...
}
Vratimo se na "pidRotation->calculate()" funkciju koju smo izbacili u posljednjem primjeru. Njena je definicija u "mrm-robot-soccer.cpp" programu, blizu samog početka i prihvaća 3 argumenta.

U ovom času nećemo ulaziti u detalje njenog rada. Bitno je uočiti da možete mijenjati 2 argumenta i da će promjene bitno utjecati na kvalitetu održavanja smjera:
  • "2.0" je broj koji definira kako jako robot reagira na grešku u rotaciji. Veći broj će uvećati njegovu reakciju. Robot će se brže vraćati u pravi položaj. Pazite, prevelika brzina će dovesti da će prebaciti željeni položaj i vrlo lako dovesti do beskonačnog okretanja robota oko svoje vertikalne osi.
  • "100" je parametar koji označava kako će brzo robot reagirati na brzinu promjene greške. Znači, ne promjenu greške, nego brzinu promjene. Dok ne proučite pojam "PID controller" u Google-u, bolje ne dirajte ovaj broj.

Video

Kratki video pokazuje robota koji izvršava gornji program.

Zadatak: neka robot ide naprijed.

Proučite funkciju "go()", otkrijte koji parametar pokreće robota čelom naprijed i pokrenite ga brzinom 40.

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.