Autonomes Fahrzeug mit 2D-Lidar
über
Von Clemens Valens (Elektor-Labor)
Lidar ist ein Akronym für Light Detection and Ranging. Lidar ist wie Radar, mit dem Unterschied, dass es Licht statt Radiowellen verwendet. Die Lichtquelle ist ein Laser. Ein Lidar sendet Lichtimpulse aus und misst die Zeit, die eine von einem entfernten Objekt abprallende Reflexion benötigt, um zum Gerät zurückzukehren. Da die Lichtgeschwindigkeit eine bekannte Konstante ist, kann die Entfernung zum Objekt anhand der Laufzeit des Lichtimpulses berechnet werden (Bild 1).
Zweidimensionales Lidar
Lidar kann wie etwa bei einem Laser-Entfernungsmesser eindimensional (1D) sein. Es kann auch zweidimensional (2D) sein, so wie die Radargeräte, die auf Schiffen und auf den Towers der Flughäfen eingesetzt werden. Es gibt auch 3D-Lidar, das zum Beispiel in Flugzeugen eingesetzt wird, um eine dreidimensionale Darstellungen der Erdoberfläche unter ihnen zu erstellen. Für dieses Projekt wird ein 2D-Lidar verwendet.
Im Grunde genommen ist ein 2D-Lidar nichts anderes als ein rotierendes 1D-Lidar. Anstatt den Laser und den Detektor zu drehen, ist es oft einfacher, das Licht auf einen rotierenden Spiegel zu werfen. Durch das Aussenden von Lichtimpulsen in regelmäßigen Abständen können 360° abgedeckt und eine Entfernungskarte erstellt werden, mit dem Lidar im Zentrum des Plots.
Dabei ist das Reflexionsvermögen von Objekten wichtig ist. Ein idealer schwarzer Körper kann von einem Lidar nicht gesehen werden, da er überhaupt kein Licht reflektiert.
Anschließen des Lidars
Für meine Experimente habe ich das Lidar X4 der Firma Ydlidar verwendet (Bild 2). Es hat eine maximale Reichweite von 10 m und eine Winkelauflösung von 0,5° (für Entfernungen bis 50 cm). Es verfügt über einen Infrarotlaser mit einer Wellenlänge von 785 nm. Bei diesem Gerät wird die Laser- und Detektoreinheit gedreht, ein Drehspiegel kommt nicht zum Einsatz.
Das X4-Lidar gibt Entfernungsdaten als kontinuierlichen seriellen Datenstrom mit 128.000 Baud aus. Über diese serielle Verbindung wird das Gerät auch gesteuert. Sie können mit einfachen Befehlen das Abtasten starten und stoppen, Sie können auch einige Informationen über das Gerät abfragen. Der Motor wird separat über zwei zusätzliche Verbindungen gesteuert, eine für Ein/Aus und eine für die Geschwindigkeit. Das bedeutet, dass dieses Lidar auch im eindimensionalen Modus arbeiten kann, wenn sich der Motor nicht dreht.
Ich habe den seriellen Port und die Motoranschlüsse an ein ESP32-Pico-Kit angeschlossen (Bild 3). Um Strom zu sparen, habe ich den Motor des Lidars nur mit seiner niedrigsten Drehzahl betrieben, die bei etwa 400 U/min liegt. Das Lidar zieht dann einen Strom von etwa 400 mA.
Parsing der Lidar-Daten
Zur Programmierung des ESP32-Pico-Kits habe ich die Arduino-IDE verwendet. Nachdem ich eine Funktion zum Parsen der Lidar-Daten geschrieben hatte, musste ich meine Interpretation der Daten auch überprüfen. Das X4-Entwicklungshandbuch stellt nicht sehr klar, wie dies zu bewerkstelligen wäre und gibt zwei Detailstufen an. Die zweite Stufe bietet eine bessere Winkelauflösung, erfordert aber viele Arkustangens-Berechnungen, die sehr rechenintensiv sind. Daher habe ich zunächst die einfache Interpretation ausprobiert.
In einem rechteckigen, geschlossenen Raum stellte ich das Lidar auf einen Tisch und ließ es eine Weile scannen. Danach ließ ich einen gemittelten 360°-Scan über eine serielle Schnittstelle als kommagetrennte Werte (CSV) ausgeben, die ich in Excel lud. Mit der Funktion Netzdiagramm konnte ich es anzeigen (Bild 4). Das Ergebnis sah meinem Rechteck sehr ähnlich, und auch die Entfernungen waren einigermaßen korrekt, so dass ich mir nicht die Mühe machte, die Qualität durch Arkustangensberechnungen zu verbessern.
Ein kleiner Roboter entsteht
Als nächsten Schritt baute ich einen einfachen ferngesteuerten Wagen, auf den ich das Lidar montierte. Der Wagen hat zwei angetriebene Räder in der Mitte und je einen Abstandshalter an beiden Enden. Auf diese Abstandshalter habe ich halbierte Tischtennisbälle geklebt, um das Gleitverhalten zu verbessern. Als Bodenblech (und gleichzeitig Chassis) dient eine Platte aus doppelseitig beschichtetem FR4-Platinenmaterial. Die Räder mit den Motoren, die Motortreiberplatine und die Stromversorgung, ein 11,1-V-Li-Po-Akku des Typs 3S, sind auf der Unterseite montiert (Bild 5), das ESP32-Modul und das Lidar auf der Oberseite (Bild 6).
Die Platine ist mit Masse verbunden und schirmt so das ESP32-Modul von den „lauten“ Motoren ab. Der Mittelpunkt des Lidars befindet sich in der Mitte der Montageplatte. Auch die Radachse befindet sich in der Mitte. Dieses einfache Auto kann sich drehen und ist ziemlich wendig und manövrierfähig.
Fernsteuerung über Bluetooth hinzufügen
Als Fernsteuerung habe ich die kostenlose und quelloffene Dabble-Bibliothek verwendet, die eine Bluetooth-Steuerung für den ESP32 und Arduino mit einer Smartphone-App mit mehreren Bedienoberflächen verbindet (Bild 7). Eine davon ist ein Gamepad, das meiner Anwendung wie angegossen passte. Es ist wirklich einfach zu bedienen und ermöglichte die Steuerung des Wagens mit meinem Handy.
Ein Wegfindungsalgorithmus
Mein Ziel war es, den Wagen so zu programmieren, dass er ganz von selbst herumfährt, ohne gegen Objekte wie Möbel oder andere Gegenstände zu stoßen. Ein beliebter Ansatz ist es, den Wagen herumlaufen zu lassen und zurückzufahren oder wegzulenken, wenn er einem Objekt zu nahe kommt, aber das erfordert, dass der Wagen Entscheidungen trifft. Ich wollte etwas Einfacheres. Es gibt viele Beispiele für einfache Algorithmen, die zu komplexem Verhalten führen, zum Beispiel die Art und Weise, wie ein Vogelschwarm zusammenbleibt, und so etwas wollte ich auch.
Meine Idee war, den Wagen immer in die Richtung des größtmöglichen Abstands zu einem Objekt fahren zu lassen, die das Lidar ermittelt. Um zu vermeiden, dass er sich im Kreis dreht, schaut er nur nach vorne, in einem Bereich von -90° bis +90°. Die Umsetzung dieser Regel war recht einfach. Für jeden Scan wird eine Tabelle mit der durchschnittlichen Entfernung für jedes einzelne Winkelgrad aktualisiert. Die Tabelle hat also 360 Einträge. Diese Tabelle wird dann in 10-Grad-Segmente unterteilt (was ziemlich willkürlich ist) und ermittelt, welches dieser Segmente den höchsten gemittelten Abstand aufweist. Die Mitte dieses Segments ist die Richtung, die der Wagen einschlagen soll. Um dies zu erreichen, dreht sich der Wagen so, dass der mittlere Winkelgrad, also die Richtung, zu 0° wird. Wir haben nun einen klassischen Steuerungsalgorithmus, der versucht, einen „Fehler“ zu minimieren (Bild 8).
Erster Testlauf
Zu meiner großen Überraschung gelang es dem Wagen schon bei seinem ersten Probelauf mit diesem einfachen Algorithmus, sich sicher durch unser Wohnzimmer zu bewegen, ohne gegen Hindernisse zu stoßen (Bild 9). Er umrundete unsere Couch und fuhr ohne Schwierigkeiten durch enge Passagen. Der Wagen hatte keinerlei Kenntnisse über seine Umgebung oder sich selbst, etwa seine eigenen Abmessungen. Ich hatte auch nicht versucht, irgendetwas zu optimieren. Alle Parameter wie Vorwärts- und Drehgeschwindigkeit und Suchwinkel wurden einfach auf Werte eingestellt, die ich für vernünftig hielt.
Die Bluetooth-Fernbedienung hat sich als sehr praktisch erwiesen, um den Wagen zu „verwirren“ oder ihm aus schwierigen Situationen herauszuhelfen. Außerdem kann man mit ihr die Parameter während der Fahrt ändern.
Da ich mich nicht so sehr für die Optimierung interessiere, sondern eher für die Erprobung von Konzepten, habe ich an dieser Stelle aufgehört. Wenn Sie es selbst ausprobieren möchten, finden Sie im Kasten die Links zum Code. Es gibt viele Möglichkeiten, diesen Entwurf zu verbessern, und es ist noch ein weiter Weg bis zu einem autonomen Staubsauger oder Rasenmäher, aber die erzielten Ergebnisse sind sehr ermutigend. Die Software für dieses Projekt, ein Arduino-Sketch für den ESP32, kann hier heruntergeladen werden. Ein Video ist verfügbar mit ein kleiner Bonus.
(210399-02)
Ein Beitrag von
Idee, Design, Text und Fotografien: Clemens Valens
Redaktion: Jens Nickel und C. J. Abate
Übersetzung: Rolf Gerstendorf
Haben Sie Fragen oder Kommentare?
Haben Sie technische Fragen oder Kommentare zu diesem Artikel? Schicken Sie eine E-Mail an den Autor unter clemens.valens@elektor.com oder kontaktieren Sie Elektor unter redaktion@elektor.de.
Components
Diskussion (0 Kommentare)