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.
Rješenje
void RobotSoccer::loop() {
if (setup())
headingToMaintain = heading();
go(40, 0, pidRotation->calculate(heading() - headingToMaintain));
}
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.