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

Najbliži zid

Cilj

Pronaći najbliži zid.

Inicijalizacija

Direction RobotMaze:: wallClosest() {
	Direction closest = NOWHERE; // If no wall found, this will be the result.
	uint16_t leastDistance = 0xFFFF; // Set variable to a huge number so that any distance reading will override it.
	for (uint8_t i = 0; i < 4; i++) { // Iterate all the 4 directions.
		Direction dir = (Direction)i; // Cast integer to Direction.
		...
	}
	...
}
Varijable "closest" je smjer i na početku postavimo da ne sadrži nikakav.

"leastDistance" postavimo na neki jako velik broj, koji se sigurno neće pojaviti u mjerenju udaljenosti.

Nakon toga "for" ide po sva 4 smjera.

Ideja je mjeriti svaki i postaviti "leastDistance" na manju vrijednost, ako je pronađena.

2 udaljenosti za svaki smjer

Direction RobotMaze:: wallClosest() {
	...
	for (uint8_t i = 0; i < 4; i++) { // Iterate all the 4 directions.
		Direction dir = (Direction)i; // Cast integer to Direction.
		uint16_t d0 = distance(dir, false); // Take measurements of the both sensors in a chosen direction dir.
		uint16_t d1 = distance(dir, true);
		...
	}
	...
}
"d0" i "d1" su udaljenosti u trenutnom smjeru ("dir").

Dobivamo ih iz funkcije "distance()", tako da je prvi argument smjer, a drugi "true" ili "false".

Usporedba

Direction RobotMaze:: wallClosest() {
	...
	for (uint8_t i = 0; i < 4; i++) { // Iterate all the 4 directions.
		...
		//If both of the distances read walls and their difference is not too big, we conclude that there is a wall in this direction.
		if (d0 < NO_WALL_DISTANCE && d1 < NO_WALL_DISTANCE && abs(d0 - d1) < WALL_FOLLOW_ERROR_ALLOWED) {
			if (d0 < d1) // Find the smaller of 2 values.
				d0 = d1;
			if (d0 < leastDistance) { // If it small enough, change the running minimum.
				leastDistance = d0;
				closest = dir; // Remember the direction of the new minimum.
			}
		}
	}
	...
}
Da bi u danom smjeru bio zid, nužno je da su obadvije udaljenosti male.

Nakon toga u "d0" spremimo manju od 2 udaljenosti.

Ako je ta manja od dosad najmanje, dosad najmanja postaje "d0".

Također pamtimo smjer u kojem je ta najmanja udaljenost.

Direction RobotMaze:: wallClosest() {
	...
	return closest;
}
Na kraju vratimo iz funkcije smjer najbližeg zida.

Ako u "for"u nije nađen nijedan zid, vraća se prazan smjer.

Zadatak: crtanje

Iscrtajte na 8x8 displeju najbliži zid.

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.