Koordinatni sustavi
Cilj
Uočiti potrebu i prijelaze između 2 koordinatna sustava.
Potreba
enum Direction{UP, LEFT, DOWN, RIGHT, NOWHERE};
Ovako izgleda enumeracija za smjerove.
S jedne je strane logično da su to smjerovi u odnosu na robota. Npr., ako gledamo desni senzor udaljenosti, on je po definiciji desno od robota.
S druge je strane logično imati smjerove u odnosu na labirint. Kad opisujemo kako doći do nekog polja, opisivat ćemo to s naše pozicije, van labirinta. Desno će biti desno u odnosu na labirint, ne na robota.
U biti trebamo imati 2 koordinatna sustava.
Zidovi
...
WallStatus wallGet(Direction direction) { return (WallStatus)((_wall >>
(direction * 2)) & 0b11); }
...
void wallSet(Direction direction, WallStatus wallStatus) { _wall &=
~(0b11 << (direction * 2)); _wall |= (wallStatus << (direction * 2)); }
...
};
Ovdje su 2 funkcije za rad sa zidovima.
"wallGet()" će vratiti status zida u željenom smjeru (lijevo, desno,...).
"wallSet()" će postaviti status zida u danom smjeru u željeni.
Očito da smo ovdje u koordinatnom sustavu labirinta. To je prirodno, jer želimo da "dolje" uvijek znači zid dolje, ne da ovisi o tome kako je okrenut robot.
Način na koji one iz bitova u varijabli "_wall" pronalaze statuse zidova i postavljaju ih je mala vježba u baratanju s bitovima koju nećemo objašnjavati jer nije jednostavna.
Udaljenost
...
uint16_t distance(Direction direction, bool firstCCW) {return
mrm_lid_can_b->reading(0, 2 * mToR(direction) + firstCCW); }
...
};
U kojem je koordinatnom sustavu "direction"?
Iako na prvi pogled izgleda nelogično, u sustavu labirinta, ne u robotovom.
Pretpostavimo da robot gleda prema dolje (zamišljeno "dno" labirinta, stranica najbliža nama prilikom starta). Na koju stranu robota mjerimo, ako je "direction" "LEFT"?
Ne na lijevu! To je lijevo u sustavu labirinta, lijevi zid pločice na kojoj je.
Kako robot gleda prema dolje, to je desna strana robota. Mjerimo udaljenost od desnog boka robota.
Konverzija
...
Direction mToR(Direction directionAsSeenInMaze) { int8_t d = directionAsSeenInMaze -
directionCurrent; return (Direction) (d < 0 ? d + 4 : d); }
...
Direction rToM(Direction directionAsSeenByRobot) { return (Direction)(directionCurrent +
directionAsSeenByRobot % 4); }
---
Ako trebamo preračunati iz jednog sustava u drugi, na raspolanju su nam ove 2 funkcije.
"mToR" znači "maze" to "robot".
"rToM" znači "robot" to "maze".
Zadatak: udaljenost
Probajte napraviti funkciju za udaljenost, koja kao argumet prima smjer u odnosu na robota, ne u odnosu na labirint.
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.