Projekt 81: Inbetriebnahme und Objekttracking des LiDAR-Lite v3
→ 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 eigenen 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 wird Ansätze zur Umgebungsüberwachung des Fahrzeuges benötig. Dementsprechend hat sich das Team für ein LiDAR-System zur Objektdetektion und -tracking. Dafür werden Kenntnisse in der Fachgebiet, wie Mechanik, Elektrotechnik und Informatik, benötigt. Im späteren Einbau auf dem Fahrzeug wird ein 360-Grad Erfassung benötig. Parallel zu dieser Projekt läuft das Projekt "3D-Schwenkeinheit für einen LiDAR-Lite v3", das die Halterung und den rotatorischen Teil des LiDAR-System konstruiert.
Die Aufgaben werden in die drei Fachbereiche der Mechatronik eingeteilt:
Mechanik:
- Bau einer temporären Prototypen Schwenkeinheit zu Testzwecken
- Funktionstest des Prototypen
Elektrotechnik:
- Bauteile mit dem Arduino verbinden
- Funktionstest auf korrekte Verdrahtung
Informatik:
- Programmierung Servomotoren und es Sensors
- Auswertung der erfassten Sensordaten
- Ausgabe in einem Diagramm
- Erstellen einer Point Cloud
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:
In der Durchführung wird das Projekt durchgeführt. Hierfür werden Programmablaufpläne erstellt und in Software umgewandelt.
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 Servomotoren
- Schwenkeinheit
- Kondensator 680 μF
Verwendete Software
- Arduino Software IDE 1.8.1
- MATLAB/Simulink 2018a
- Fritzing
- Processing
- Tortoise SVN
Projektdurchführung
Programm:
Wir haben zuerst die Möglichkeit der Programmierung eines LiDARS recherchiert. Um sicherzustellen, dass unser LiDAR funktionsfähig ist, haben wir als erstes Referenzobjekt ein Zollstock angelegt. Der LiDAR war ausreichend genau, sodass wir mit diesem Arbeiten konnten. Anschließend konnten wir mit der erstellen provisorischen Schwenkeinheit das Programm um ein 2D-Scan erweitern. Diesen 2D-Scan konnten wir nach erfolgreichen durchführen um ein 3D-Scan erweitern. Da die Vorgabe eines MATLAB/Simulink Programm war, wurde nun dieser Code so weit wie möglich übernommen und erweitert.
Schaltung:
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.
LiDAR:
Den LiDAR haben wir mit einem weiteren Referenzobjekt genauer überprüft. Dabei konnten wir sicherstellen, dass der Lidar bis zu 40m weit messen kann. Die Genauigkeit war sehr hoch und lag deshalb in einem Genauigkeitsbereich von einigen Millimetern. Auch wurden Oberflächen berücksichtig, sodass Papier oder ähnliches am besten funktioniert und Durchsichtige, sowie Reflektierende Objekte ein Problem darstellen.
Technische Übersicht des 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 |
LiDAR Funktionsweise
Der Sensor ermittelt die Entfernung mittels des Laufzeitverfahrens. Das heißt der Sensor sendet ein Laserstrahl aus und erhält anschließend durch eine Reflexion am Objekt ein Strahl zurück. Über diese Zeit kann die Entfernung ermittelt werden. Dafür nimmt man die Konstante von Licht: 299.792.458 m / s. Die Formel der Laufzeitmessung lautet:
(Zeitdifferenz)
(Lichtgeschwindigkeitskonstante)
(Brechungsindex)
Technische Übersicht des Servomotor HS-422
Eigenschaft | Daten |
---|---|
Betriebsspannung |
4.8V - 6.0V |
Betriebsgeschwindigkeit (4.8V) |
0.21sec/60° |
Drehbereich |
0-180° |
Abmessung |
40.6x19.8x36.6mm |
Hardwareaufbau
Datenblätter
Datenblatt: LiDAR Lite V3
Datenblatt: HS-422
Schaltplan
Steckplatine
Mathematischen Hilfsmittel und Programmcode
Für die Darstellung des Bildes werden Punkten einzeln aufgenommen. Ein Punkt wird in der kartesischen Koordinaten mit -, -, und -Wert gekennzeichnet. In diesem Projekt wurde zwei Servomotoren und den LiDAR Lite v3 zur Ermittlung von Punkten. Die Punkten werden somit in Kugelkoordinaten dargestellt. Der von LiDAR ermittelte Abstand wird als Radius , der obere und der untere Servomotor werden jeweils mit und gekennzeichnet. Für die spätere Montage im Fahrzeug des Carolo Cup AG werden wir uns per Konvention an Fahrzeugkoordinatensystem anhalten. Deshalb benennen wir bereits in dieser Projekt als YAW-Winkel und als PITCH-Winkel. Deshalb spielen Koordinatensystem 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 so 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);
zwischenspeicher = strsplit(received,' ');
%% Daten vorverarbeitung
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('============================================================')
%% Erstellung eines Point Cloud
disp('============================================================')
disp(' Messdaten laden ')
disp('============================================================')
tic;
xyzPoints = load('messwerte.xyz');
ptCloud = pointCloud(xyzPoints);
timePart = toc;
time = time + timePart;
disp('============================================================')
disp(' Laden der Daten erfolgreich. ')
disp([' benötigte Zeit: ', num2str(timePart), ' Sekunden'] )
disp('============================================================')
%% Festlegung von Intervellen
disp('============================================================')
disp(' Ausgabe der Ergebnissen ')
disp('============================================================')
tic;
radius = 300; % in Zentimeter
xRangeLimit = [-radius radius];
yRangeLimit = [-radius radius];
zRangeLimit =[-radius radius];
player = pcplayer(xRangeLimit, yRangeLimit, zRangeLimit);
Ergebnis
Zusammenfassung
Lessons Learned
- Projektplanung (in der Praxis)
- Funktionsweise eines LiDARS und dessen Verwendung
- Koordinatentransformation
- PointCloud
- Unvorhergesehene Probleme können zu einer Abweichung vom Projektplan führen.
- 3D-Plot
- Unterschied zwischen günstigen und teuren Servomotoren. (Genauigkeit, Fehleranfälligkeit, Qualität)
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
Weblinks
- Lidar and Point Cloud Processing
- 3-D line plit
- Ground Plane and Obstacle Detection Using Lidar
- LiDAR Processing
- LiDAR Data Processing
Literatur
--- → zurück zur Übersicht: WS 18/19: Fachpraktikum Elektrotechnik (MTR)