Projekt 34: BrickPi Videoverarbeitung: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
(42 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''''[[Kategorie:Projekte]] | '''''[[Kategorie:Projekte]] | ||
Autoren: Sven Söbbeke, Kevin Penner<br/> | [[Datei:TankbotBrickPi.jpg|360px|mini|rechts|Abbildung 1: Der Roboter: Tankbot]] | ||
Das Projekt 34: BrickPi Videoverarbeitung des [[Fachpraktikum Elektrotechnik (WS 15/16)]] wurde im fünften Semester des Studiengangs Mechatronik durchgeführt. Es behandelt die Bild- bzw. Videoverarbeitung mit einem Raspberry Pi, sowie die Ansteuerung von Lego Mindstorm Motoren mit dem BrickPi (einer Zusatzplatine für den Raspberry Pi). Das zu detektierende Objekt ist ein Zebrastreifen auf einer Fahrbahn. | |||
<br/> <br/> Autoren: [[Benutzer:Sven_Soebbeke| Sven Söbbeke]], [[Benutzer:Kevin_Penner| Kevin Penner]]<br/> | |||
Betreuer: [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | Betreuer: [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | ||
Zeile 20: | Zeile 22: | ||
== Schwierigkeitsgrad == | == Schwierigkeitsgrad == | ||
Anspruchsvoll (***) | Anspruchsvoll (***) | ||
<br /><br /> | |||
= Planung = | = Planung = | ||
== Projektplanung == | == Projektplanung == | ||
[[Datei:ProjektplanBrickPi.jpeg|500px|mini|rechts|Abbildung | [[Datei:ProjektplanBrickPi.jpeg|500px|mini|rechts|Abbildung 2: Projektplan]] | ||
Zu Beginn des Projektes wurde zunächst ein Projektplan erstellt, dieser wurde in sechs Phasen aufgeteilt, diese Auteilung findet sich auch in Abbildung | Zu Beginn des Projektes wurde zunächst ein Projektplan erstellt, dieser wurde in sechs Phasen aufgeteilt, diese Auteilung findet sich auch in Abbildung 2 wieder: | ||
*Bau des Roboters | *Bau des Roboters | ||
Zeile 40: | Zeile 42: | ||
*2x EV3 Motoren | *2x EV3 Motoren | ||
*1x LEGO Mindstorms EV3 Education + Ergänzungsset | *1x LEGO Mindstorms EV3 Education + Ergänzungsset | ||
<br /> | |||
= Durchführung = | |||
== Roboter == | |||
Der Roboter, wie er in Abbildung 1 zu sehen ist, wurde mithilfe der Anleitung vom "Tankbot"(Name des Modells) nachgebaut. Allerdings wurden anstatt der Ketten, Reifen verwendet, was den Vorteil besitzt, dass das Kamerabild nicht verwackelt. Des Weiteren wurde an der Stelle des Gyrosensors eine Webcam montiert. Dies waren die einzigen Änderungen, die am "Tankbot" durchgeführt worden sind. Der Link zur Bauanleitung befindet sich unter den weiterführenden Links. | |||
== Software == | == Software == | ||
[[Datei: | [[Datei:Programmablaufplan.JPG|right|200px|mini|Abbildung 3: Programmablaufplan: Detektion von Zebrastreifen]] | ||
[[Datei: | [[Datei:Programmbrickpi.jpeg|300px|mini|right|Abbildung 4: Simulink Blockschaltbild]] | ||
=== Bild/Videoverarbeitung === | |||
Die Anforderungen an die Bildverarbeitung war es, ein Zebrastreifenmuster auf einer Fahrbahn zu erkennen. Ist dies der Fall, wird ein high am Ausgang der Funktion angelegt, welches z.B. einen langsamen Bremsvorgang auslösen könnte. | Die Anforderungen an die Bildverarbeitung war es, ein Zebrastreifenmuster auf einer Fahrbahn zu erkennen. Ist dies der Fall, wird ein high am Ausgang der Funktion angelegt, welches z.B. einen langsamen Bremsvorgang auslösen könnte. | ||
So wurde zunächst ein Programmablaufplan geschrieben (siehe Abbildung | So wurde zunächst ein Programmablaufplan geschrieben (siehe Abbildung 2), welcher folgende Schritte enthält: | ||
* | *Vorbereitung: | ||
* | **Wahl eines geeigneten ROI je nach Position und Neigungswinkel der Kamera | ||
* | **Einstellung der Mindestanzahl an zu detektierenden Streifen, damit es sich dabei um einen Zebrastreifen handelt | ||
**Wahl eines passenden Schwellwertes für die Binarisierung des Grauwertbildes. Hier stellte sich raus, dass höhere Werte gute Ergebnisse erzielen, da so dunklere Gebiete herausgefiltert werden und die weißen Zebrastreifen gut detektiert werden können. | |||
*Laden eines neuen Frames | |||
== | *Bildbearbeitung: | ||
**Umwandlung eines RGB-Bildes in ein Grauwertbild | |||
**Kantenglättung mit einem Median-Filter | |||
**Binarisierung des Bildes mit einem vorher eingestellten Schwellwert | |||
*Zebrastreifendetektion: | |||
**Horizontales Scannen des Bildes zum Erfassen von Kanten | |||
**Bei Detektion von der eingestellten Mindestanzahl an Streifen mit einer Mindestpixelhöhe von 10 (experimentell ermittelt), wird ein "1" zurückgegeben, sonst eine "0" | |||
<br /> | |||
Anhand dieses Programmablaufes wurde ein Simulinkmodell erstellt (siehe Abbildung 3) mit einem selbstgeschriebenen Matlabfunktionblock, der als Eingabeparameter die Koodrdinaten für die ROI, die Mindestanzahl an zu detektierenden Streifen und das Binärbild erhält. Die Ausgabe "1" (Zebrastreifen detektiert) oder "0" (kein Zebrastreifen) wird dann auf einem Display angezeigt. Für die Anbindung des Raspberry Pi in Matlab/Simulink wurde das Simulink Support Package von MathWorks installiert (siehe unter weiterführende Links). | |||
<br /> | |||
=== Motoransteuerung === | |||
Für das Ansteuern der Lego Mindstorm Motoren über den BrickPi entstanden einige Probleme. So ist es nicht möglich die Motoren über Matlab/Simulink anzusprechen, da es weder interne noch externe öffentliche Bibliotheken bzw. Toolboxen für den BrickPi gibt. Jedoch gelingt das Ansteuern der Motoren über C/C++ oder Phyton auf einer Linux Distribution (abgewandeltes Raspbian Betriebssystem von Dexter Industries: Tutorial unter weiterführende Links). Für die Bildverarbeitung wurde hierfür die Open Source Bildverarbeitungsbibliothek: OpenCV genutzt (Webseitenlink unter weiterführende Link). Dabei stellte sich heraus, dass die Kompatibilität zwischen der BrickPi- und OpenCV Bibliothek nicht gewährleistet war. | |||
Aufgrund dessen wurde die Motorsteuerung zunächst vernachlässigt und das Hauptaugenmerk auf die Bildverarbeitung in Matlab/Simulink gelegt. | |||
= Fazit und Ausblick = | = Fazit und Ausblick = | ||
Zeile 68: | Zeile 85: | ||
== Lernerfolge == | == Lernerfolge == | ||
[[Datei:Lernerfolg.jpeg| | [[Datei:Lernerfolg.jpeg|600px|Abbildung 5: Lernerfolg]] | ||
== Verbesserungsmöglichkeiten == | |||
=== Algorithmus Bildverarbeitung === | |||
*Implementierung einer dynamischen Schwellwertermittlung für die Binarisierung | |||
=== Entwicklungsumgebung mit dem BrickPi === | |||
*Kompatibilität zwischen Matlab/Simulink erzeugen | |||
*Kompatibilität zwischen den BrickPi Treibern von Dexter-Industries und der Bildverarbeitungsbibliothek OpenCV schaffen | |||
=== Hardware === | |||
*Verwenden des Raspberry Pi 2 zur Verbesserung der Performance (benötigt in der Bildverarbeitung) | |||
*Verwendung der Kamera von Raspberry Pi | |||
*Einrichtung einer WIFI Verbindung zwischen Raspberry Pi und PC | |||
= Weiterführende Links = | |||
[http://www.fabiandeitelhoff.de/2015/11/lego-mindstorms-ev3-education-offizielle-bauanleitungen/ Bauanleitung für "Tankbot" (Aufgerufen am 26.11.2015)] | |||
<br /> | |||
[http://www.dexterindustries.com/brickpi-tutorials-documentation/ Tutorial zur Installation und Konfiguration des Raspberry Pi mit dem Zusatzmodul BrickPi von der Firma: Dexter Industries (Aufgerufen am 04.02.2016)] | |||
<br /> | |||
[http://opencv.org/ Bildverarbeitungsbibliothek: OpenCV (Aufgerufen am 04.02.2016)] | |||
<br /> | |||
[http://de.mathworks.com/hardware-support/raspberry-pi-matlab.html/ Matlab/Simulink Support Package für Raspberry Pi (Aufgerufen am 04.02.2016)] | |||
---- | ---- | ||
→ zurück zum Hauptartikel: [[Fachpraktikum_Elektrotechnik_(WS_15/16)|Fachpraktikum Elektrotechnik (WS 15/16)]] | → zurück zum Hauptartikel: [[Fachpraktikum_Elektrotechnik_(WS_15/16)|Fachpraktikum Elektrotechnik (WS 15/16)]] |
Aktuelle Version vom 5. Februar 2016, 19:14 Uhr
Das Projekt 34: BrickPi Videoverarbeitung des Fachpraktikum Elektrotechnik (WS 15/16) wurde im fünften Semester des Studiengangs Mechatronik durchgeführt. Es behandelt die Bild- bzw. Videoverarbeitung mit einem Raspberry Pi, sowie die Ansteuerung von Lego Mindstorm Motoren mit dem BrickPi (einer Zusatzplatine für den Raspberry Pi). Das zu detektierende Objekt ist ein Zebrastreifen auf einer Fahrbahn.
Autoren: Sven Söbbeke, Kevin Penner
Betreuer: Prof. Schneider
Aufgabe
Nutzen Sie Matlab/Simulink, einen Raspberry Pi, das Shield BrickPi und eine Webcam, um ein Objekt zu erkennen.
Erwartungen an die Projektlösung
- Lesen Sie eine Webcam mit dem BrickPi und Matlab‐Simulink aus.
- Verarbeiten Sie das Videobild mit Matlab/Simulink (z. B. rote Ball erkennen)
- Bauen Sie einen NXT oder EV3 Roboter.
- Steuern Sie über Matlab/Simulink und BrickPi Ihren Roboter an, so dass er auf das Videobild reagiert und eine Aktion ausführt.
- Modellbasierte Programmierung der Hardware via Target Installer
- Wiss. Dokumentation der Lösung und Funktionsnachweis
- Live Vorführung während der Abschlusspräsentation
Nachtrag: Sollte sich die Integration in Simulink als zu kompliziert herausstellen, ist eine Realisierung mit der Programmiersprache C empfehlenswert.
Schwierigkeitsgrad
Anspruchsvoll (***)
Planung
Projektplanung
Zu Beginn des Projektes wurde zunächst ein Projektplan erstellt, dieser wurde in sechs Phasen aufgeteilt, diese Auteilung findet sich auch in Abbildung 2 wieder:
- Bau des Roboters
- Erstellung des Algorithmus für die Bildverarbeitung in Matlab
- Ansprechen der Motoren
- Erstellung des Algorithmus für die Bildverarbeitung in Simulink
- Erstellung der Projektpräsentation
- Erstellung der Projektdokumentation
Verwendete Bauteile
- 1x Raspberry Pi
- 1x Brick Pi
- 1x Webcam
- 2x EV3 Motoren
- 1x LEGO Mindstorms EV3 Education + Ergänzungsset
Durchführung
Roboter
Der Roboter, wie er in Abbildung 1 zu sehen ist, wurde mithilfe der Anleitung vom "Tankbot"(Name des Modells) nachgebaut. Allerdings wurden anstatt der Ketten, Reifen verwendet, was den Vorteil besitzt, dass das Kamerabild nicht verwackelt. Des Weiteren wurde an der Stelle des Gyrosensors eine Webcam montiert. Dies waren die einzigen Änderungen, die am "Tankbot" durchgeführt worden sind. Der Link zur Bauanleitung befindet sich unter den weiterführenden Links.
Software
Bild/Videoverarbeitung
Die Anforderungen an die Bildverarbeitung war es, ein Zebrastreifenmuster auf einer Fahrbahn zu erkennen. Ist dies der Fall, wird ein high am Ausgang der Funktion angelegt, welches z.B. einen langsamen Bremsvorgang auslösen könnte. So wurde zunächst ein Programmablaufplan geschrieben (siehe Abbildung 2), welcher folgende Schritte enthält:
- Vorbereitung:
- Wahl eines geeigneten ROI je nach Position und Neigungswinkel der Kamera
- Einstellung der Mindestanzahl an zu detektierenden Streifen, damit es sich dabei um einen Zebrastreifen handelt
- Wahl eines passenden Schwellwertes für die Binarisierung des Grauwertbildes. Hier stellte sich raus, dass höhere Werte gute Ergebnisse erzielen, da so dunklere Gebiete herausgefiltert werden und die weißen Zebrastreifen gut detektiert werden können.
- Laden eines neuen Frames
- Bildbearbeitung:
- Umwandlung eines RGB-Bildes in ein Grauwertbild
- Kantenglättung mit einem Median-Filter
- Binarisierung des Bildes mit einem vorher eingestellten Schwellwert
- Zebrastreifendetektion:
- Horizontales Scannen des Bildes zum Erfassen von Kanten
- Bei Detektion von der eingestellten Mindestanzahl an Streifen mit einer Mindestpixelhöhe von 10 (experimentell ermittelt), wird ein "1" zurückgegeben, sonst eine "0"
Anhand dieses Programmablaufes wurde ein Simulinkmodell erstellt (siehe Abbildung 3) mit einem selbstgeschriebenen Matlabfunktionblock, der als Eingabeparameter die Koodrdinaten für die ROI, die Mindestanzahl an zu detektierenden Streifen und das Binärbild erhält. Die Ausgabe "1" (Zebrastreifen detektiert) oder "0" (kein Zebrastreifen) wird dann auf einem Display angezeigt. Für die Anbindung des Raspberry Pi in Matlab/Simulink wurde das Simulink Support Package von MathWorks installiert (siehe unter weiterführende Links).
Motoransteuerung
Für das Ansteuern der Lego Mindstorm Motoren über den BrickPi entstanden einige Probleme. So ist es nicht möglich die Motoren über Matlab/Simulink anzusprechen, da es weder interne noch externe öffentliche Bibliotheken bzw. Toolboxen für den BrickPi gibt. Jedoch gelingt das Ansteuern der Motoren über C/C++ oder Phyton auf einer Linux Distribution (abgewandeltes Raspbian Betriebssystem von Dexter Industries: Tutorial unter weiterführende Links). Für die Bildverarbeitung wurde hierfür die Open Source Bildverarbeitungsbibliothek: OpenCV genutzt (Webseitenlink unter weiterführende Link). Dabei stellte sich heraus, dass die Kompatibilität zwischen der BrickPi- und OpenCV Bibliothek nicht gewährleistet war. Aufgrund dessen wurde die Motorsteuerung zunächst vernachlässigt und das Hauptaugenmerk auf die Bildverarbeitung in Matlab/Simulink gelegt.
Fazit und Ausblick
Erfüllte Aufgaben des Projektes
- Auslesen einer Webcam mit dem BrickPi und Matlab/Simulink
- Verarbeiten eines Videobildes mit Matlab/Simulink und Erkennung eines Zebrastreifens
- Bau eines NXT oder EV3 Roboters
- Modellbasierte Programmierung der Hardware via Target Installer (Simulink Support Package für Raspberry Pi Hardware)
- Wissenschaftliche Dokumentation der Lösung und Funktionsnachweis
- Live Vorführung während der Abschlusspräsentation
Lernerfolge
Verbesserungsmöglichkeiten
Algorithmus Bildverarbeitung
- Implementierung einer dynamischen Schwellwertermittlung für die Binarisierung
Entwicklungsumgebung mit dem BrickPi
- Kompatibilität zwischen Matlab/Simulink erzeugen
- Kompatibilität zwischen den BrickPi Treibern von Dexter-Industries und der Bildverarbeitungsbibliothek OpenCV schaffen
Hardware
- Verwenden des Raspberry Pi 2 zur Verbesserung der Performance (benötigt in der Bildverarbeitung)
- Verwendung der Kamera von Raspberry Pi
- Einrichtung einer WIFI Verbindung zwischen Raspberry Pi und PC
Weiterführende Links
Bauanleitung für "Tankbot" (Aufgerufen am 26.11.2015)
Tutorial zur Installation und Konfiguration des Raspberry Pi mit dem Zusatzmodul BrickPi von der Firma: Dexter Industries (Aufgerufen am 04.02.2016)
Bildverarbeitungsbibliothek: OpenCV (Aufgerufen am 04.02.2016)
Matlab/Simulink Support Package für Raspberry Pi (Aufgerufen am 04.02.2016)
→ zurück zum Hauptartikel: Fachpraktikum Elektrotechnik (WS 15/16)