Projekt 81: Inbetriebnahme und Objekttracking des LiDAR-Lite v3: Unterschied zwischen den Versionen
(234 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 24: | Zeile 24: | ||
== Einleitung == | == Einleitung == | ||
Im Rahmen des GET-Praktikums sollen Student eigene mechatronische Projekte erstellen und durchführen. Dabei sammeln Studenten eine erste Erfahrung in der Planung, Durchführung und Lösungen von spannenden Projekte, die in Ihren späteren Berufsleben begleiten werden. | |||
In dieser Artikel wird das Projekt 81 "'''Inbetriebnahme und Objekttracking des LiDAR-Lite v3'''" vorgestellt. Für die Carolo Cup AG der HSHL werden Ansätze zur Umgebungsüberwachung des Fahrzeuges benötigt. Dementsprechend hat sich das Team für ein LiDAR-System zur Objektdetektion und -Tracking. Dafür sind Kenntnisse in den Fachgebieten, wie Mechanik, Elektrotechnik und Informatik, erforderlich. | |||
Im späteren Einbau auf dem Fahrzeug wird eine 360-Grad Erfassung benötigt. Parallel zu diesem Projekt läuft das Projekt "[http://193.175.248.52/wiki/index.php/Projekt_82:_3D-Schwenkeinheit_f%C3%BCr_einen_LiDAR-Lite_v3 3D-Schwenkeinheit für einen LiDAR-Lite v3]", das die Halterung und den rotatorischen Teil des LiDAR-System konstruiert. | |||
== Projekt == | |||
Folgender Abauf wurde für das Projekt aufgestellt: <br> | |||
'''Planung:''' <br> | |||
Die Projektplanung erfolgt mittels Gantt-Chart, Lasten- und Pflichtenheft<br> | |||
'''Beschaffung:''' <br> | |||
Für die Beschaffung wird eine QV-Beschaffung genutzt, da der LiDAR nach Abschluss in der Carolo Cup AG genutzt wird. Die Auswahl des LiDAR Lite v3 entstand durch berücksichtig von Kosten, Lernerfolg und Anforderungen des Carolo Cup Hochschulwettbewerbs.<br> | |||
'''Durchführung:''' <br> | |||
Als erstes wurde die Möglichkeit der Programmierung eines LiDARs recherchiert. Um die Funktionsfähigkeit und die Messgenauigkeit des Sensor im Nahbereich sicherzustellen, wurden die vom LiDAR gemessenen Werte mit deren einer [https://de.wikipedia.org/wiki/Gliederma%C3%9Fstab Gliedermaßstab] verglichen. Desweiteren wurde die Genauigkeit des Sensor auf entfernte Objekten getestet. Eine besser geeignete Referenz stellte das von Bosch stammende Produkt [https://www.bosch-professional.com/de/de/products/glm-50-c-0601072C00 BOSCH Laser-Entfernungsmesser GLM 50] dar. Anschließend wurde der Sensor auf verschiedenen Oberflächen,- wie durchsichtige, reflektierenden,- getestet. und Nach Durchführung mehreren Testen könnte man feststellen, dass der Sensor für die gewünschte Anwendung geeignet ist. | |||
Damit das Projekt nicht von der [http://193.175.248.52/wiki/index.php/Projekt_82:_3D-Schwenkeinheit_f%C3%BCr_einen_LiDAR-Lite_v3 parallel-laufenden Projekt], war die Konstruktion eines provisorischen Schwenkeinheit notwendig. | |||
Auf dem Breadboard wurde mit Hilfe der vorhandenen Datenblätter die Schaltung konzipiert. Diese haben wir in Fritzing erstellt und konnten anschließend unsere Bauteile anschließen | |||
Für den LiDAR werden Programmablaufpläne erstellt und in Software umgewandelt.<br> | |||
Die Aufgaben werden des Projektes können in folgende Fachbereiche der Mechatronik eingeteilt: | |||
*'''Mechanik''' <br/> | |||
** Bau einer temporären Prototypen Schwenkeinheit zu Testzwecken<br/> | |||
** Funktionstest des Prototypen<br/> | |||
*'''Elektrotechnik'''<br/> | |||
** Erstellung von Steckplatine und Schaltpläne <br/> | |||
** Funktionstest auf korrekte Verdrahtung<br/> | |||
*'''Angewandte Mathematik''' <br/> | |||
** Koordinatentransformation <br/> | |||
*'''Softwareentwicklung'''<br/> | |||
** Programmierung Servomotoren und des LiDAR-Sensors <br/> | |||
** Auswertung der erfassten Sensordaten <br/> | |||
** Ausgabe in einem Diagramm <br/> | |||
** Erstellen einer Point Cloud <br/> | |||
'''Test:''' <br> | |||
In einem Abschließenden Test wird die Schwenkeinheit von Projekt 82 und der Software zusammen getestet. Für Notfälle wird eine provisorische Schwenkeinheit verwendet.<br> | |||
'''Präsentation und Dokumentation:''' <br> | |||
Das Projekt wird abschließend auf der Projektmesse am 18.01.2019 vorgestellt. | |||
=== Projektplan === | === Projektplan === | ||
[[Datei:Inbetriebnahme und Objekttracking des LiDAR-Lite v3.png| | [[Datei:Inbetriebnahme und Objekttracking des LiDAR-Lite v3.png|1050px|Gantt Chart]] <br> | ||
=== V-Modell === | |||
<br> | |||
[[Datei:V-Modell_Inbetriebnahme_und_Objekttracking_des_LiDAR-Lite_v3.png|600px|V-Modell]] <br> | |||
<br><br> | |||
=== Materialbeschaffung === | |||
* LiDAR Lite V3 von Garmin | |||
* 2 x HS-422 Servomotor | |||
* Schwenkeinheit | |||
* Kondensator 680 μF | |||
=== Verwendete Software === | |||
* Arduino Software IDE 1.8.1 | |||
* MATLAB/Simulink 2018a | |||
* Fritzing | |||
* Processing | |||
* Tortoise SVN | |||
== Technische Übersicht == | |||
===Datenblätter=== | |||
Datenblatt: [https://static.garmin.com/pumac/LIDAR_Lite_v3_Operation_Manual_and_Technical_Specifications.pdf LiDAR Lite V3]<br/> | |||
Datenblatt: [https://www.robotshop.com/media/files/pdf/hs422-31422s.pdf HS-422]<br/> | |||
=== LiDAR-Lite v3 === | |||
{| class="mw-datatable" | |||
! style="font-weight: bold;" | Eigenschaft | |||
! style="font-weight: bold;" | Daten | |||
|- | |||
| Abmessung<br/> || 48 mm x 40 mm x 20 mm<br/> | |||
|- | |||
| Spannungsversorgung<br/> || 4.75 V bis 6 V<br/> | |||
|- | |||
| Stromverbrauch || 105 mA, Leerlauf<br/> 130 mA, kontinuerlich | |||
|- | |||
| Messbereich || 40 m<br/> | |||
|- | |||
| Genauigkeit || +/- 2,5 cm | |||
|- | |||
| Schnittstelle || I2C oder PWM<br/> | |||
|- | |||
|} | |||
=== Servomotor HS-422 === | |||
{| class="mw-datatable" | |||
! style="font-weight: bold;" | Eigenschaft | |||
! style="font-weight: bold;" | Daten | |||
|- | |||
| Betriebsspannung<br/>|| 4.8V - 6.0V<br/> | |||
|- | |||
| Betriebsgeschwindigkeit (4.8V)<br/> || 0.21sec/60° <br/> | |||
|- | |||
| Drehbereich <br/>|| 0-180° <br/> | |||
|- | |||
| Abmessung<br/> || 40.6x19.8x36.6mm <br/> | |||
|- | |||
|} | |||
== LiDAR Funktionsweise == | |||
[[Datei:Laufzeitmessung_Projekt81_isMP.png|thumb|rechts|500px]] | |||
LiDAR steht für ''Light Detection Ranging''. Der Sensor nutzt das optoelektrische Effekt zur Abstandsmessung. Anhand eines Transmitter wird ein Signal gesendet und vom Objekt reflektiert. Der Abstand wird in Abhängigkeit der Zeitdifferenz zwischen Senden und Empfang des Signals. Solch ein Verfahren wird Laufzeitverfahren genannt. Hier sendet der Sensor ein Laserstrahl aus und erhält nach einer unbestimmten Zeit durch eine Reflexion des Objektes den Strahl zurück. | |||
Allgemein lässt sich der zurückgelegte Weg des Stahls wie folgt berechnen: | |||
<blockquote><math>\ s\;=\;{v\,\cdot \Delta t} </math> <br> | |||
<br> | |||
Dabei ist : <br> | |||
<math> s </math> : der zurückgelegte Weg <br> | |||
<math> v </math> : Geschwindigkeit <br> | |||
<math> \Delta t </math> : Zeitdifferenz <br> <br></blockquote> | |||
Um der Abstand <math> d </math> zu ermitteln, sollte man den zurückgelegten Weg <math> s </math> halbieren. Ein weiterer zu betrachtenden Aspekt ist, dass der Laser Strahl sich mit Lichtgeschwindigkeit ausbreitet. Die konstante für Lichtgeschwindigkeit hat den Wert <math>299.792.458 m/s</math>. Damit lässt sich der Abstand <math> d </math> folgendermaßen berechnen: | |||
<blockquote><math>\ d\;=\;{\frac {c\,\cdot\Delta t}{2}} </math> <br> <br> | |||
Dabei ist : <br> | |||
<math> d </math> : Abstand bzw. Distanz <br> | |||
<math> c </math> : Lichtgeschwindigkeit <br> | |||
<math> \Delta t </math> : Zeitdifferenz <br></blockquote> | |||
<br> | |||
<br> | |||
In der Wirklichkeit müssen zusätzliche Aspekte betrachtet werden. Auf Oberflächen, wie zum Beispiel Flächen mit großen Rauheit, verhält sich das Licht anders. Man sagt, die Wellenlänge "reflektiert diffus". Dabei kann reflektierendes Licht zu einem späteren Zeitpunkt empfangen werden. Die Formel lässt sich folgendermaßen umschreiben:<br> <br> | |||
<blockquote><math>\ d\; \geq\;{\frac {c\,\cdot\Delta t}{2}} </math> <br> <br> | |||
Dabei ist : <br> | |||
<math> d </math> : Abstand bzw. Distanz <br> | |||
<math> c </math> : Lichtgeschwindigkeit <br> | |||
<math> \Delta t </math> : Zeitdifferenz <br></blockquote> | |||
<gallery class="center" caption="Diffuses Licht" widths="300" heights="300"> | |||
Datei:Lichtdiffusion_1_Projekt_81_isMP.png | |||
Datei:Lichtdiffusion_2_Projekt_81_isMP.png | |||
</gallery> | |||
== Hardwareaufbau == | |||
===Schaltplan=== | |||
[[Datei:Schaltplan_LiDAR_Lite_v3.png|600px|LiDAR Lite v3 - Schaltplan]] | |||
===Steckplatine=== | |||
[[Datei:Steckplatine_LiDAR_Lite_v3.png|600px|LiDAR Lite v3 - Steckplatine]] | |||
== Projektcode und Mathematische Hilfsmittel== | |||
=== Koordinatentransformation === | |||
[[Datei:Kugelkoordinaren_Projekt81.png|thumb|rechts|300px|Allgemeine Darstellung der Kugelkoordinaten]] | |||
[[Datei:geographischeKoordinaten_Projekt81.png|thumb|rechts|300px|Geographische Koordinatensysteme]] | |||
Für die Darstellung des Bildes werden Punkte einzeln erfasst. Ein Punkt wird in der kartesischen Koordinatenform mit <math>x</math>-, <math>y</math>-, und <math>z</math>-Wert <math>P = (x,y,z)</math> gekennzeichnet. In diesem Projekt werden zwei Servomotoren und ein LiDAR Lite v3 zur Ermittlung von Punkten verwendet. Die Punkte werden schlussendlich in Kugelkoordinaten dargestellt. Der von LiDAR ermittelte Abstand wird als Radius <math>r</math>, der obere und der untere Servomotor werden jeweils mit <math>\theta</math> und <math>\varphi</math> bezeichnet. Für die spätere Montage im Fahrzeug des Carolo Cup AG wird an der Konvention eines Fahrzeugkoordinatensystem angenommen. Deshalb benennen wir bereits in dieser Projekt <math>\varphi</math> als YAW-Winkel und <math>\theta</math> als PITCH-Winkel. Ein Koordinatensystem spielt eine wichtige Rolle. Die Umrechnung von Kugelkoordinatensystem ins kartesische erfolgt durch: | |||
: <math> | |||
\begin{array}{cll} | |||
x &=& r \cdot \sin \theta \cdot \cos \varphi \\ | |||
y &=& r \cdot \sin \theta \cdot \sin \varphi \\ | |||
z &=& r \cdot \cos \theta | |||
\end{array} | |||
</math> | |||
Für die Vorführung wird das LiDAR-System nicht verwendet werden. Hierfür wird ein Darstellung des Raums nachgebildet. Aus diesem Grund wird eine andere variante der Repräsentation der Kugelkoordinaten angewendet. Hierfür wird die [https://de.wikipedia.org/wiki/Geographische_Koordinaten Geographischen Koordinatensystem] angewendet. Der Unterschied liegt an die Richtung des Winkel <math>\theta</math> . Der Winkel <math>\theta_{neu}</math> eilt um <math>\frac{\pi}{2}</math> | |||
vor. Und somit <math>\theta_{neu} =\frac{\pi}{2} - \theta </math> . In der Allgemeine Formel eingesetzt, erhalten wir: | |||
: <math> | |||
\begin{array}{cll} | |||
x &=& r \cdot \sin (\theta_{neu}) \cdot \cos \varphi \\ | |||
y &=& r \cdot \sin (\theta_{neu}) \cdot \sin \varphi \\ | |||
z &=& r \cdot \cos (\theta_{neu}) | |||
\end{array} | |||
</math> | |||
Mit der Erkenntnis, dass [https://de.wikipedia.org/wiki/Sinus_und_Kosinus Sinus] und [https://de.wikipedia.org/wiki/Sinus_und_Kosinus Cosinus] ebenfalls um <math>\frac{\pi}{2}</math> phasenverschoben sind, können wir die Gleichungen darstellen: | |||
: <math> | |||
\begin{array}{cll} | |||
x &=& r \cdot \cos \theta \cdot \cos \varphi \\ | |||
y &=& r \cdot \cos \theta \cdot \sin \varphi \\ | |||
z &=& r \cdot \sin \theta | |||
\end{array} | |||
</math> | |||
Die Koordinatentransformation lässt sich in MATLAB folgendermaßen implementieren: | |||
<div style="width:950px; height:270px; overflow:auto; border: 2px solid #088"> | |||
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1"> | |||
function [x y z] = transformCoord2(radius, yawAngle, pitchAngle) | |||
% transformCoord2- Description | |||
% Die Funktion wandelt die Messpunkte von Kugelkoordinaten | |||
% ins kartesische | |||
% Syntax: [x y z] = transformCoord2(radius, yawAngle, pitchAngle) | |||
%% Winkelumrechnung von Degree zu Bogenmaß | |||
theta = double(pitchAngle * pi / 180); | |||
phi = double(yawAngle * pi / 180); | |||
%% Koordinatentransformation | |||
x = radius * cos (theta) * cos (phi); | |||
y = radius * cos (theta) * sin (phi); | |||
z = radius * sin (theta); | |||
end | |||
</syntaxhighlight> | |||
</div> | |||
=== Flussdiagramm === | |||
[[Datei:Flussdiagramm_Projekt81.png|900px|Flussdiagramm]] | |||
=== Steuerung mit Arduino IDE === | |||
Die erste Inbetriebnahme des Sensors wurde mit der Arduino IDE durchgeführt. | |||
Dieser Schritt diente der ersten praktischen Auseinandersetzung mit dem Sensor, sowie ein Funktionstest des Sensors mit dem geplanten Schaltplan. | |||
=== | Der folgende Code ermöglicht ein 3D-Scan in einem 180° Drehbereich (bedingt durch die Servomotoren). | ||
<syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1"> | |||
void loop() { | |||
//Sweep Yaw servomotor | |||
for (yawAngle = 0; yawAngle <= 180; yawAngle += YAW_STEP) { | |||
servoYaw.write(yawAngle); | |||
//Sweep Pitch servomotor. | |||
if(pitchAngle < 90){ | |||
for (pitchAngle = 0; pitchAngle <= 180;pitchAngle+= PITCH_STEP){ | |||
servoPitch.write(pitchAngle); | |||
sendeDaten(); | |||
} | |||
} else { | |||
for (pitchAngle = 180; pitchAngle >= 0;pitchAngle-= PITCH_STEP){ | |||
servoPitch.write(pitchAngle); | |||
sendeDaten(); | |||
} | |||
} | |||
} | |||
} | |||
void sendeDaten(){ | |||
// Daten aufnehmen, konvertieren und an Schnittstelle bereitstellen | |||
[...] | |||
} | |||
end | |||
</syntaxhighlight> | |||
Um die Messwerte visuell darstellen zu können, wurde ein zusätzliches Programm verwendet. | |||
Das Programm heißt Processing und erstellt aus diesen Messwerten eine PointCloud. | |||
Mit dieser PointCloud konnte anschließend ein 3D Plot erstellt werden. | |||
Nachfolgend befindet sich der Code für das erstellen der PointCloud. | |||
<syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1"> | |||
void draw() { | |||
[...] | |||
// Lese serielle Schnittstelle | |||
String serialString = serial.readStringUntil('\n'); | |||
if (serialString != null) { | |||
String[] coordinates = split(serialString, ' '); | |||
if (coordinates.length == 3) { | |||
pointList.add(new PVector(float(coordinates[0]), float(coordinates[1]), float(coordinates[2]))); | |||
} | |||
} | |||
// zeichne Point-Cloud | |||
for (int index = 0; index < pointList.size(); index++) { | |||
PVector v = pointList.get(index); | |||
if (index == pointList.size() - 1) { | |||
// Draw a line between Lidar and last point | |||
stroke(255, 15, 15); | |||
line(0, 0, 0, v.x,v.y,v.z); | |||
} | |||
// Draw point with a variable color | |||
stroke(255-v.z, 255-v.y, 255-v.x); | |||
point(v.x, v.y, v.z); | |||
} | |||
} | |||
[...] | |||
</syntaxhighlight> | |||
Durch diesen ersten erfolgreichen Test konnten wir nun Probleme erkennen und diese im Verlauf des Projektes berücksichtigen. | |||
Probleme die uns aufgefallen waren: | |||
* Arduino in seiner Leistung eingeschränkt | |||
* Koordinatentransformation wird benötigt | |||
* Der LiDAR ist in seinem Messbereich eingeschränkt | |||
=== Einbindung von MATLAB === | |||
Nach der ersten erfolgreichen Durchführung mit dem Arduino Code, wurde dieser in MATLAB/Simulink umgesetzt. | |||
Dabei stellte sich heraus, dass wir die Bibliothek für den LiDAR Lite v3 benötigen. | |||
Schlussendlich haben wir das auslesen der LiDAR Lite Messwerte über die Arduino IDE durchgeführt und diese über die Serielle Schnittstelle dem MATLAB/Simulink Programm zur Verfügung gestellt. | |||
<div style="width:600px; height:482px; overflow:auto; border: 2px solid #088"> | |||
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1"> | |||
%% Auslesen der Daten aus der serielle Schnittstelle | |||
disp('============================================================') | |||
disp(' Datenaufnahme vom Arduino ') | |||
disp('============================================================') | |||
tic; | |||
for i=1:1:10000 | |||
received = fgets(sObject); | |||
disp(i); | |||
%% Daten vorverarbeitung | |||
zwischenspeicher = strsplit(received,' '); | |||
rohdatenDouble(i,1)= cellfun(@str2double,zwischenspeicher(1));% Radius | |||
rohdatenDouble(i,2)= cellfun(@str2double,zwischenspeicher(2));% Yaw | |||
rohdatenDouble(i,3) = cellfun(@str2double,zwischenspeicher(3));% Pitch | |||
[transFdaten(i,1) transFdaten(i,2) transFdaten(i,3)] = transformCoord(... | |||
rohdatenDouble(i,1), ... | |||
rohdatenDouble(i,2), ... | |||
rohdatenDouble(i,3)); | |||
end | |||
dlmwrite('messwerte.xyz',transFdaten, 'delimiter','\t'); | |||
timePart = toc; | |||
time = time + timePart; | |||
disp('============================================================') | |||
disp('Die Messdaten wurde erfolgreich aufgenommen und gespeichert.') | |||
disp([' benötigte Zeit: ', num2str(timePart), ' Sekunden'] ) | |||
disp('============================================================') | |||
</syntaxhighlight> | |||
</div> | |||
== Ergebnis == | == Ergebnis == | ||
=== Bildliche Darstellung der Ergebnisse === | |||
Um die Messwerte bildlich darzustellen wurde mit MATLAB verschiedene Plots erstellt. Dabei sind die Ergebnisse aus unserem Testaufbau entstanden. So ist in der ersten Darstellung ein LivePlot entstanden, welcher die Messwerte direkt in das Diagramm einzeichnet. Dabei ist jedoch anzumerken, dass die Daten auf der y-Achse gespiegelt sind. Eine andere Darstellung folgte nach Programmabschluss über die Point Cloud. Durch die Bibliothek in Matlab kann man eine Point Cloud direkt erstellen lassen. Das dargestellte Diagramm entspricht dem Aufbau auf dem Bild. | |||
<gallery class="center" caption="Live-Plot der Messwerte" widths="400" heights="350"> | |||
Datei: Echtzeitplot_Projekt81_isMP.png | |||
</gallery> | |||
<gallery class="center" caption="Plot der Messwerte mit PointCloud" widths="400" heights="350"> | |||
Datei: Echtzeitplot_PointCloud_Projekt81_isMP.png | |||
Datei:testaufbau_lidar_lite_v3.jpg | |||
</gallery> | |||
=== Echtzeit-Ergebnis === | |||
Initialisierung | |||
Initialisierung erfolgreich | |||
benötigte Zeit: 0.3951 Sekunden | |||
Datenaufnahme vom Arduino | |||
Die Messdaten wurde erfolgreich aufgenommen und gespeichert. | |||
benötigte Zeit: 729.4195 Sekunden | |||
Messdaten laden | |||
Laden der Daten erfolgreich. | |||
benötigte Zeit: 0.15703 Sekunden | |||
Ausgabe der Ergebnissen | |||
Ausgabe erfolgreich | |||
benötigte Zeit: 3.7837 Sekunden | |||
benötigte Zeit: 3.7837 Sekunden | |||
Programm erfolgreich ausgeführt | |||
benötigte Zeit für die komplete Ausführung: 733.7553 Sekunden | |||
== Zusammenfassung == | == Zusammenfassung == | ||
=== Lessons Learned === | === Lessons Learned === | ||
Während unseres Projektes konnten wir einige Sachen lernen. Eine gute Projektplanung garantiert nicht, dass diese auch eingehalten werden kann. Viele unvorhergesehene Probleme können den Plan verzögern, sodass eine Abweichung vom Projektplan schlussendlich unausweichlich war. Trotzdem ist eine Projektplanung ein guter Anhaltspunkt um strukturiert zu arbeiten und zu planen. Neben diesen Aspekt konnten wir uns sehr gut in die Funktionsweise eines LiDARS Theorietisch wie auch Praktisch einarbeiten. Dabei wurden Vorteile, wie auch Nachteile eines LiDARS entdeckt. Auf dem Weg der Programmierung lernten wir Mathematische Hilfsmittel wie die Koordinatentransformationen oder Darstellungsmöglichkeiten wie der Point Cloud umzusetzen. Schlussendlich war auch die Wahl zwischen einem günstigen oder teurem Servomotor sehr lehrreich, da auch hierbei gilt, dass es manchmal notwendig ist, ein teureres Produkt zu verwenden. Das günstige Modell war von der Genauigkeit nicht ausreichend und lieferte viele Fehler. | |||
=== Ausblick === | |||
In Zukunft sollte der LiDAR andere Fahrzeuge erkennen und somit das Carolo Cup AG Fahrzeug beim Umgehen von Hindernissen behilflich sein. | |||
Ein SLAM Algorithmus ist ebenfalls in Zukunft denkbar um die verwendete Rechenleistung nach einigen Runden auf ein Minimum zu reduzieren. | |||
== Projektunterlagen == | == Projektunterlagen == | ||
[https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/81_LiDAR_Lite_v3/ Projektunterlagen im SVN] | |||
== YouTube Video == | == YouTube Video == | ||
[https://www.youtube.com/watch?v=2iytbikFUvs&t=4s Video zur Funktion des LiDAR Lite v3] | |||
== Weblinks == | == Weblinks == | ||
*[https://de.mathworks.com/help/vision/lidar-and-point-cloud-processing.html Lidar and Point Cloud Processing] | |||
*[https://de.mathworks.com/help/matlab/ref/plot3.html?searchHighlight=plot3&s_tid=doc_srchtitle 3-D line plot] | |||
*[https://de.mathworks.com/help/driving/examples/ground-plane-and-obstacle-detection-using-lidar.html Ground Plane and Obstacle Detection Using Lidar] | |||
*[https://de.mathworks.com/help/driving/lidar-processing.html?searchHighlight=lidar&s_tid=doc_srchtitle LiDAR Processing] | |||
*[http://www2.racurs.ru/download/docs6/Eng/lidar.pdf LiDAR Data Processing] | |||
== Literatur == | == Literatur == | ||
* Lothar Papula: ''Mathematik für Ingenieure und Naturwissenschaftler - Anwendungsbeispiele: 222 Aufgabenstellungen aus Naturwissenschaft und Technik mit ausführlich kommentierten Lösungen''. Verlag: Wiesbaden : Vieweg+Teubner Verlag, 2012, ISBN 978-3-834-82129-4. | |||
* Reinhard Lerch: ''Elektrische Messtechnik Analoge, digitale und computergestüzte Verfahren''. Springer-Verlag Berlin Heidelberg 2007, ISBN 978-3-540-73610-3. | |||
* Lars Schnell: ''LiDAR – Funktionsweise und Anwendungsgebiete in der VFX-Industrie Bachelorarbeit im Studiengang Audiovisuelle Medien.'' Hochschule der Medien Stuttgart, 2016, url: [https://www.hdm-stuttgart.de/vfx/alumni/bamathesis/pdf_012/] | |||
Aktuelle Version vom 17. Januar 2019, 19:36 Uhr
![Garmin LiDAR lite v3](/wiki/images/thumb/1/10/Lidar_lite_v3.jpg/300px-Lidar_lite_v3.jpg)
→ zurück zur Übersicht: WS 18/19: Fachpraktikum Elektrotechnik (MTR)
Autor: Isaac Mpidi-Bita und Thomas Miska
Betreuer: Prof. Schneider
Aufgabe
Inbetriebnahme eines Low-Cost- LiDAR sowie eine Objektbildung und -tracking zum visualisieren der aufgenommen Daten.
Erwartungen an die Projektlösung
- Inbetriebnahme des LIDAR-Lite v3 von Garmin mit Arduino
- Erstellung eines Matlab und Simulink Treibers zur Echtzeitverarbeitung
- Recherchieren Sie geeignete Verfahren zur Objektbildung und zum Objekttracking
- Setzen Sie eines dieser Verfahren um.
- Bewertung der Ergebnisse mit geeigneter Referenz (z.B. Topcon Total Station)
- Softwareentwicklung nach HSHL Standard in SVN
- Darstellung der Funktion des LiDARs in einem YouTube Video
- Test und wissenschaftliche Dokumentation
- Live Vorführung während der Abschlusspräsentation
Hinweis: In Projekt 82 entsteht eine 3D-Schwenkeinheit. Beachten Sie, dass die 3D Daten des Sensors sowie die horizontale und vertikale Winkelmessung in Echtzeit verarbeitet werden muss. Stimmen Sie die Schnittstellen frühzeitig ab.
Einleitung
Im Rahmen des GET-Praktikums sollen Student eigene mechatronische Projekte erstellen und durchführen. Dabei sammeln Studenten eine erste Erfahrung in der Planung, Durchführung und Lösungen von spannenden Projekte, die in Ihren späteren Berufsleben begleiten werden. In dieser Artikel wird das Projekt 81 "Inbetriebnahme und Objekttracking des LiDAR-Lite v3" vorgestellt. Für die Carolo Cup AG der HSHL werden Ansätze zur Umgebungsüberwachung des Fahrzeuges benötigt. Dementsprechend hat sich das Team für ein LiDAR-System zur Objektdetektion und -Tracking. Dafür sind Kenntnisse in den Fachgebieten, wie Mechanik, Elektrotechnik und Informatik, erforderlich. Im späteren Einbau auf dem Fahrzeug wird eine 360-Grad Erfassung benötigt. Parallel zu diesem Projekt läuft das Projekt "3D-Schwenkeinheit für einen LiDAR-Lite v3", das die Halterung und den rotatorischen Teil des LiDAR-System konstruiert.
Projekt
Folgender Abauf wurde für das Projekt aufgestellt:
Planung:
Die Projektplanung erfolgt mittels Gantt-Chart, Lasten- und Pflichtenheft
Beschaffung:
Für die Beschaffung wird eine QV-Beschaffung genutzt, da der LiDAR nach Abschluss in der Carolo Cup AG genutzt wird. Die Auswahl des LiDAR Lite v3 entstand durch berücksichtig von Kosten, Lernerfolg und Anforderungen des Carolo Cup Hochschulwettbewerbs.
Durchführung:
Als erstes wurde die Möglichkeit der Programmierung eines LiDARs recherchiert. Um die Funktionsfähigkeit und die Messgenauigkeit des Sensor im Nahbereich sicherzustellen, wurden die vom LiDAR gemessenen Werte mit deren einer Gliedermaßstab verglichen. Desweiteren wurde die Genauigkeit des Sensor auf entfernte Objekten getestet. Eine besser geeignete Referenz stellte das von Bosch stammende Produkt BOSCH Laser-Entfernungsmesser GLM 50 dar. Anschließend wurde der Sensor auf verschiedenen Oberflächen,- wie durchsichtige, reflektierenden,- getestet. und Nach Durchführung mehreren Testen könnte man feststellen, dass der Sensor für die gewünschte Anwendung geeignet ist.
Damit das Projekt nicht von der parallel-laufenden Projekt, war die Konstruktion eines provisorischen Schwenkeinheit notwendig.
Auf dem Breadboard wurde mit Hilfe der vorhandenen Datenblätter die Schaltung konzipiert. Diese haben wir in Fritzing erstellt und konnten anschließend unsere Bauteile anschließen
Für den LiDAR werden Programmablaufpläne erstellt und in Software umgewandelt.
Die Aufgaben werden des Projektes können in folgende Fachbereiche der Mechatronik eingeteilt:
- Mechanik
- Bau einer temporären Prototypen Schwenkeinheit zu Testzwecken
- Funktionstest des Prototypen
- Bau einer temporären Prototypen Schwenkeinheit zu Testzwecken
- Elektrotechnik
- Erstellung von Steckplatine und Schaltpläne
- Funktionstest auf korrekte Verdrahtung
- Erstellung von Steckplatine und Schaltpläne
- Angewandte Mathematik
- Koordinatentransformation
- Koordinatentransformation
- Softwareentwicklung
- Programmierung Servomotoren und des LiDAR-Sensors
- Auswertung der erfassten Sensordaten
- Ausgabe in einem Diagramm
- Erstellen einer Point Cloud
- Programmierung Servomotoren und des LiDAR-Sensors
Test:
In einem Abschließenden Test wird die Schwenkeinheit von Projekt 82 und der Software zusammen getestet. Für Notfälle wird eine provisorische Schwenkeinheit verwendet.
Präsentation und Dokumentation:
Das Projekt wird abschließend auf der Projektmesse am 18.01.2019 vorgestellt.
Projektplan
V-Modell
Materialbeschaffung
- LiDAR Lite V3 von Garmin
- 2 x HS-422 Servomotor
- Schwenkeinheit
- Kondensator 680 μF
Verwendete Software
- Arduino Software IDE 1.8.1
- MATLAB/Simulink 2018a
- Fritzing
- Processing
- Tortoise SVN
Technische Übersicht
Datenblätter
Datenblatt: LiDAR Lite V3
Datenblatt: HS-422
LiDAR-Lite v3
Eigenschaft | Daten |
---|---|
Abmessung |
48 mm x 40 mm x 20 mm |
Spannungsversorgung |
4.75 V bis 6 V |
Stromverbrauch | 105 mA, Leerlauf 130 mA, kontinuerlich |
Messbereich | 40 m |
Genauigkeit | +/- 2,5 cm |
Schnittstelle | I2C oder PWM |
Servomotor HS-422
Eigenschaft | Daten |
---|---|
Betriebsspannung |
4.8V - 6.0V |
Betriebsgeschwindigkeit (4.8V) |
0.21sec/60° |
Drehbereich |
0-180° |
Abmessung |
40.6x19.8x36.6mm |
LiDAR Funktionsweise
![](/wiki/images/thumb/4/42/Laufzeitmessung_Projekt81_isMP.png/500px-Laufzeitmessung_Projekt81_isMP.png)
LiDAR steht für Light Detection Ranging. Der Sensor nutzt das optoelektrische Effekt zur Abstandsmessung. Anhand eines Transmitter wird ein Signal gesendet und vom Objekt reflektiert. Der Abstand wird in Abhängigkeit der Zeitdifferenz zwischen Senden und Empfang des Signals. Solch ein Verfahren wird Laufzeitverfahren genannt. Hier sendet der Sensor ein Laserstrahl aus und erhält nach einer unbestimmten Zeit durch eine Reflexion des Objektes den Strahl zurück. Allgemein lässt sich der zurückgelegte Weg des Stahls wie folgt berechnen:
Dabei ist :
: der zurückgelegte Weg
: Geschwindigkeit
: Zeitdifferenz
Um der Abstand zu ermitteln, sollte man den zurückgelegten Weg halbieren. Ein weiterer zu betrachtenden Aspekt ist, dass der Laser Strahl sich mit Lichtgeschwindigkeit ausbreitet. Die konstante für Lichtgeschwindigkeit hat den Wert . Damit lässt sich der Abstand folgendermaßen berechnen:
Dabei ist :
: Abstand bzw. Distanz
: Lichtgeschwindigkeit
: Zeitdifferenz
In der Wirklichkeit müssen zusätzliche Aspekte betrachtet werden. Auf Oberflächen, wie zum Beispiel Flächen mit großen Rauheit, verhält sich das Licht anders. Man sagt, die Wellenlänge "reflektiert diffus". Dabei kann reflektierendes Licht zu einem späteren Zeitpunkt empfangen werden. Die Formel lässt sich folgendermaßen umschreiben:
Dabei ist :
: Abstand bzw. Distanz
: Lichtgeschwindigkeit
: Zeitdifferenz
- Diffuses Licht
-
-
Hardwareaufbau
Schaltplan
Steckplatine
Projektcode und Mathematische Hilfsmittel
Koordinatentransformation
![](/wiki/images/thumb/b/b7/Kugelkoordinaren_Projekt81.png/300px-Kugelkoordinaren_Projekt81.png)
![](/wiki/images/thumb/3/38/GeographischeKoordinaten_Projekt81.png/300px-GeographischeKoordinaten_Projekt81.png)
Für die Darstellung des Bildes werden Punkte einzeln erfasst. Ein Punkt wird in der kartesischen Koordinatenform mit -, -, und -Wert gekennzeichnet. In diesem Projekt werden zwei Servomotoren und ein LiDAR Lite v3 zur Ermittlung von Punkten verwendet. Die Punkte werden schlussendlich in Kugelkoordinaten dargestellt. Der von LiDAR ermittelte Abstand wird als Radius , der obere und der untere Servomotor werden jeweils mit und bezeichnet. Für die spätere Montage im Fahrzeug des Carolo Cup AG wird an der Konvention eines Fahrzeugkoordinatensystem angenommen. Deshalb benennen wir bereits in dieser Projekt als YAW-Winkel und als PITCH-Winkel. Ein Koordinatensystem spielt eine wichtige Rolle. Die Umrechnung von Kugelkoordinatensystem ins kartesische erfolgt durch:
Für die Vorführung wird das LiDAR-System nicht verwendet werden. Hierfür wird ein Darstellung des Raums nachgebildet. Aus diesem Grund wird eine andere variante der Repräsentation der Kugelkoordinaten angewendet. Hierfür wird die Geographischen Koordinatensystem angewendet. Der Unterschied liegt an die Richtung des Winkel . Der Winkel eilt um
vor. Und somit . In der Allgemeine Formel eingesetzt, erhalten wir:
Mit der Erkenntnis, dass Sinus und Cosinus ebenfalls um phasenverschoben sind, können wir die Gleichungen darstellen:
Die Koordinatentransformation lässt sich in MATLAB folgendermaßen implementieren:
function [x y z] = transformCoord2(radius, yawAngle, pitchAngle)
% transformCoord2- Description
% Die Funktion wandelt die Messpunkte von Kugelkoordinaten
% ins kartesische
% Syntax: [x y z] = transformCoord2(radius, yawAngle, pitchAngle)
%% Winkelumrechnung von Degree zu Bogenmaß
theta = double(pitchAngle * pi / 180);
phi = double(yawAngle * pi / 180);
%% Koordinatentransformation
x = radius * cos (theta) * cos (phi);
y = radius * cos (theta) * sin (phi);
z = radius * sin (theta);
end
Flussdiagramm
Steuerung mit Arduino IDE
Die erste Inbetriebnahme des Sensors wurde mit der Arduino IDE durchgeführt. Dieser Schritt diente der ersten praktischen Auseinandersetzung mit dem Sensor, sowie ein Funktionstest des Sensors mit dem geplanten Schaltplan.
Der folgende Code ermöglicht ein 3D-Scan in einem 180° Drehbereich (bedingt durch die Servomotoren).
void loop() {
//Sweep Yaw servomotor
for (yawAngle = 0; yawAngle <= 180; yawAngle += YAW_STEP) {
servoYaw.write(yawAngle);
//Sweep Pitch servomotor.
if(pitchAngle < 90){
for (pitchAngle = 0; pitchAngle <= 180;pitchAngle+= PITCH_STEP){
servoPitch.write(pitchAngle);
sendeDaten();
}
} else {
for (pitchAngle = 180; pitchAngle >= 0;pitchAngle-= PITCH_STEP){
servoPitch.write(pitchAngle);
sendeDaten();
}
}
}
}
void sendeDaten(){
// Daten aufnehmen, konvertieren und an Schnittstelle bereitstellen
[...]
}
end
Um die Messwerte visuell darstellen zu können, wurde ein zusätzliches Programm verwendet. Das Programm heißt Processing und erstellt aus diesen Messwerten eine PointCloud. Mit dieser PointCloud konnte anschließend ein 3D Plot erstellt werden. Nachfolgend befindet sich der Code für das erstellen der PointCloud.
void draw() {
[...]
// Lese serielle Schnittstelle
String serialString = serial.readStringUntil('\n');
if (serialString != null) {
String[] coordinates = split(serialString, ' ');
if (coordinates.length == 3) {
pointList.add(new PVector(float(coordinates[0]), float(coordinates[1]), float(coordinates[2])));
}
}
// zeichne Point-Cloud
for (int index = 0; index < pointList.size(); index++) {
PVector v = pointList.get(index);
if (index == pointList.size() - 1) {
// Draw a line between Lidar and last point
stroke(255, 15, 15);
line(0, 0, 0, v.x,v.y,v.z);
}
// Draw point with a variable color
stroke(255-v.z, 255-v.y, 255-v.x);
point(v.x, v.y, v.z);
}
}
[...]
Durch diesen ersten erfolgreichen Test konnten wir nun Probleme erkennen und diese im Verlauf des Projektes berücksichtigen. Probleme die uns aufgefallen waren:
- Arduino in seiner Leistung eingeschränkt
- Koordinatentransformation wird benötigt
- Der LiDAR ist in seinem Messbereich eingeschränkt
Einbindung von MATLAB
Nach der ersten erfolgreichen Durchführung mit dem Arduino Code, wurde dieser in MATLAB/Simulink umgesetzt. Dabei stellte sich heraus, dass wir die Bibliothek für den LiDAR Lite v3 benötigen. Schlussendlich haben wir das auslesen der LiDAR Lite Messwerte über die Arduino IDE durchgeführt und diese über die Serielle Schnittstelle dem MATLAB/Simulink Programm zur Verfügung gestellt.
%% Auslesen der Daten aus der serielle Schnittstelle
disp('============================================================')
disp(' Datenaufnahme vom Arduino ')
disp('============================================================')
tic;
for i=1:1:10000
received = fgets(sObject);
disp(i);
%% Daten vorverarbeitung
zwischenspeicher = strsplit(received,' ');
rohdatenDouble(i,1)= cellfun(@str2double,zwischenspeicher(1));% Radius
rohdatenDouble(i,2)= cellfun(@str2double,zwischenspeicher(2));% Yaw
rohdatenDouble(i,3) = cellfun(@str2double,zwischenspeicher(3));% Pitch
[transFdaten(i,1) transFdaten(i,2) transFdaten(i,3)] = transformCoord(...
rohdatenDouble(i,1), ...
rohdatenDouble(i,2), ...
rohdatenDouble(i,3));
end
dlmwrite('messwerte.xyz',transFdaten, 'delimiter','\t');
timePart = toc;
time = time + timePart;
disp('============================================================')
disp('Die Messdaten wurde erfolgreich aufgenommen und gespeichert.')
disp([' benötigte Zeit: ', num2str(timePart), ' Sekunden'] )
disp('============================================================')
Ergebnis
Bildliche Darstellung der Ergebnisse
Um die Messwerte bildlich darzustellen wurde mit MATLAB verschiedene Plots erstellt. Dabei sind die Ergebnisse aus unserem Testaufbau entstanden. So ist in der ersten Darstellung ein LivePlot entstanden, welcher die Messwerte direkt in das Diagramm einzeichnet. Dabei ist jedoch anzumerken, dass die Daten auf der y-Achse gespiegelt sind. Eine andere Darstellung folgte nach Programmabschluss über die Point Cloud. Durch die Bibliothek in Matlab kann man eine Point Cloud direkt erstellen lassen. Das dargestellte Diagramm entspricht dem Aufbau auf dem Bild.
- Live-Plot der Messwerte
-
- Plot der Messwerte mit PointCloud
-
-
Echtzeit-Ergebnis
Initialisierung Initialisierung erfolgreich benötigte Zeit: 0.3951 Sekunden
Datenaufnahme vom Arduino Die Messdaten wurde erfolgreich aufgenommen und gespeichert. benötigte Zeit: 729.4195 Sekunden
Messdaten laden Laden der Daten erfolgreich. benötigte Zeit: 0.15703 Sekunden
Ausgabe der Ergebnissen Ausgabe erfolgreich benötigte Zeit: 3.7837 Sekunden benötigte Zeit: 3.7837 Sekunden
Programm erfolgreich ausgeführt benötigte Zeit für die komplete Ausführung: 733.7553 Sekunden
Zusammenfassung
Lessons Learned
Während unseres Projektes konnten wir einige Sachen lernen. Eine gute Projektplanung garantiert nicht, dass diese auch eingehalten werden kann. Viele unvorhergesehene Probleme können den Plan verzögern, sodass eine Abweichung vom Projektplan schlussendlich unausweichlich war. Trotzdem ist eine Projektplanung ein guter Anhaltspunkt um strukturiert zu arbeiten und zu planen. Neben diesen Aspekt konnten wir uns sehr gut in die Funktionsweise eines LiDARS Theorietisch wie auch Praktisch einarbeiten. Dabei wurden Vorteile, wie auch Nachteile eines LiDARS entdeckt. Auf dem Weg der Programmierung lernten wir Mathematische Hilfsmittel wie die Koordinatentransformationen oder Darstellungsmöglichkeiten wie der Point Cloud umzusetzen. Schlussendlich war auch die Wahl zwischen einem günstigen oder teurem Servomotor sehr lehrreich, da auch hierbei gilt, dass es manchmal notwendig ist, ein teureres Produkt zu verwenden. Das günstige Modell war von der Genauigkeit nicht ausreichend und lieferte viele Fehler.
Ausblick
In Zukunft sollte der LiDAR andere Fahrzeuge erkennen und somit das Carolo Cup AG Fahrzeug beim Umgehen von Hindernissen behilflich sein. Ein SLAM Algorithmus ist ebenfalls in Zukunft denkbar um die verwendete Rechenleistung nach einigen Runden auf ein Minimum zu reduzieren.
Projektunterlagen
YouTube Video
Video zur Funktion des LiDAR Lite v3
Weblinks
- Lidar and Point Cloud Processing
- 3-D line plot
- Ground Plane and Obstacle Detection Using Lidar
- LiDAR Processing
- LiDAR Data Processing
Literatur
- Lothar Papula: Mathematik für Ingenieure und Naturwissenschaftler - Anwendungsbeispiele: 222 Aufgabenstellungen aus Naturwissenschaft und Technik mit ausführlich kommentierten Lösungen. Verlag: Wiesbaden : Vieweg+Teubner Verlag, 2012, ISBN 978-3-834-82129-4.
- Reinhard Lerch: Elektrische Messtechnik Analoge, digitale und computergestüzte Verfahren. Springer-Verlag Berlin Heidelberg 2007, ISBN 978-3-540-73610-3.
- Lars Schnell: LiDAR – Funktionsweise und Anwendungsgebiete in der VFX-Industrie Bachelorarbeit im Studiengang Audiovisuelle Medien. Hochschule der Medien Stuttgart, 2016, url: [1]
---
→ zurück zur Übersicht: WS 18/19: Fachpraktikum Elektrotechnik (MTR)