LDS-006 Lidar Sensor Reverse Engineering

Durch Zufall habe ich bei aliexpress.com sehr günstige Lidar Sensoren gefunden und einfach mal 3 Stück bestellt.

Die 3 Lidar Sensoren haben incl. Versand und Steuern gerade mal 44.67€ gekostet. In der Artikelbeschreibung unter https://de.aliexpress.com/item/1005003005112685.html sind nur sehr wenig Info zur Verwendung enthalten. So stehen hier z.B. die Maße, die Versorgungsspannung (5V) und dass der Sensor über eine RX/TX UART Schnittstelle verfügt. Viel mehr wird hier nicht über den Lidar Sensor verraten. Ein wichtiger Hinweis der Produktbeschreibung ist auch:

Nicht wissen, wie man es, wenn sie geist, bitte nicht kaufen es, danke!

Was schon darauf hindeutet, dass es keine offizielle Spezifikation gibt, aber das hat mich nicht abgehalten :-).

In den Kundenbemerkungen habe ich noch folgenden Hinweis gefunden, der mir sehr weitergeholfen hat.

Nachdem die LDS-006 Lidar Sensoren bei mir angekommen sind habe ich erst mal einen auseinandergenommen und mir die einzelnen Teile genauer angesehen.

Der Lidar Sensor lässt sich gut zerlegen und wieder zusammensetzen. Als Mikrocontroller kommt ein GD32F130xx ARM Cortex® M3 32-bit Chip zum Einsatz. Der Motor wird über PWM geregelt und auf einer (einigermaßen) konstanten Geschwindigkeit gehalten. Die Kommunikation zwischen dem Main-Board und der Laser-Einheit erfolgt per Infrarot Kommunikation (wobei die Laser Einheit nur einen Sender hat und keine Steuerdaten empfangen kann). Die Stromversorgung der Laser Einheit erfolgt über einen Transformator bei dem die Eine Spule auf dem Main Board und die andere spule des Transformators drehend auf der Lasereinheit sitzt. Diese Art der Energieversorgung und Datenkommunikation hat sehr gute Eigenschaften in Bezug auf den Verscheiß, da keine Schleifkontakt oder ähnliches zum Einsatz kommen, die irgendwann dreckig oder abgenutzt sind.

Auf dem Aufkleber konnte man noch erkennen, dass die LDS-006 Sensoren wohl von Ecovacs Robotics Co. Ltd. gebaut werden und vermutlich in deren Staubsauger-Robotern zum Einsatz kommen.

Um den LDS-006 leichter mit dem Breadboard nutzen zu können habe ich erst mal den Stecker ausgetauscht und einen Male-Heder angelötet.

Rot = 5V
Schwarz = GND
Grün = UART RX (3,3V)
Blau = UART TX (3,3V)

Für einen ersten Test habe ich den Lidar Sensor einfach mit einem FT232RL USB zu TTL Serial Adapter an dem Computer angeschlossen und mal den „startlds$“ Befehl gesendet.

LDS-006 5V VCC über eine Powerbank mit Strom versorgt

Sofort fängt der LDS-006 Lidar Sensor an sich zu drehen und sendet Daten, die ich aber ohne weitere Infos nicht interpretieren kann 🙁

Zum Glück habe ich Jemanden bei Twitter gefunden, der sich auch schon mal mit dem Lidar Sensor beschäftigt hat. Durch einen Hinweis von @firtel bin ich dann auf folgendes Github Repository aufmerksam geworden.

https://github.com/Aluminum-z/Laser-Radar-LDS-006-Drive-Test

Dank Google Translate konnte ich dann folgende Informationen zur Datenstruktur aus dem Repository erhalten:

Es gibt 2 unterschiedliche Datenstrukturen. Datenstruktur 1 wird nach dem Start gesendet und Datenstruktur 2 bei der normalen Lidar-Rotation.

Die Rückgabedatenstruktur beim Start (Datenstruktur 1):

ByteWertBeschreibung
0x000x5ADatenheader
0x010xA5Datenheader
0x02Abstand high-byte
0x03Abstand low-byte

Datenstruktur nach Radarrotation (Datenstruktur 2):

ByteWertBeschreibung
0x000xFAHeader des Datenrahmens
0x010xFB, 0xA0 ~ 0xF9Datenrahmennummer
– 0xFB: Geschwindigkeitsfehler
– 0xA0 ~ 0xF9: Winkel
0x02Drehzahl low-byte
0x03Drehzahl high-byte
0x04#0 Abstand-1 low-byte
0x05#0 Abstand high-byte
0x06#0 Reflexionsgrad low-byte
0x07#0 Reflexionsgrad high-byte
0x08#1 Abstand low-byte
0x09#1 Entfernung high-byte
0x0A#1 Reflexionsgrad low-byte
0x0B#1Reflexionsvermögen high-byte
0x0C#2 Abstand low-byte
0x0D#2 Abstand high-byte
0x0E#2 Reflexionsgrad low-byte
0x0F#2 Reflexionsvermögen high-byte
0x10#3 Abstand low-byte
0x11#3 Entfernung high-byte
0x12#3 Reflexionsgrad low-byte
0x13#3 Reflexionsgrad high-byte
0x14Prüfsumme low-byte
0x15Prüfsumme high-byte

Jeder Rahmen von Radardaten beginnt mit 0xFA.
Das zweite Byte stellt den Winkel dar, die Winkeldaten minus 0xA0 und multipliziert mit 4 ist der Winkel, der dem aktuellen Frame entspricht, die Einheit ist °.
Das dritte und vierte Byte sind die Geschwindigkeit. Die Lidar-Date werden nicht zurückgegeben, wenn die Geschwindigkeit zu hoch oder zu niedrig ist.
Danach folgen 4 Radardaten, wobei jede Radardaten Entfernungsdaten in Millimetern und Reflexionsdaten in einer unbekannten Einheit enthält.
Die endgültige Prüfsumme ist die arithmetische Summe aller Bytes im Rahmen mit Ausnahme der Prüfziffer.

Diese Informationen sind schon ausreichend, um ein einfaches Python Programm zu schreiben, mit dem die Daten aus dem Lidar Sensor verarbeitet und visualisiert werden können.

https://github.com/msoftware/LDS-006-Lidar-Sensor-Reverse-Engineering

Die Beiden Programme start.py und stop.py dienen dazu, den Lidar Sensor zu starten und wieder zu stoppen, da er nicht aufhört Daten zu senden, ohne dass man ihm das Kommando „stoplds$“ sendet.

In dem folgenden kleinen Beispiel-Video kann man schön erkennen, wie der Lidar Sensor seine Umgebung wahrnimmt.

Die Visualisierung der Daten erfolgt mit Hilfe von OpenCV.

Im Programmcode werden für alle 360° die Entfernungen in mm gemessen und dann daraus eine 512×512 Pixel Grafik erstellt, die dann in dem Fenster angezeigt wird. Zwischen der Bewegung des LDS-006 Sensors und der Darstellung gibt es einen Zeitversatz von ca. 0.5 sec. was eigentlich nicht schlecht ist.

Fazit

Alles in allem hätte ich es wohl nicht geschafft, das LDS-006 Lidar Sensor Reverse Engineering ohne Hilfe durchzuführen, aber dank der Unterstützung aus dem Internet habe ich es dann doch in relativ kurzer Zeit geschafft den Sensor zum Laufen zu bringen. Nun fehlt mir noch ein konkreter Anwendungsfall, aber der wird sich sicher auch schnell ergeben 🙂