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

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.