Nestepeničasto praćenje
Cilj
Učinimo povratnu spregu finijom.
Arena
Arena je ista kao i u prošloj vježbi.
Izbjeći stepenice
void RobotLine::loop() {
if (rightFront() > 100)
go(80, 20);
else
go(20, 80);
}
Program koji prati zid je još jednom prikazan lijevo. Omogućava praćenje zida, ali vrlo nemirno.
Robot se ne kreće po glatkoj liniji, koja bi trebala biti što bliža pravcu, nego po trzavoj, stepeničastoj liniji.
Koji je uzrok problemu?
Kad bismo imali sustav koji savršeno (trenutno i točno) popravlja grešku, kretanje bi bilo glatko.
Međutim, sustav korekcije ovisi o tromosti rotora motora, samog robota, o trenju i o drugim faktorima.
Ako je robot na 120 mm od zida, on se neće vratiti na 100, nego npr. 80 mm, jer će mu trebati dosta vremena za ispravak greške.
Nakon 80 mm će se opet vratiti na 120 mm - evo otprilike stepeničastog gibanja.
Kako doskočiti problemu?
Korekciju greške treba učiniti proporcionalnom; kad je robot jako daleko od idealne udaljenosti, treba skretati jako. Kad je greška mala, skretanje također treba biti slabo.
U gornjem programu to nije slučaj. Npr. ako je robot na 101 mm od zida, on će i dalje skretati maksimalnom snagom prema zidu. Kad dođe na 100 mm, bit će jako okrenut prema zidu i jasno da neće moći trenutno ispraviti poziciju, nego će se nastaviti kretati prema zidu.
Popravljeni program
void RobotLine::loop() {
int error = (rightFront() - 100) * 0.5;
error = constrain(error, -50, 50);
go(50 + error, 50 - error);
}
Program uvodi novu varijablu "error", koja mjeri grešku: razliku udaljenosti i idealne udaljenosti (100). Faktor 0.5, koji regulira snagu povratne sprege, se može mijenjati.
Red s funkcijom
constrain je opcijalan. Ova funkcija ograničava vrijednost prvog parametra ("error") na vrijednosti između 2. i 3. (-50 i 50). Na taj način sprečavamo da vrijednosti greške ne poraste previše.
Zadnji red je ključan. Ostvaruje proporcionalnu povratnu spregu jer korigira smjer kretanja robota proporcionalno izmjerenoj grešci.
Proučite ovu liniju za pozitivnu i negativnu grešku. Uočite da radi za oba slučaja.
Video
Kratki video pokazuje robota koji izvršava gornji program.
Zadatak: brže.
Promijenite gornji program na način da se robot kreće najvećom mogućom brzinom (bar jedna strana brzinom 127).
Rješenje
void RobotLine::loop() {
int error = (rightFront() - 100) * 0.5;
go(constrain(127 + error, -128, 127), constrain(127 - error, -128, 127));
}
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.