Auf einem Gitter navigieren
Erkennen von Kreuzungen
Notwendige Datentypen
// Aufzählungstyp für die Ausrichtung des Roboters
enum Headings {
NORTH,
WEST,
SOUTH,
EAST
};
Headings botHeading = NORTH; // Startorientierung
// Structure mit Arduino: https://www.circuitxcode.com/using-arduino-struct/
// Structure für die Position
struct Position
{
int x, y;
};
Position goal = {4, 5}; // mögliche Zielposition
// Structure zum Beschreiben der möglichen Fahrichtungen an einer Kreuzung
struct IntersectionTyp
{
bool left;
bool right;
bool straight;
};
Methoden zum Erkennen der Kreuzung
// Gibt <true> zurück, wenn der Sensor eine Linie sieht.
// `readCalibrated()` muss vorher aufgerufen worden sein.
bool aboveLine(byte sensorIndex) {
return lineSensorValues[sensorIndex] > lineThreshold;
}
// Erkennt Abzweigung oder Kreuzungen und gibt einen Struct zurück, der angibt in welcher Richtung ein Weg weitergeht.
// Wird aufgerufen, sobald einer der seitlichen Bodensensoren aktiviert wird.
struct IntersectionTyp getIntersection() {
IntersectionTyp interTyp = {0, 0, 0}; // Struct initialisieren
// Es wurde bereits erkannt, dass eine Abzweigung/Kreuzung da ist. Nun müssen die möglichen
// Wegrichtungen ermittelt werden.
driveDistanceMM(SPEED, DISTANCE_LINE_MM); // auf Kreuzung fahren und nach Abzweigung prüfen
lineSensors.readCalibrated(lineSensorValues); // Sensorwerte lesen
if (aboveLine(0)) interTyp.left = 1; // Abzweigung nach links erkannt
if (aboveLine(4)) interTyp.right = 1; // Abzweigung nach rechts erkannt
// weiter fahren, bis der Mittelpunkt des Zumo genau über der Linie ist und prüfen, ob es geradeaus weiter geht.
driveDistanceMM(SPEED, DISTANCE_AFTER_LINE_MM);
lineSensors.readCalibrated(lineSensorValues); // Sensorwerte lesen
if (aboveLine(2)) interTyp.straight = 1; // Abzweigung nach vorne erkannt
return interTyp;
}