Najbliži zid
Cilj
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.