"interne Landkarte" für Roboterfahrzeug

Du hast eine Idee für ein Projekt?
Antworten
Unforgiven11
User
Beiträge: 7
Registriert: Donnerstag 10. September 2015, 18:34

Hallo,

ich bin noch ziemlicher Python-Anfänger und probiere gerade mit Python3 auf einem Lego-Roboter mit dem Betriebssystem ev3dev herum.
Einfache Aufgaben bekomme ich damit schon recht gut hin.

Ich habe einen fahrbaren Roboter gebaut, der über einen Ultraschallsensor verfügt, mit dem Entfernungen gemessen werden können. Ich kann also zum Beispiel programmieren, dass bei einem erkannten Hindernis die Fahrt verlangsamt oder gestoppt und dann in eine andere Richtung fortgesetzt wird. Im Moment ist es also noch so, dass der Roboter "wild" durch den Raum fährt und erkannten Hindernissen ausweicht.

Die nächste Stufe ist jetzt meines Erachtens, erkannte Hindernisse irgendwie zu speichern und so im weitesten Sinne eine "Karte" des Raums, in dem der Roboter sich bewegt, zu erstellen.

Nur habe ich überhaupt keine Idee, wie ich das anfangen soll. Wahrscheinlich brauche ich ein Raster oder ein Koordinatensystem, um Außengrenzen des Raumes und Hindernisse zu verorten. Aber wie packt man das in Python am besten an?

Hat jemand Erfahrung mit dieser Problemstellung oder sogar eine konkrete Lösung dafür?
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Die wohl simpelste Lösung wäre ein Array. Kommt darauf an wie groß die verwaltete Fläche ist und wie genau sie vermessen werden muss. Nehmen wir an, du hast 3*4 m zu verwalten du teilst das auf in 5*5 cm Einheiten. Somit hättest du 60*80 Felder. Jedes Feld kann nur den Wert False oder True haben. Die maximale Ungenauigkeit beträgt Wurzel aus(5²+5²), also ungefähr 7 cm.

Oder doch vielleicht GPS? :wink:
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Als erstes solltest du klären wie gut du deine Position bestimmen kannst, wenn das nicht klappt und du nur einen 1D Tiefensensor hast wird es wohl unmöglich sein.

Wie genau ist deine Odometrie? Haben die Motoren ein Getriebe? Hat das beim Richtungswechsel Spiel?
BlackJack

@Sr4l: Braucht man denn eine Positionsbestimmung? Ich wäre ja davon ausgegangen dass es die nicht gibt. Man sollte doch aber trotzdem mit einem Abstandssensor kartographieren können. Die Qualität dürfte vom Sensor und der Möglichkeit die eigenen Bewegungen zu erfassen abhängen.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

BlackJack hat geschrieben:@Sr4l: Braucht man denn eine Positionsbestimmung? Ich wäre ja davon ausgegangen dass es die nicht gibt. Man sollte doch aber trotzdem mit einem Abstandssensor kartographieren können. Die Qualität dürfte vom Sensor und der Möglichkeit die eigenen Bewegungen zu erfassen abhängen.
"Bewegung erfassen" ist für mich gleich Positionsbestimmung. Wo ich starte, ist x=0, y=0 und ab da summiere ich meine Bewegungen zur Position auf. Ohne die Info wird es solange man keine Laserscaner oder Kinect mit vielen Messpunkten hat nicht gehen.
Unforgiven11
User
Beiträge: 7
Registriert: Donnerstag 10. September 2015, 18:34

Hallo und Danke für die Antworten,

ich muss echt versuchen mir mehr Zeit für dieses Projekt frei zu schaufeln :shock:

Der Roboter, den ich verwenden will, ist ein Raupenfahrzeug mit Servomotoren, von denen man auch die Motorumdrehungen auslesen kann. Und damit dann auch die zurückgelegte Strecke. Die Genauigkeit kann ich nicht genau beurteilen, sollte aber für mein Vorhaben ausreichend sein.
Außerdem verwendet der Roboter auch noch einen Gyrosensor, mit dem ich dessen Rotation um die eigene Hochachse bestimmen kann, sowie den schon erwähnten Ultraschallsensor.

