Das ist ein Applikationsrahmen, in den ich jeweils eine "World" und einen (oder mehrere) "Algorithmen" lade.
Eine World repräsentiert die Interaktion mit der Umwelt, führt also Fahrbefehle aus und gibt Sensorwerte an den Algorithmus weiter. Ein Algorithmus wertet die Sensorinformationen aus und generiert Fahrbefehle.
Die im Link gezeigte SimulationWorld beinhaltet eine (in schwarzen Linien gezeichnete) simulierte 2-D Umgebung bestehend aus einem Grundriss (Outer-Polygon) und einer Liste von einfachen geometischen Formen (Inner-Polygons), mit denen sich Sensorwerte und Kollisionen des Roboters simulieren lassen. Außerdem siehst Du als schwarzen Pacman den Roboter in der Pose, in der der Roboter sich nach seinen Odometriedaten befindet. Als blauen Pacman findest Du die Position, die vom Algorithmus ermittelt wurde. Letztendlich beschränkt sich ein Simulationszyklus auf die Aufgabe, die Pose des Roboters ein kleines Stück in Richtung des vom Algorithmus bestimmten Zielpunktes zu verändern und von dort aus einem Sensorwert zu generieren (also eine Strahl in vorgegebene Richtung abzuschicken und den nächsten Schnittpunkt mit der Umgebung finden). Messfehler in den Sensorwerten lassen sich über die Angabe von z.B. +/-5% durch Random-Variationen in den Strahlenlängen simulieren. Die fehlerhafte Odometrie lässt sich in Drehung und Strecke ähnlich mit Fehlern simulieren.
Der Algorithmus sammelt in diesem Beispiel die Sensorinformationen zu einem vollständigen Rundumscan, und versucht, die wirkliche Pose durch bestmögliches Einpassen des Scans in die bereits vorliegende Map (die Klötzchenfelder) zu bestimmen. Wenn er das nicht hinbekommt, sieht man in der grafischen Darstellung, wie die Map zerfasert.
Neben der SimulationWorld gibt's aber auch noch die RealWorld, die die reale Kommunikation mit der Roboterhardware (seriell über Bluetooth) darstellt und eine FileRecordWorld, mit der sich mitgeschnittene Daten aus der RealWorld offline sequentiell in den Algorithmus laden lassen.
Ich hab das vor urig langer Zeit mal mit VB6 angefangen und irgendwann auf C# transkribiert. Mittlerweile rennt es auch auf nem Raspberry unter Mono, wobei ich die Browser-Schnittstelle über NodeJS nach einem knappen Jahr immer noch nicht fertig habe (ich komm nicht mehr dazu).
Lesezeichen