Mir ging es bei meiner Frage erstmal darum, wie ich die Positionen von erkannten Objekten bzw. freien Flächen "abspeichere". Das von hans erwähnte Array ist wahrscheinlich dafür die richtige Option.

Den Anfang des Programms stelle ich mir dann etwa so vor:

Roboter steht an beliebigem Punkt im Raum
Messung der Entfernung bis zum nächtsten Hindernis
Drehung um 90 Grad
Messung der Entfernung bis zum nächtsten Hindernis
Drehung um 90 Grad
Messung der Entfernung bis zum nächtsten Hindernis
Drehung um 90 Grad
Messung der Entfernung bis zum nächtsten Hindernis
Drehung um 90 Grad

Damit habe ich dann erstmal Entfernungs-Messwerte in vier Hauptrichtungen vom Startpunkt aus.

Wie lege ich diese Werte jetzt am besten ab? Kann das jemand in python-Code skizzieren?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur eine kurze Zwischenbemerkung: Gyros driften. Sehr. Dass sie in Smartphones und anderen Anwendungen halbwegs funktionieren liegt an zwei Dingen: Drehungen um alle anderen *als* der Hochachse werden mit Beschleunigungssensoren "fusioniert" - sprich: fuer schnelle Bewegungen wird das Gyro herangezogen, aber mit der Zeit driftet das weg, und darum rechnet man ein bisschen die Richtung der Erdachse ein - weil man davon ausgehen kann, dass der Sensor nicht die ganze Zeit irgendwie wild beschleunigt wird.

Eine zweite Information ist die eines magnetischen Kompass - das sind dann die 9-DOF-Sensoren. Der Kompass ist aber ziemlich traege und mau, wie jeder weiss, der schon mal den seines Smartphones ausprobiert hat...

Langer Rede, kurzer Sinn: die Vorstellung, der Gyro wuerde dir viel helfen, ist leider naiv. Wird er nicht. Und da du eine Raupe verwendest, hast du auch da so manche Fehlerquelle (mehr als bei Raedern zumindest).

Das Thema heisst SLAM - self-localization-and-mapping. Spannend, aber auch ziemlich aufwaendig. Kannst ja mal nach Tutorials googeln. Ich wuerde fuer den Anfang eher vorschlagen, eine definierte Welt zu haben, die du also vorher skizziert hast. Und dann mit gewonnenen Sensordaten darin eine Position bestimmst.

Und wenn du kannst, montiere den Ultraschallsensor auf seinen eigenen Motor, um ihn so schwenkbar wie moeglich zu machen - dann hast du eine praezise Ausrichtung, und kannst einen "Sweep" machen, der zB in verschiedene Liniensegmente zerfaellt, die du dann wiederum in der Karte finden kannst.
BigMike1968
User
Beiträge: 1
Registriert: Dienstag 25. Juli 2023, 19:03

Hallo Zusammen

Dieses Thema interessiert mich auch.

Ich möchte mir einen Arduino/Raspberry Robotor bauen mit ToF/Lidar Sensor.

Ich überlege auch gerade in welcher Datenstruktur (sollte 3D Daten können) ich sie speichern soll zur dann weiteren Verarbeitung.

ToF liefert mir ein 2D Bild mit Abstand zum Roboter/Sensor pro Pixel. So habe ich es verstanden. Damit hätte ich quasi Polar-koordinaten. Dann ein Stück weiterfahren und wieder ein 2d Bild bekommen. Etc

Ich hab gerade keine Idee welche Datenstruktur soll ich nehmen.

Hat jemand eine Idee und/ oder Erfahrung?

Danke &Gruss
Michael
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich würde das off-the-shelf von ROS und dessen SLAM Algorithmen nehmen. Außer du willst dieses spannende Rad neu erfinden. Dann würde ich ein paper zu den Algorithmen lesen, und davon abhängig machen, was ich für eine Datenstruktur wähle.
Antworten