Legoteil Zählmaschine 2016: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(521 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Datei:LegoZählmaschine_Wiki_800px.jpg|640px|thumb|top|Legoteilzählmaschine im Überblick]]
[[Datei:LegoZählmaschine_Wiki_800px.jpg|400px|thumb|top|Abbildung 1: Legoteilzählmaschine im Überblick]]


In diesem Projekt ist die Hauptaufgabe die bereits vorhandene Legoteilzählmaschine in Soft- und Hardware so anzupassen, dass es weitere Anforderungen erfüllt.
Bei der HSHL Lego® Zählmaschine handelt es sich um eine Maschine, die automatisch Legoteile zählen und sortieren kann, um gegebenen Falls fehlende Lego®-Steine nachbestellen zu können. Es ist ein studentisches Projekt, welches in Rahmen des System-Entwurf-Praktikums des Studiengangs Mechatronik mit Schwerpunkt System Design Engineering im 6. Semester durchgeführt wurde. <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>


== Einleitung ==
'''Autoren:''' [[Benutzer:Adam_Fankhauser|Adam Fankhauser]], [[Benutzer:Christo_Tsibadze|Christo Tsibadze]], [[Benutzer:Kevin_Penner|Kevin Penner]], [[Benutzer:Niklas_Lingenauber|Niklas Lingenauber]], [[Benutzer:Sergej_Krause|Sergej Krause]], [[Benutzer:Simon_Hanemann| Simon Hanemann]]
Insbesondere sollen Baukästen anhand ihrer Baukastennummer eingegeben werden können, bevor die Teile dieses Baukastens physikalisch in den Bunker der Legoteilzählmaschine gefüllt werden. Alles folgende soll vollautomatisch ablaufen:
* Vereinzelung der Legoteile
* Zentrierung der Legoteile auf dem Band
* Bildverarbeitung der Legoteile. Die erkannten Legoteile sollen in einer Excel Liste anhand ihrer Lego Teilenummer abgeglichen werden, in welcher die Anzahl aller Legoteile in Bezug auf einen Baukasten vermerkt sind.
* Sortierung der Legoteile in drei Kategorien 'Erkannt', 'Nicht erkannt' und 'Erkannt - Fremdteil' <br />


'''Ergebnis'''
'''Betreuer:''' [[Benutzer:Ulrich Schneider|Prof. Schneider]]
Als Ergebnis soll eine Teileliste ausgegeben werden, in der vermerkt ist ob der Baukasten vollständig ist, also alle Legoteile gezählt wurden, die im Neuzustand des Baukastens darin vorhanden waren.<br />
Falls dies nicht der Fall ist, soll der Teileliste entnommen werden können, welche und wie viele Teile fehlen.


=== Aufbau der Maschine ===
Die Legoteilzaehlmaschine wurde als neues Projekt im SDE Praktikum von Null an geplant, konstruiert, beschafft und aufgebaut. Sie unterteilt sich in drei Förderbänder: <br />
* Förderband 1: Förderband als Stufenförderer mit 10mm hohen Stollen, um die Legoteile eines gesamten Baukastens aus dem Teilebunker zu befördern. Dieses ist in Höhe und Neigung einstellbar.
* Förderband 2: Förderband zum transportieren der Legoteile und zur ersten Vereinzelung. Durch den Stufenförderer sollen die Teile möglichst in einer Linie hintereinander auf Förderband 2 landen. Verstellbar in der Höhe
* Förderband 3: Durch die höhere Geschwindigkeit im Vergleich zu Förderband 2 soll Förderband 3 die Teile vereinzeln/auseinanderziehen. Dieses Förderband beinhaltet des Weiteren eine simple Zentrierung der Teile sowie die Bildverarbeitungsbox und einen Aussortiermechanismus am Ende des Bandes, um die verarbeiteten Legoteile in drei Gruppen zu unterteilen. Verstellbar in der Höhe.
* Schaltschrank: Der Schaltschrank beinhaltet die gesamte, sonst offen zugängliche, Elektronik und ist vor Förderband 3 auf der Holzplatte fest montiert.<br /><br />


=== Beschreibung der Komponenten ===
= Aufgabenstellung =
Neben den bereits genannten Förderbändern wurden folgenden Komponenten verbaut: <br />
Die vorhandene Legoteilzählmaschine (siehe [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015 Legoteilzählmaschine_2015] ) soll Soft- und Hardwaremäßig modifiziert werden, um weitere Anforderungen zu erfüllen.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
* Bildverarbeitungsbox: Der Prototyp zur Bildverarbeitungsbox ist noch nicht final montiert, liefert aber bereits sehr gute Ergebnisse. Näheres in Kapitel: '' 'Lichtbox-Tests' ''
<br /><br />
* Aussortierung: Vorerst ein Prototyp zur Aussortierung in drei Kategoriegn über zwei Servomotoren am Ende des dritten Bandes. Nähere Erläuterungen in Kapitel '' 'Konstruktion des Auswerfers für Teilesortierung' ''
<br />
* Teilezentrierung: Die provisorisch aus Holz konstruierte Aussortierung verhindert, dass Legoteile am Rand des Bandes liegen bleiben oder durch Kontakt mit der Bande in der Bildverarbeitung nicht erkannt werden können. Eine Überarbeitung und Konstruktion aus Aluminium ist hier wünschenswert.
== Liste der offenen Punkten vom letzten Semester ==
* Schaltschrank: Beinhaltet zwei Spannungswandler sowie einen Arduino MEGA 2560 mit selbst entwickelten Aufsteckboard zur Ansteuerung der Motoren, Servos sowie zum Auslesen von Infrarotsensoren und Potentiometern. Der Arduino dient als Schnittstelle zwischen MATLAB Software und Förderbandsystem und wird über die serielle Schnittstelle angesteuert (USB).
* Laptop: Der Laptop beinhaltet die Software zur Bildverarbeitung und ermöglicht in Zukunft durch Leistungsstarke Komponenten ein Livetracking zum Zählen und Sortieren der Legoeile.
* Webcam: Zur Anwendung kam eine Logitech C920 Webcam.


== Getting Started ==
*  [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit '''Neues 24 V Netzteil'''], 24V/10A Netzteil gegen 24V/20A austauschen, um Überlast beim Lauf aller Motoren zu verhindern. Neues Netzteil ist vorhanden.


===Einschaltreihenfolge===
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung '''Software zur Bildverarbeitung (BV)'''], Die Einbindung einer geeigneten Software zur Teileerkennung steht noch aus. Kommunikation mit Systems sowie Ansteuerung ist fertig. Bildverarbeitung mit 'String' als Output.


Im Folgenden wird der Ablauf zum Starten der Legoteilzählmaschine und einer erfolgreichen Verbindung mit dem PC beschrieben.
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT '''Bauteileliste in Excel'''], Die Excel Liste, welche alle Teile eines Baukasten erhält, muss mit dem Ergebnis der BV abgeglichen werden. Erkannte Teile in mindestens zwei möglichen Ausrichtungen müssen erkannt und in der Liste vermerkt werden.
Sofern alle Schaltschrank internen Verbindungen wie im Stromlaufplan belassen wurden, ist der Ablauf wie folgt einzuhalten:<br /><br />
1. PC einschalten und USB Webcam (Logitech C920) sowie die USB Verbindung zum Arduino MEGA mit dem PC Verbinden.<br />
2. Netzstecker für die Lichtbox einstecken, solange diese noch manuell über den Netzstecker eingeschaltet werden muss.<br />
3. Netzstecker für den Schaltschrank einstecken.<br />
4. Hauptschalter (seitlich am Schaltschrank) einschalten.<br />
5. MATLAB GUI starten und Bildverarbeitung bzw. Förderbandansteuerung über diese grafische Oberfläche durchführen.
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/06_MATLAB/04_GUI SVN Link zur GUI] <br />


=== Matlab Webcam Installation ===
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Auswerfer '''Servo für Teilesortierung'''], Identisches Servo wie bisher gegenüberliegend montieren, um drei Sortierfächer (Erkannt/Nicht Erkannt/Fremdteil) zu sortieren, Konstruktion, Bestellung wurde an Fr. König geleitet.
Da es bei der Einrichtung der USB-Kamera in MatLab des Öfteren zu Schwierigkeiten kam wird an dieser Stelle eine Anleitung zur Einrichtung dieser bereitgestellt.
Bei der Installation handelt es sich um das Support Package OS Generic Video Interface - Windows Video (winvideo)


[http://de.mathworks.com/help/imaq/installing-the-support-packages-for-image-acquisition-toolbox-adaptors.html Matlab Webcam Installation]
* '''Zeit bis zur Servoöffnung''', Das Delay zwsichen Befehl und öffnen der Servos muss ermittelt und je nach Geschwindigkeit angepasst werden. Es ist problemlos möglich, einen weiteren 'String' - Befehl als Buchstaben für die Verzögerungszeit einzubinden, String auslesen und verarbeiten muss in Arduino Software geschehen.


* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit '''Kabelkanal montieren'''], Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montieren


* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung '''Kamerahalterung'''], Konstruktion einer Kamerahalterung für die Logitech C920 WebCam Vorschlag: Brücke über Förderband.


== Bildverarbeitung ==
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung '''Bildverarbeitungskasten'''], Für die Bildverarbeitung muss eine der gebauten Bildverarbeitungsbox-Prototypen ausgewählt und montiert werden. Hierfür wurden Lichttests durchgeführt. Ergebnisse sind protokolliert [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Lichttests/ SVN Link zu den Lichttests], Prototypen der Lichtboxen vorhanden.


[[Datei:Bildverarbeitung_Beispiel.png|240px|thumb|right|Bildverarbeitung: Beispiel]]
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Teilezentrierung '''Teilezentrierung'''], Die provisorisch aus Holz gefertigte Teilezentrierung soll in fixierbarer Variante aus Aluminium gefertigt werden. Ergebnisse zu den Tests der Zentrierungsmethoden sind in [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Bauteilzentrierung/ diesem SVN Ordner] protokolliert, Prototypen der gewählten Teilezentrierung ist vor der Bildverarbeitungsbox verbaut.
[[Datei:Programmablaufplan_Bildverarbeitung_(Funktion).png|240px|thumb|right|Bildverarbeitung: Programmablaufplan]]


Die Bildverarbeitung wird mit der Software MatLab verarbeitet. Dazu wurde eine Funktion geschrieben, die von der GUI aufgerufen wird. Dieser wird ein Video-Objekt übergeben und liefert als Rückgabewert das verarbeitete Originalbild, ein Schwarz-Weiß-Bild der als Teile erkannten Flächen, ein daraus berechnetes maskiertes Originalbild und ein Schwarz-Weiß-Bild zur Kantenerkennung.
* '''Idee Software: Flexible Bildverarbeitungssoftware''', Durch definieren der Schnittstellen könnte in der GUI eine Einbindung frei wählbarer BV Software realisiert werden. Optimal geeignet um kleine Projekte dann an der Legoteilzaehlmaschine zu testen.
<br/>
** Wird in diesem Projekt nicht bearbeitet.
Zu Beginn der Funktion wird ein Snapshot, also eine Momentaufnahme, des übertragenen Live-Videos erstellt. Auf diesen Snapshot wird die Bildverarbeitung angewandt. Zur Rauschunterdrückung wird ein Medianfilter auf den Snapshot angewandt. Anschließend werden Bedingungen definiert, die dafür sorgen, dass das Förderband herausgefiltert wird. Dadurch wird ein Schwarz-Weiß-Bild (Boolean) erzeugt (Weiß = Legoteile, Schwarz = Förderband). Anhand dieses Bildes kann eine Segmentierung durchgeführt werden. Zur Kantenerkennung wird ein Gaussfilter auf das mediangefilterte Bild angewandt. Dadurch wird ein Bild erzeugt, dass die Wahrscheinlichkeit für eine Kante anzeigt. Um daraus ein Schwarz-Weiß_Bild (Boolean) zu erzeugen, wird ein Schwellwert angegeben.  
<br/>
Zusätzlich existiert eine Softwareversion die zusätzlich eine Segmentierung und Farberkennung durchführt, jedoch erfordert diese Version enorme Rechenleistung. Deshalb kann die Bildverarbeitung nicht in Echtzeit berechnet werden.  


=== SVN ===
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Tracking/Lego_Projekt SVN Link zur Bildverarbeitungs-Software]


<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


== Aufgabenteilung inkl. weiteren Aufgaben aus dem Pflichtenheft ==


== Matlab GUI ==
Es wurden für jede Aufgabe ein oder mehrere Verantwortliche(n) aus der Gruppe festgelegt. Jede Person ist dann dafür zuständig, dass diese Aufgaben erfüllt werden. Bei Bedarf steht dieser Person die ganze Gruppe zur Hilfe zur Verfügung.
[[Datei:GUI_Teach-In-Modus.png|320px|thumb|right|GUI: Acquisition-Modus]]
[[Datei:GUI_Acquisition-Modus.png|320px|thumb|right|GUI: Teach-In-Modus]]


Zur Ansteuerung der Legozählmaschiene wurde eine GUI entwickelt, die die notwendigen Funktionen besitzt, um den Zählprozess zu durchlaufen und um neue Teile einlesen zu können.
* [[Benutzer:Kevin_Penner|'''Kevin Penner:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Separierung_und_Zentrierung_der_Legoteile Separierung und Zentrierung der Lego-Teile]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Pflichtenheft_Dokumentation_in_DOORS Pflichtenheft Dokumentation mit Software "DOORS"]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
* [[Benutzer:Simon_Hanemann|'''Simon Hanemann:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#GUI GUI Programmierung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 Dokumentation in HSHL-Wiki]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# Video-Anleitung]
* [[Benutzer:Adam_Fankhauser|'''Adam Fankhauser:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit Elektr. Sicherheit]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung Bildverarbeitungs-Box Fixierung/Stabilisierung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# Video-Anleitung]
* [[Benutzer:Niklas_Lingenauber|'''Niklas Lingenauber:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT Datenbankanbindung IN/OUT und Listen]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Projektplan Projektplan]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# QM-Tests (nach Rücksprache mit Prof. Schneider auf das nächste Semester verlegt)]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
* [[Benutzer:Sergej_Krause|'''Sergej Krause:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Teach-IN Teach-IN Funktion]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT Datenbankanbindung IN/OUT und Listen]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Separierung_und_Zentrierung_der_Legoteile Separierung und Zentrierung der Lego-Teile]
* [[Benutzer:Christo_Tsibadze|'''Christo Tsibadze:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Projektplan Projektplan]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Prozessvisualisierung_mit_Visio Visualisierung von Prozessen mit "Visio"]


=== Aufbau ===


Die GUI besitzt zwei grundlegende Modi. Der Modus „Acquisition“ dient zur Erfassung von Legoteilen und ist die Voreinstellung. Über das Dropdown-Menü lässt sich das zu überprüfende Lego-Set auswählen. Die dazugehörigen Informationen werden aus einer Exceltabelle geladen. Das Feld Components zeigt an, wie viele Legoteile bereits erkannt wurden. Das Feld Running zeigt an, ob der Prozess in Betrieb ist. Das Feld Sending zeigt an, ob eine Nachricht an den Arduino Uno gesendet wird. Über die Buttons Load und Save lassen sich Einstellungen, die an den Motorreglern vorgenommen wurden, laden und speichern. Der Button Start startet die Motoren und die Bilderfassung und -verarbeitung. Über die Slider und Edit-Boxen lässt sich die Motorgeschwindigkeit von 0% bis 100% angeben.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Der Modus „Teach-In“ dient zur Erfassung neuer Teile. Über die Edit-Box Component ID wird die ID des zu erfassenden Teils eingetragen. Diese entspricht der offiziellen Nummer. Das Feld Check zeigt an, ob das Teil erfasst wurde oder ob es Probleme bei der Erfassung gab. Das Feld Running zeigt an, ob der Prozess in Betrieb ist. Das Feld Sending zeigt an, ob eine Nachricht an den Arduino Uno gesendet wird. Über die Buttons Load und Save lassen sich Einstellungen, die an den Motorreglern vorgenommen wurden, laden und speichern. Der Button Start startet die Motoren und die Bilderfassung und -verarbeitung. Über den Slider und die Edit-Box Speed Motor 3 lässt sich Motorgeschwindigkeit des letzten Förderbands von 0% bis 100% angeben. Das Feld Flächeninhalt gibt die erkannte Flächengröße in Pixel an. Das Feld Kantenlänge gibt die erkannte Flächengröße der Kanten in Pixel an. Das Feld Farbwerte zeigt die einzelnen Werte in RGB an und zusätzlich ein Beispiel der erkannten Farbe. Zusätzlich werden zwei Felder angezeigt, die den erkannten Flächeninhalt und die erkannten Kanten des Teils anzeigen.


Zur Kommunikation zwischen Matlab und Arduino Uno wird eine serielle Schnittstelle genutzt. Nähere Informationen dazu finden sich im Kapitel [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015#Kommunikation_Matlab_mit_Arduino Kommunikation Matlab mit Arduino]
= Projektplan =


=== SVN ===
[[Datei:Aufgabenteilung_Projektplan.jpg|600px|thumb|left|Abbildung 2: Aufgabenstellung und Projektplan]]
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/GUI SVN Link zur GUI]
[[Datei:Projektplan Legozählmaschine1.png|300px|thumb|right|Abbildung 3: Projektplan]]
<br />
'''Meilensteine für das 6. Semester mit Deadlines:'''


* 06.06.2016: Hardware und Software Inbetriebnahme
** Inbetriebnahme "Erprobung von Sensoren und Aktoren"
** Automatische Sortierung von mind. 30 Teilen
** Sortierung: Erkannt und Nicht-Erkannt
** Bildverarbeitung in "Echtzeit" am PC
** Ausgabe der Inventurliste


* 24.06.2016: Algorithmen:
** Optimierung der Bildverarbeitung
** Automatische vollständige Sortierung: NXT-Basis + Erweiterung
** Planung und Beschaffung der Hardware-Änderung (Auswerfer) für die nächste Projektphase


== Kommunikation Matlab mit Arduino ==
* 14.11.2016: wird noch festgelegt, entweder Auswerfer- oder Separierung vor der BV Optimierung
=== String zur Ansteuerung der Förderbänder und der Servomotoren ===
* 16.01.2016: Algorithmen Optimierung, Teach-In XT/EV3 und Report
Die Kommunikation zwischen Matlab und dem Arduino wird über die serielle Schnittstelle realisiert.  
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Alle nötigen Informationen werden als String von MATLAB an den Arduino geschickt, wo der String ausgelesen und seinen Variablen zugeordnet wird.<br />
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
Ein kompletter Motorstring zum Anschalten der Förderbänder würde beispielsweise wie folgt aussehen: S1A030B075C100;<br />
<br /><br /><br /><br /><br /><br /><br /><br /><br />
Erzeugt wird der benötigte String aus der GUI in MATLAB heraus, sodass der Nutzer nicht direkt mit diesem Format in Berührung kommt.<br />
Die Interpretation und Bedeutung der Daten ist der Tabelle innerhalb diesen Kapitels zu entnehmen.


Unabhängig von der eingestellten Geschwindigkeit wird diese über eine Anlauffunktion in der Arduino-Software Schrittweise erreicht. Sobald das erste Förderband seine Sollgeschwindigkeit erreicht hat, wird das nächste Band über die Anlauffunktion gestartet. Somit wird verhindert, dass alle drei Motoren gleichzeitig starten, was einen hohen Anlaufstrom von insgesamt etwa 30A zur Folge hätte. Die Reihenfolge der Förderbandanläufe ist durch die Reihenfolge Band 3, Band 2, Band 1 so gewählt, dass nach einem Stillstand des Systems zuerst alle alten Legoteile von den Förderbändern transportiert werden können. Es werden dadurch auch erst neue Teile auf die Bänder 2 und 3 befördert, wenn diese bereits ihre Sollgeschwindigkeit erreicht haben. Das verhindert eine Häufung der Teile und ermöglicht eine Vereinzelung der beförderten Legoteile.
= Realisierung =
== Main-Funktion ==


Der String wird folgendermaßen aufgebaut und interpretiert:
[[Datei:MAIN.jpg|300px|thumb|right|Abbildung 4: Aufbau der Main-Funktion]]
Die Mainfunktion ist das Hauptprogramm der Legozählmaschine. Sie ruft nach Start des Programmes alle weiteren Module und Funktionen auf.
Zu Beginn des Programmes startet die Main-Funktion eine Initialisierung. Hier werden allgemeingültige Aspekte, wie globale Variablen, Verbindungen zu Datenbank oder Kamera und Einstellungen vorgenommen. Anschließend wird ein Grafisches User-Interface aufgerufen, welches dem User ermöglicht die Legozählmaschine zu steuern. Sind notwendige Schritte wie die Auswahl von Baukästen oder dem manuellen Zählen von Bauteilen, die die Maschine nicht erkennen kann abgeschlossen, startet die automaische Erkennung der Legoteile. Der Anwender muss hier den Inhalt einer Kiste in den Förderbunker geben, die Maschine befördert die Teile automatisch in den Kamera-Raum und ermittelt durch Bildverarbeitung die enntsprechenden Bauteile. Nach Beendigung des automatischen Zählprozesses werden die Ergebnisse des manuellen und des automatischen Zählens in einer Liste zusammengefasst und die gewonnen Informationen können in einer Inventurliste ausgegeben werden. Fehlende Legoteile werden in einer seperaten Fehlteilliste ausgegeben.


{| class="wikitable"
! width="10%" | Buchstabe
! width="10%" | Wert
! width="25%" | Beschreibung
! width="55%" | Funktion
|-
|S
|0 oder 1
|Status der Förderbänder
|Status gibt an ob die Förderbänder Ein-(1) oder Ausgeschaltet(2) werden sollen
|-
|A
|000-100
|Geschwindigkeit Band 1
|Prozentuale Geschwindigkeit des Stufenförderers (Band 1)
|-
|B
|000-100
|Geschwindigkeit Band 2
|Prozentuale Geschwindigkeit des mittleren Förderbandes (Band 2)
|-
|C
|000-100
|Geschwindigkeit Band 3
|Prozentuale Geschwindigkeit des letzten, kurzen Förderbandes (Band 3)
|-
|Z
|1-3
|Zuordnung Legoteil
|Öffnet / Schließt Schranken zur Sortierung der durchlaufenden Legoteile <br /> Z1 = Teil erkannt, gehört zum Set -> Durchlauf <br /> Z2 = Teil erkannt, gehört nicht zum Set -> Linke Schranke öffnen <br /> Z3 = Unbekanntes Teil -> Rechte Schranke öffnen
|-


|}


=== Arduino MEGA 2560 mit Aufsteckboard ===
'''Quellcode Matlab:''' [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/main.m main.m]
[[Datei:Blockschaltbild Arduino.png|500px|thumb|right|Blockschaltbild des Arduinos]]
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Zur Ansteuerung der drei Gleichstrommotoren, der zwei Servomotoren und der Verwendung von bis zu zwei Infrarotsensoren über den Arduino wurde ein Aufsteckboard entwickelt und angefertigt.<br />
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
Der Link [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/11_MotorShield_MEGA/ SVN Link zur Dokumentation des Aufsteckboards] führt zur ausführlichen Dokumentation des Aufsteckboards mit Stückliste, fertigen Schaltplänen und dem Layout sowie der Pinbelegung zum Arduino MEGA. Zum generellen Verständnis dient das Blockschaltbild des Arduinos.<br /><br />
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
'''Inputs'''<br />
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
Potentiometer 1 - 3:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Werden vorerst zur manuellen Geschwindigkeitseinstellung der Bänder genutzt, falls dies in der Arduino Software als '' '#define' '' festgelegt wurde.<br />
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
Infrarotsensor 1 & 2:&nbsp;&nbsp; Einer der Sensoren soll als Absicherung der berechneten Öffnungszeit der Sortierschranken dienen. Die Infrarotsensoren sind noch nicht implementiert.<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
Seriell / USB:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Verbindung zum Laptop muss Aufgrund der seriellen Kommunikation immer bestehen.<br /><br />
 
== GUI ==
 
Unter '''GUI''' (Graphical User Interface oder auch Grafische Benutzeroberfläche versteht man die Die Schnittstelle eines Programms für einen Menschlichen Nutzer. GUI dienen meist zu Eingabe und Ausgabe von Werten die durch ein Hauptprogramm berechnet werden, dabei haben GUI in der Regel nur wenig Rechenaufwand und dienen dem Benutzer Komfort.
Die GUI der HSHL Legoteil-Zählmaschine lässt sich in folgende Bereiche aufteilen:
* Auswahl des Baukastens
* Manuelles Zählen der Bauteile
* Autonomes Zählen der Bauteile
* Korrektur des autonomen Zählens
 
 
In jedem Schritt gibt es die Möglichkeit auf Hilfe zuzugreifen. Man findet einen „Hilfe“-Knopf in der Taskleiste oben links.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
 
===Auswahl der Baukästen===
Im ersten Schritt müssen die Baukästen ausgewählt werden, die gezählt werden sollen. Es ist derzeit jedoch nur möglich einen Kasten aus zu wählen. In Zukunft soll es die Möglichkeit geben, zwei Kästen gleichzeitig auswählen zu können (Beispielsweise ein Hauptkasten und Zusatzkasten).
Die Auswahl des Baukastens ist für die folgenden Schritte von Bedeutung.
Sollte mindestens ein Kasten ausgewählt werden, so kann man mit dem nächsten Schritt dem manuellen Zählen fortfahren.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
 
 
 
[[Datei:Schritt1 Auswahl der Baukaesten.JPG|250px|center|thumb|Abbildung 5: GUI Auswahl der Baukästen]]
 
===Manuelles Zählen===
Wenn der im ersten Schritten gewählte Kasten Legoteile besitzt, die für den Zählprozess ungeeignet sind, müsse diese Teile vom Benutzer der Zählmaschine manuell gezählt werden. In diesem Schritt wird eine Tabelle mit den wichtigsten Eigenschaften der manuellen Teile gezeigt. Zudem wird dem Benutzer ein Bild des jeweiligen Bauteils angezeigt was er gerade in der Tabelle markiert.
Ein Fortfahren ist nur möglich, wenn der Benutzer für jedes Teil eine positive ganze Zahl eingibt.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
 
 
[[Datei:Schritt2 Manuelles Zaehlen.JPG|250px|center|thumb|Abbildung 6: GUI Manuelles Zählen]]
 
===Autonomes Zählen===
Es taucht nur ein Hinweisfenster Auf welches den Benutzer informiert, dass der Autonome Zählprozess bereits begonnen hat.
Man kann den Prozess durch das Drücken von ESC beenden.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
 
===Korrektur des Autonomen Zählens===
Am Ende des Autonomen Zählprozess werden alle gezählten Teile angezeigt.
Sollten bei autonomen Zählprozess Teile falsch erkannt werden, so hat der Benutzer die Möglichkeit die die Anzahl der Teile noch einmal manuell zu korrigieren. Nicht gezählte Teile können aber auch zurück in den Zählprozess geführt werden.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
== Bildverarbeitung/Legoteil-Erkennung ==
 
=== Bildverarbeitung_Automatisches_Zaehlen ===
 
[[Datei:Bildverarbeitung_Main.jpg|300px|thumb|right|Abbildung 7: Bildverarbeitung_AutomatischesZaehlen]]
Die automatische Legoteilerkennung erfolgt mit der Unterfunktion: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\AutomatischesZaehlen.m AutomatischesZaehlen.m] und weiteren kleineren Unterfunktionen. Als Übergabeparameter bekommt die Funktion die Schnittstellen zu Webcam, Datenbank und die serielle Schnittstelle übergegeben und liefert als Rückgabe eine chronologische Liste mit Legoteil-IDs, welche beim automatischen Zählen erkannt wurden. Zu Beginn dieser Funktion werden einmalig diverse Parameter und Variablen angelegt und initialisiert. Anschließend wird in der äußeren Schleife Folgendes wiederholt (bis Betätigung der "Escape"-Taste) durchgeführt:
<br /><br />'''Bildverbesserung & Vorsegmentierung:'''<br />
* Bild bzw. Frame wird von der Kamera eingelesen
* Ränder werden weggeschnitten (ROI)
* normalverteiltes Rauschen entfernen (Gauß-Filter)
* Bild wird in Rot-, Grün- und Blauanteil zerlegt
* Mehrfache Binarisierung für die Segmentierung der einzelnen Legofarben + kleine Artefakte aus den Binärbilder filtern 
<br />
'''Nachbearbeitung:'''<br />
Bei einigen vorsegmentierten Farb-Binärbildern (z.B. bei einem roten Legoteil mit Bohrungen) wird der Schatten in den Bohrungen als schwarze Pixel bzw. "schwarzes Teil" interpretiert. Diese werden wie folgt aus dem schwarzen Binärbild entfernt:
# Die Binärbilder (außer das Binärbild, welches die schwarzen Legoteile beinhaltet) werden zusammenaddiert
# Beim entstandenen Binärbild wird die Closing Operation durchgeführt (Füllen von Löchern und Bohrungen) --> BW_CLOSING
# Die Löcher & Bohrungen aus dem schwarzen Binärbild (BW_SCHWARZ) werden entfernt mit:
BW_SCHWARZ = BW_SCHWARZ - BW_CLOSING
<br /><br />
 
Um zu verhindern, dass die nicht optimal ausgeleuchtete Bereiche (z.B. dunkelgrauer Bereich in einem hellgrauen Legoteil) als zwei unterschiedliche Legoteile erkannt werden, wird Folgendes durchgeführt:
# Alle Binärbilder werden addiert, wodurch ein Binärbild mit Objekten verschiedener Farben entsteht
# Leichte Dilatation führt zu Verbindung zweier sehr nah benachbarter Objekte (Schattierungen mit Legoteilen "verschmelzen")
 
<br />
'''Segmentierung mit folgenden Matlab-Funktionen:'''
* imclearborder: Entfernt alle weißen Pixel, welche eine Verbindung zum Bildrand besitzen (Objekte am Rand des Bildes) --> Objekte, deren Fläche nicht komplett von der Kamera erfasst werden, sind uninteressant
* bwareaopen: Entfernt kleine zusammenhängende Segmente (Artefakte), deren Pixelanzahl unter einem vorgegebenen Schwellwert liegen.
* Bwlabel: Die noch vorhandenen Objekte (Legoteile) im zusammenhängenden Binärbild werden mit einem Label versehen, damit jedes Objekt für sich betrachtet und ausgewertet werden kann
Die nachfolgenden Schritte werden in einer Schleife auf jedes gelabelte Objekt angewendet.
<br /><br />
 
'''Klassifikation:'''<br />
Merkmalsextraktion von jedem Objekt bzw. Legoteil (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Merkmalsextraktion Merkmalsextraktion]):
* SVN-Link: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]:
* Berechnung von Umfang, Fläche, Schwerpunkt, maximaler und minimaler Abstand vom Schwerpunkt zum Objektrand
<br />
Nachdem der Schwerpunkt vom erkannten Teil berechnet wurde, wird Folgendes überprüft:
* Der Flächenschwerpunkt (X-Koordinate) des Objektes befindet sich im mittleren Bildbereich
** Vorteile: Objekt wird nur in mittiger Position analysiert --> Genauigkeit steigt, da die Verzerrungseigenschaften aufgrund des Blinkwinkels auf allen Objekten gleich sind
* Der Flächenschwerpunkt (Y-Koordinate) befindet sich (inklusiver einer kleinen Toleranz) nicht an derselben Stelle, wie bei dem Legoteil, welches zuvor analysiert/gezählt wurde
** Vorteile: Ein Legoteil wird nicht doppelt gezählt, da bei einer genau waagerecht ausgerichteten Kamera, sich die Höhe des Flächenschwerpunktes nicht ändert
<br />
Falls ein Teil erkannt wird (nicht doppelt):
* Binärbild des Objektes wird an die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m] übergegeben, wo es einer Legofarbe zugeordnet wird (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Farberkennung Farberkennung]).
* Mit Hough-Transformation Kreise im Bild suchen (Matlab-Funktion: '''imfindcircles'''), da die Anzahl der gefunden Kreise als weiteres Merkmal dient
** Minimaler und maximaler Radius muss mit der Höhe der Kamera angepasst werden
* Abgleich der Merkmale des Objektes mit den eingetragenen Werten aus der Datenbank (inklusive modifizierbarer Toleranzen) mit der Funktion: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Datenbankabgleich.m Datenbankabgleich.m] (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbank Datenbank]). Diese erhält die Merkmale des Objektes und die Schnittstelle zur Datenbank als Übergabeparameter und liefert die ID des Legoteils zurück
** falls keine Überschneidung zwischen Merkmalen und Datenbank --> ID = 0
* ID wird in einer Liste gespeichert
* Sollte die ID nicht "0" sein, wird der serieller Schnittstelle (Arduino) signalisiert, dass zu diesem Zeitpunkt ein Teil erkannt wurde. Mithilfe der konstanten und bekannten Bandgeschwindigkeit wird dann der Auswerfer vom Arduino angesteuert (erkannte Legoteile werden gesammelt).
 
<br />
'''Beendigung des automatischen Zählprozesses:'''
<br />
Falls die "Escape"-Taste betätigt wird:
* Die Schleife (automatischer Zählprozess) wird unterbrochen
* Arduino wird signalisiert, die Laufbänder zu stoppen
* Eine Liste mit erkannten und fehlenden Teilen wird als Excel-Tabelle automatisch geöffnet.
 
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
<br />
<br />
 
=== Farberkennung ===
[[Datei:Farberkennung.jpg|300px|thumb|right|Abbildung 8: Farberkennung]]
<br />
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m]" bekommt als Übergabewerte zwei Matrizen:
* Original-Frame (RGB-Bild) und Binärbild vom erkannten Objekt
* mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).
** Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
* Anschließend werden Mittelwerte für Rot-, Grün- und Blau-Anteil berechnet.
<br />
Zuordnung zur nächstgelegenen Farbe:
* Es werden die RGB-Mittelwerte mit einer Farbtabelle verglichen:
** die Differenzen von jedem Farbanteil zur Farbtabelle werden ermittelt. Davon werden die Differenzen des Farbanteils mit dem größten Wert (Abweichung) gespeichert.
** Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> '''Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.'''
<br />
Die ermittelte Farbe wird als String zurückgegeben.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br /><br /><br /><br /><br />
 
=== Merkmalsextraktion ===
[[Datei:Merkmalsextraktion.png|300px|thumb|right|Abbildung 9: Merkmalsextraktion]]
<br />
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:
* Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
* Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
* Flächenschwerpunkt --> Pixelkoordinaten {x/y}
* Minimaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
* Maximaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
<br />
Die Berechnung der Fläche erfolgt über die Summenbildung der Zeilen und Spalten des Binärbildes. Da so nur die weißen Pixel addiert werden, handelt es sich hierbei nur um die Pixel, die zum Objekt gehören.<br />  
Die Schwerpunktskoordinaten lassen sich mit der Matlab-Funktion '''Regionprops''' berechnen, welche als Übergabeparameter das Binärbild des Objektes und die Option 'centroid' erhält.<br />
Mithilfe des Kantenbildes des Objektes (erzeugt mit der Matlab-Funktion '''bwperim'''), kann eine Liste mit allen Kantenkoordinaten erstellt werden (Matlab-Funktion: '''Regionprops(Kantenbild, 'Pixellist')'''). Aus der Differenz zwischen jedem einzelnen dieser Kantenpixel und dem Schwerpunkt bestimmt man nun die Abstände vom Schwerpunkt zum Rand, welche nach minimalen und maximalen Wert durchsucht werden.
Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.
<br />
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank. <br />
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox). <ref name="Autor: Penner"> Autor Kevin Penner</ref>
 
<br /><br /><br /><br />
 
== Teach-IN ==
Zur Ermittlung von Merkmals-Daten (Datenbank) für die einzelnen Legoteile, wurde die Main-Funktion (Bildverarbeitung) kurzzeitig modifiziert, so dass die Daten der Merkmale 10 Mal ermittelt und anschließend gemittelt wurden. Diese Werte wurden in eine Datenbank geschrieben, in welcher die Legoteile mit ihren zugehörigen IDs hinterlegt sind. Während der Datensammlung wurde jedes Legoteil einzeln 10 Mal nacheinander in die Bilderkennungsbox gefahren. Bei Legoteilen, welche aus mehreren Perspektiven andere Merkmale aufweisen, wurden mehrere Merkmals-Daten der ID zugeordnet.
 
Ein automatisches Teach-IN von neuen Legoteilen mit GUI-Anbindung wurde für das kommende Semester vorgesehen. Dort könnte ein Legoteil in kleinen Positionsschritten automatisch vom Band in die Kamerabox eingefahren werden. So wäre eine Aufnahme des Objektes aus verschiedenen Blickwinkeln möglich.
 
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref> <ref name="Autor: Penner"> Autor Kevin Penner</ref>
 
== Datenbankanbindung, Listen IN/OUT ==
=== Datenbank ===
[[Datei:UML-Design.PNG|thumb|right|Abbildung 10: Datenbank UML Diagram]]
Die Datenbank ist in MySQL implementiert und eine Verbindung mit Matlab wurde realisiert. Hinzukommt das alle Daten im Excel-Format vorhanden sind. Die Daten sind aufgeteilt in drei Excel Dateien, [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Teile-Kopie_fuer%20sql.xlsx Datenbank Teile-Kopie_fuer sql.xlsx], [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Kastendetails.xlsx Datenbank Kastendetails.xlsx], [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Kasten.xlsx Datenbank Kasten.xlsx], die die gesamte Datenbank representieren und alle einträge beinhaltet. Dies dient der Datensicherheit, da die Daten in getrennten Formaten und Speichermedien vorhanden sind. Die Struktur innerhalb der Tabellen sollte erhalten bleiben, aber die Daten innerhalb der Tupel können nach belieben manipuliert werden. In der Datei "InventurlisteErstellen_SQL.m" befindet sich ein Code, der die Daten in die gestartete SQL-Datenbank importieren kann. Dies ist aber nur möglich solange die Strucktur, Spaltennamen und Anzahl, bestehen bleibt.
 
 
Die Datenbank ist aufgeteilt in drei Tabellen, Legoteileliste, beinhaltet alle einzelnen Legoteile, Kastendetails, enthält die Nummer der Legokästen, und der Kasten Tabelle, die die Legoteile mit den Kästen verbindet. In der Tabelle Legoteileliste sollen alle Legoteile aufgenommen werden. Die Attribute für die Legoteile sind:
 
* '''DataID''', der Primarykey, ist als Autoincrement implementiert und versieht jedes neu hinzugefügte Legoteil automatisch mit einer eindeutigen ID
* '''LegoteileID''', entspricht der ID vom Hersteller Lego, kann in unserer Datenbank zweimal vorkommen, wenn das Legoteil mehrere Perspektiven hat
* '''Bezeichnung''', eine kurze Beschreibung des Legoteils, eine eindeutige Beschreibung wurde mit zurhilfenahme von Onlineshops realisiert (max. 30 charakter lang)
* '''Farbe''', die Farbe des Bauteils nach Hersteller Norm
* '''Form''', noch in Bearbeitung
* '''Umfang''', der Pixelumfang vom Teach-In Prozess
* '''Flaeche''', der Flaecheninhalt des Legoteils in Pixel vom Teach-In Prozess
* '''MaxSchwerpunkt''', der maximale Schwerpunkt vom Teach-In Prozess
* '''MinSchwerpunkt''', der minimale Schwerpuntk vom Teach-In Prozess
* '''Rundloch''', entspricht der Anzahl der vom Teach-In Prozess erkannten Löcher im Legoteil
* '''AnzPerspektiven''', gibt die gesamt Anzahl aller vorhandenen Perspektiven, unterschiedliche Lagen eines einzelnen Legoteils, die neue Werte für die oben genannten Attribute liefert, an
* '''Scanbar''', '1' oder '0', '1' bedeutet es kann von der Legoteil Zählmaschine erkannt werden, '0' bedeutet es muss manuell, per Hand, gezählt werden, zB. weil es zu groß ist
 
Die Tabelle Kastendetails besteht aus:
 
* '''KastenID''', der Primarykey, die vom Hersteller Lego vorgesehene Kastennummer, muss eindeutig sein
* '''Bezeichnung''', eine kurze Beschreibeung des Kasten bzw. den Namen des Kastens (max. 50 charakter lang)
 
Zu letzt die Tabelle Kasten, diese setzt sich zusammen aus einer LegoteileID, KastenID und Anzahl. Die Tabelle Kasten spiegelt die reale Welt wieder indem sie genau beschreibt welches Legoteil in welchem Kasten ist und wie oft dieses Legoteil in einem Kasten vorhanden ist:
 
* '''LegoteileID''', Primarykey mit KastenID, Forenkey auf Legoteileliste.LegoteileID, dementsprechend eine ID aus Legoteileliste,
                (LegoteileIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist)
* '''KastenID''', Primarykey mit LegoteileID, Forenkey auf Kastendetails.KastenID, dementsprechend eine ID aus Kastendetails,
            (KastenIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist)
* '''Anzhal''', die genaue Anzahl eines Legoteil in einem bestimmten Kasten entnommen von der Originalverpackung von Lego (max. vierstelliger Integer wert)
 
Um in Matlab auf die Zugriff auf die Datenbank zu haben muss XAMPP und der MySQL ODBC - Connector installiert und konfiguriert sein. Sobald dies geschehen ist, kann mit:
 
<source lang=matlab>
DatenbankVerbindung = database.ODBCConnection('Datenbank','root','');
</source>
 
eine Verbindung hergestellt werden. Danach kann man mit mit SQL Befehlen Daten aus der Datenbank extrahieren und einpflegen. Ein Beispiel:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/GUI/2016%20-%20GUI%20-%20Zaehlprozess/GUI_Database/getAllKasten.m getAllKasten.m]
 
In '''sqlquery''' wird der SQL-Befehl hinterlegt und mit '''exec(conn, sqlquery)''' wird der Befehl auf der Datenbank, die in '''conn''' spezifiziert ist, ausgeführt. Mit '''fetch(curs)''' wird das Ergebnis der SQL-Anfrage zurück gegeben, alles weitere ist eine manipulation der Struktur in der die Daten weitergeben werden sollen.
 
====Installation der Datenbank====
Für die Benutzung der Datenbank auf einem neun PC, müssen einige Dateien Installiert und Matlab Konfiguriert. Eine Schritt für Schritt Anleitung findet sich in der [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation\06_MATLAB\Einrichten%20der%20Datenbank.docx Einrichten der Datenbank.docx]. Hier folgt eine Kurzanleitung anhand der Schritt für Schritt Anleitung:
1. Download von [https://www.apachefriends.org/de/ XAMPP] und [https://dev.mysql.com/downloads/connector/odbc/ MySQL ODBC - Connector]
2. Installation von XAMPP und MySQL ODBC - Connector
3. Starte XAMPP -> starte Apache -> starte MySQL
4. Erstelle eine neue Datenbank (Benenne die Datenbank, so das sie eindeutig und ihren nutzen klar werden lässt)
5. Konfiguration von Matlab
5.1 Im oberen Reiter auf APPS gehen
5.2 Wähle unter den APPS den '''Database Explorer'''
5.3 Gehe im Menu auf New->ODBC - Configure ODBC data source
5.4 Füge als neue Datenquelle den '''MySQl ODBC Unicode Driver''' hinzu
5.5 Server Daten eingeben -> Name: Lego ; TCP/IP Server: 127.0.0.1 Port: 3306; User: root; Password: - (leer lassen); Database: eure erstellte Datenbank wählen
5.6 Alles bestätigen -> Verbidung hergestellt
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
 
=== Erstellung einer Inventurliste ===
Eine Anforderung an die Legoteil Zählmaschine ist, dass dem Anwender nach Abschluss des Zählprozesses eine Liste in Excel ausgegeben wird, in der die gezählten Teile und dessen Anzahl aufgelistet sind.
Dazu wurde zunächst eine Funktion InventurlistenTamplateMultiKaesten.m geschrieben, die aus der Datenbank die Bauteile ausliest, die in dem ausgewählten Baukästen enthalten sind und diese in eine Excel-Liste schreibt. Als Übergabeparameter benötigt die Funktion die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank. Als Rückgabewert gilt ein Cell-Array, welches den Inhalt der Inventurliste in Excel enthält.
 
 
Die Funktion InventurlistenTamplateMultiKaesten.m ist wie folgt implementiert:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste/InventurlistenTamplateMultiKaesten.m InventurlistenTamplateMultiKaesten.m]
 
 
Nach der Erstellung des Templates werden die Gezählten IDs in die Liste eingetragen. Dazu wird der Inhalt des Templates nach den entsprechenden IDs durchsucht und die dazugehörige Anzahl notiert. Durch den Angleich voll Soll- und Ist-Anzahl der einzelnen Legoteile, wird außerdem eine Fehlteilliste erstellt, die dem Anwender anzeigt, welche Teile in welcher Häufigkeit fehlen. Die Funktion InventurlisteFuellen.m benötigt ebenfalls die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank als Übergabeparameter.Außerdem werden die gezählten Legoteil-IDs und dessen Anzahl benötigt. Als Rückgabewert gilt erneut der Inhalt der Excel-Liste.
 
 
Die Funktion InventurlisteFuellen.m ist wie folgt implementiert:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste/InventurlisteFuellen.m InventurlisteFuellen.m]
 
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
 
== Separierung und Zentrierung der Legoteile ==
 
[[Datei:Zentrierung.jpg|300px|thumb|right|Abbildung 11: Zentrierung]]
=== Teilezentrierung ===
 
Die provisorisch aus Holz gefertigte Teilezentrierung wurde mit fixierbarer Variante aus Aluminium ersetzt. An den Zentrierungskomponenten wurden elastische Kunststoffstreifen geklebt und anschließend an den Alu-Profilen vor der Bildverarbeitungsbox festgeschraubt.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
 
=== Separierung ===
Die Separierung wurde mit Hilfe von Geschwindigkeitsdifferenzen an den Laufbandübergängen realisiert.
Je größer die Geschwindigkeitsdifferenzen, desto bessere ist die Separierung möglich.
Aber die Bilderkennung fungiert in diesem Punkt als "Flaschenhals", wenn das letzte Laufband zu schnell dreht, dann werden weniger Teile erkannt. Es wurden experimentell die optimalen Geschwindigkeiten für jedes Laufband ermittelt, so dass Separierung und Bilderkennung optimal laufen.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
 
== Elektronik und Sicherheit ==
 
[[Datei:Neues_Netzteil_24VDC.jpg|350px|thumb|left|Abbildung 12: 24VDC Installation]]
[[Datei:Kabelkanal.jpg|450px|thumb|right|Abbildung 13: Kabelkanal]]
[[Datei:Kamera_BildBox_Fixierung.jpg|450px|thumb|right|Abbildung 14: Kamera/Bildbox Fixierung]]


'''Outputs'''<br />
===Neues 24V Netzteil===
Motor 1-3:&nbsp;&nbsp;&nbsp; Pulsweitenmodulation zur Transistorschaltung, welche zur Ansteuerung der Förderbandmotoren dient. <br />
Motor 4&5:&nbsp;&nbsp; Pulsweitenmodulation für die Servomotoren, die am Ende des Bandes die erkannten Teile in die drei Kategorien '' 'Erkannt' '', '' 'Nicht erkannt' '' und '' 'Erkannt: Fremdteil' ''. <br /> <br />


== Konstruktion des Auswerfers für Teilesortierung ==
Wie in den offenen Punkten aus dem Artikel [[Legoteil Zählmaschine 2015]] beschrieben, benötigte die Lego Zählmaschine ein stärkeres Netzteil. Bei der Auslegung der Maschine wurde das Netzteil für die Versorgung der Bandmotoren zu klein dimensioniert und bei gleichzeitigem Anlaufen der Motoren ist es vorgekommen, dass das alte Netzteil mit einem maximalen Ausgangsstrom von 10 A sich aus Selbstschutz abgeschaltet hat. Hier wurde ein stärkeres Netzteil vom selben Hersteller mit 20 A maximalem Ausgangsstrom eingebaut. Dies besitzt eine etwas breite Bauweise, konnte aber durch leichte Änderungen im Schaltschrank installiert werden.<ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
[[Datei:Sortierung Legoteilzaehlmaschine.png|240px|thumb|right|Konstruktion der Sortierung]]
=== Beschreibung ===
Um in Zukunft die Legoteile in die drei Kategorien "Erkannt", "Nicht erkannt" und "Erkannt - Fremdteil" einteilen zu können, sollen zwei Servos wie in Abbildung 'Konstruktion der Sortierung' zu sehen am Ende des Fürderbandes montiert werden.<br />
Zur Ansteuerung der Servos muss per Matlab der Zustand des jeweiligen Teiles als String ('' 'Z1' '', '' 'Z2' '' oder '' 'Z3' '') auf die serielle Schnittstelle geschrieben werden.


=== Konstruktion und Ansteuerung ===
===Kabelkanal===
In dem Bild 'Konstruktion zur Sortierung' ist eine Draufsicht des Endes des letzten Förderbandes zu sehen. Die Idee ist, zwei Servomotoren mit jeweils einer Art 'Schranke' auszustatten und diese im '' 'geschlossenen' '' Zustand weiter als gewöhnliche Bande fungieren zu lassen.
Die Ansteuerung der Servos über den Arduino und die Kommunikation der Information, welcher Speicher bedient werden soll, wurde bereits in dem Kapitel '' 'Kommunikation Matlab mit Arduino ' '' beschrieben.<br /><br />
Eine Möglichkeit der Montage dieser zwei Servos wäre, 20x20mm Boschprofil als eine Brücke über die Förderbänder zu bauen, um daran über Halterungen die Servos zu befestigen. Optimal wäre eine Einstellmöglichkeit in der Höhe, sodass diverse Schrankenvariationen gestestet werden können.


Ebenfalls in den offenen Punkten des Artikels [[Legoteil Zählmaschine 2015]] beschrieben, sollten die bisher provisorisch verlegten Leitungen fest verlegt werden. Hierzu wurde ein Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montiert. Er dient dem Schutz und der mechanischen Entlastung der Leitung. Es wurde ein geschlitzer Kabelkanal wewählt, da an vielen unterschiedlichen Stellen Leitungen z.B. zu den Motoren abgehen. So war es nicht nötig, einen geschlossenen Kabelkanal zu modifizieren, um die Leitungsabgänge möglich zu machen.<ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>




== Arduino - Steuerung der Förderbänder und Servomotoren ==
===Kamera/Bildbox- und Auswerferhalterung===
[[Datei:Programmablaufplan_Arduino.png|240px|thumb|right|Arduino: Programmablaufplan]]


Die Arduino-Software ist dafür zuständig die Förderbandmotoren und Servomotoren zu steuern. Vor der eigentlichen Ausführung der Ansteuerung werden Konstanten, Variablen und die Servomotoren initialisiert. Anschließend, werden die folgenden Schritte als unendliche Schleife ausgeführt. Zuerst wird überprüft, ob eine Nachricht im seriellen Port vorliegt. Ist dies der Fall, wird diese Nachricht analysiert (näheres dazu wird im Kapitel [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015#Kommunikation_Matlab_mit_Arduino Kommunikation Matlab mit Arduino] erläutert). Danach wird überprüft, welche Art der Motorsteuerung vorgesehen ist (GUI über seriellen Port oder Poti-Einstellung). Anschließend werden die Stellungen der Servomotoren berechnet und die Geschwindigkeit der Förderbänder eingestellt. Diese werden in der festen Reihenfolge Bildverarbeitung (Förderband 3) - Segmentierung (Förderband 2) - Trichter (Förderband 1) eingestellt.  
Die Bildbox und die Kamera waren bis zum jetzigen Zeitpunkt noch nicht befestigt und lagen lose auf dem Förderband auf. Dies barg die Gefahr, dass aus beide Teile aus ihrer beträchtlichen Höhe immer drohten herunterzufallen und irreperabel beschädigt zu werden. Zur Befestigung wurde "Boschprofil" mit den Zubehörwinkeln genutzt. Die Bildbox wurde so befestigt, dass sie über vier Schrauben Höhenverstellbar ist, um auch die Einfuhr von größeren Teilen möglich zu machen. Ebenso ist die Befestigung am Förderband mit vier Schrauben lösbar und damit die gesamte Konstruktion verschiebbar. Die Kamera wurde an der Bildboxbefestigung so fixiert, dass sie bei dieser Höhen- und Seitenverstellung immer an der selben Stelle verharrt. Dies ermöglicht eine ein mal eingestellte Kameraposition beizubehalten.


=== SVN ===
Ebenso wurde der Auswerfer am Ende des letzten Förderbandes mit Boschprofil und Winkeln befestigt. Somit ist die bisherige Befestigung über eine Holzkiste ersetzt worden. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/10_Arduino Software/Gesamtsystem SVN Link zur Arduino-Software]


===Höhenanpassung der Laufbänder===


An den Laufbandübergängen wurden verbesserungswürdige Fallhöhen festgestellt. Die Legoteile fallen von einem Laufband auf das andere, wenn die Fallhöhe zu groß ist, dann federn die Teile ab und fallen manchmal vom Band runter. Deshalb wurden die Höhen der Laufbänder so eingestellt, dass es kleinstmögliche Fallhöhen gibt. Ebenso wurde damit der das Förderband steiler gestellt und somit die Vereinzelung der Legoteile leicht verbessert, da die größeren Teile im Bunker weniger Halt auf den Lamellen finden können und eher abrutschen. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>


== Lichtbox-Tests ==
===Elektrische Sicherheit===


=== Beschreibung ===
Die elektrische Sicherheit des Schaltschrankes wurde im Zuge der Umbauarbeiten sichergestellt, indem alle Leitungen gegen spannungsfestere Leitungen vom Typ H07 bzw. H05 ausgetauscht wurden. So werden nun auch die Anforderungen nach VDE 0100-600 erfüllt.
Für das automatisierte Zählen von Legosteinen wird ein System zur Bild-/Videoaufnahme benötigt. Dafür soll eine Box mit eigener Lichtquelle geplant und gebaut werden. Die Box soll die Aufnahme vor Fremdeinwirkungen (z.B. Tageslicht) abschirmen und eine gleichmäßige Aufnahme garantieren.
Eine Anlagenprüfung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
Für die Auswahlkriterien der Lichtquelle und der Box wurde ein morphologischer Kasten angefertigt, mit dem mögliche Anwendungen und Testfälle generiert werden sollen. Diesen zeigt ''Tabelle 1''.


== HSHL-Wiki-Dokumentation ==
Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet.
Jedes Themenabschnitt unterliegt der bereits oben genannten [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Aufgabenteilung_inkl._weiteren_Aufgaben_aus_dem_Pflichtenheft '''Verantwortlichkeiten'''].
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


Tabelle 1: Morphologischer Kasten für Bild-/Videoaufnahmesystem
== Evaluation der Druckluftdüsen ==
{| class="wikitable"
Der vollständige Bericht befindet sich im SVN unter <br>
!  width="16%" |
...\Dokumentation\16_Pneumatik\Evaluation_der_Druckluftdüsen.docx
!  width="14%" | Variante 1
!  width="14%" | Variante 2
!  width="14%" | Variante 3
!  width="14%" | Variante 4
!  width="14%" | Variante 5
!  width="14%" | Variante 6
|-
| Lichtquelle (Art)
| LED
| Neon
| Halogen
| Glühlampe
|
|
|-
|-
| Lichtquelle (Form)
| Punkt(e)
| Streifen
| Fläche
| Ring
|
|
|-
|-
| Bestrahlung (Art)
| Von Oben
| Von Oben (Diffusion)
| Seitlich
| Seitlich (Diffusion)
| Von Unten (Band)
| Rundumbestrahlung
|-
|-
| Bewandung (Farbe)
| Weiß
| Schwarz
| Grau (Bande)
| Grün (Band)
| Reflektierend
| Durchsichtig (Diffusion)
|-
|-
| Bewandung (Struktur)
| Glatt
| Matt
| Strukturiert
|
|
|
|-
|-
| Kamera (Position)
| Von Oben
| Seitlich
|
|
|
|
|-
|}


Bei der Auswahl der zu testenden Varianten wurden einige Varianten im Vorfeld verworfen oder priorisiert. Für die Art der Lichtquelle wurden die Tests auf LED als Lichtquelle beschränkt. Verwendet wurden zwei unterschiedliche Varianten. Einerseits wurden LED-Streifen getestet, deren Lichtpunkte durch eine RGB-Kombination erzeugt werden. Somit war es möglich die Box mit unterschiedlichen Farben auszuleuchten. Die besten Ergebnisse (für das menschliche Auge) konnten durch die Farbeinstellung „Gelb“ erreicht werden. Andererseits werden LED-Streifen verwendet, welche nur weißes Licht erzeugen. Diese können ein „reineres“ und helleres weißes Licht erzeugen als die bereits beschriebenen LED-Streifen. Das Bild-/Videoraster wurde auf 640 Pixel zu 480 Pixel gesetzt. Zur Überprüfung der Ergebnisse wurden mit der Software MATLAB Bild- und Videoaufnahmen erzeugt.
Im ersten Test wurden verschiedene Legoteile und den unten in der Tabelle genannten Düsen getestet. Ziel des Versuches war es heraus zu finden, welche Legoteile sich am besten für den Test der Düsen eigen. In dem Test stellte sich heraus, dass sie Komplexität der Form der Legoteile kaum Einfluss auf das Ergebnis hat. Dies ist auf das geringe Gewicht und die großen Oberflächen der Legoteile zurückzuführen.  


=== Testfall 1 ===
Im zweiten Test wurden getestet wie weit die Düsen die Legoteile bei einmaligen betätigen bewegen können. Ein Teil muss dabei mindestens eine Strecke von 20 cm überwinden können. In dem Test zeigte sich, dass die Testergebnisse von der punktuellen Düse nur dann sinnvolle Ergebnisse erzielen, wenn das Objekt mit einem optimalen Angriffswinkel getroffen wird. Deshalb schwanken die Messwerte auch sehr stark im Test. Dies ist sehr ungünstig da die Lage der Teile im laufenden Prozess der Legoteilzählmaschine sehr variabel ist. Das optimalste Ergebnis haben die spitzen Luftdruck-Düsen erzielt, da selbst mit geringen Drücken viel Kraft auf die Legoteile übertragen werden konnte.


[[Datei:Lichttest1_1.png|240px|thumb|right|Lichttest: Schwarz / Matt, RGB-LED]]
[[Datei:Lichttest1_2.png|240px|thumb|right|Lichttest: Schwarz / Matt, Weiße LED]]


Tabelle 2: Auswahl aus dem morphologischen Kasten für Testfall 1
{| class="wikitable"
{| class="wikitable"
!Kriterium
!Variante
|-
| Lichtquelle (Art)
| LED
|-
|-
|-
| Lichtquelle (Form)
!Platz
| Streifen
!Düsen-Nr
!Bild
!Düsenart
!Material
!min. Druck
!Preis
|-
|-
| 1
| 1761
| [[File:Rundduese 1761.jpg|75x75px]]
| Spitz
| Aluminium
| >2,5 Bar
| 11,40€
|-
|-
| Beleuchtung (Art)
| 2
| Von Oben (Diffusion *indirekt)
| 1873
| [[File:Rundduese 1873.jpg|75x75px]]
| Spitz
| Edelstahl
| >2,5 Bar
| 21,70€
|-
|-
| 3
| 2075
| [[File:Flachduese 2075.jpg|75x75px]]
| Spitz
| Kunststoff (ABS)
| >2,5 Bar
| 18,80€
|-
|-
| Bewandung (Farbe)
| 4
| Schwarz
| R02-100
|-
| [[File:SMC KN R02 100.jpg|75x75px]]
|-
| Spitz
| Bewandung (Struktur)
| Edelstahl
| Matt
| 3,5 Bar
|-
| 10,60€
|-
| Kamera (Position)
| Von Oben)
|-
|-
| 5
| 1761
| [[File:Flachduese 842.jpg|75x75px]]
| Spitz
| Edelstahl
| 3,5 Bar
| 40,90€
|}
|}


Dieser Testfall zeichnet sich durch die Verwendung einer lichtundurchlässigen Box aus, die von innen mit schwarzen matten Pappkarton verkleidet ist. Die Beleuchtung und die Aufnahme der Bilder findet jeweils von oben statt.  
== Video-Anleitung ==
'''UNTER BEARBEITUNG''': wird im nächsten Semester mit Vollendung des Programm erstellt
* Aktueller Stand hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/04_Skizzen%20u.%20Bilder/Pr%c3%a4sentation%20-%20Legoz%c3%a4hlmaschine_Final.mp4 Präsentation - Legozählmaschine]
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


=== Testfall 2 ===
== Pflichtenheft Dokumentation in DOORS ==
Das Pflichtenheft wurde mit Hilfe der Software '''DOORS''' dokumentiert.
* SVN-Link: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Anforderungsmanagement/Pflichtenheft/Pflichtenheft.pdf Pflichtenheft.pdf]


[[Datei:Lichttest2_1.png|240px|thumb|right|Lichttest: Weiß / Matt, RGB-LED]]
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
[[Datei:Lichttest2_2.png|240px|thumb|right|Lichttest: Weiß / Matt, Weiße LED]]


Tabelle 3: Auswahl aus dem morphologischen Kasten für Testfall 2
== Prozessvisualisierung mit Visio ==
 
Die Prozesse wurden mit Microsoft´s Visio dokumentiert.
{| class="wikitable"
{| class="wikitable"
!Kriterium
!Variante
|-
| Lichtquelle (Art)
| LED
|-
|-
| Lichtquelle (Form)
| Streifen
|-
|-
|-
| Beleuchtung (Art)
|[[Datei:MAIN.jpg|250px]] || [[Datei:Bildverarbeitung_Main.jpg|250px]] || [[Datei:Farberkennung.jpg|250px]] || [[Datei:Merkmalsextraktion.png|250px]]
| Von Oben (Diffusion *indirekt)
|-
|-
| Bewandung (Farbe)
| Weiß
|-
|-
| Bewandung (Struktur)
| Matt
|-
|-
| Kamera (Position)
| Von Oben)
|-
|-
|Abbildung 15: Übersicht des Gesamtprogramms||Abbildung 16: Detailierte Sicht der Bildveraberbeitung ||Abbildung 17: Teilgebiet der Bildverarbeitung: <br>Farberkennung im Detail ||Abbildung 18: Teilgebiet der Bildverarbeitung:<br>Merkmalsextraktion im Detail
|}
|}
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
== QM-Tests ==
Wurde mit Genehmigung von Prof. Schneider auf das nächste Semester verlegt.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
== Auswerfer==


Dieser Testfall zeichnet sich durch die Verwendung einer lichtundurchlässigen Box aus, die von innen mit weißen matten Papier verkleidet ist. Die Beleuchtung und die Aufnahme der Bilder findet jeweils von oben statt.  
Die bestehende Lösung hat zwei Auswerfer vorgesehen, welche die Legoteile in 3 Kategorien sortieren sollte. In unserem Pflichtenheft ist aber festgeschrieben worden, dass die Legoteile nur noch in 2 Kategorien eingeteilt werden sollen. Daher ist für den Auswefer auch nur ein Servomotor installiert worden. Die bestehende Implementierung auf dem Arduino wurde übernommen und angepasst. Die Matlab Software schickt immer, wenn ein Teil "erkannt" wurde einen String über die serielle Schnittstelle zum Arduino, dieser ließt den String ein und speichrt sich den Zeitstempel bei Eintreffen der Nachricht. Darauf wird ein Zeitdelay gerechnet, bei dem dann die Schranke für einen festgesetzten Zeitraum öffnet.
Diese Umsetzung ist noch nicht sehr robust, da das Senden und Empfangen der Nachricht über eine Erkennung eines Legoteils nicht den geforderten Echtzeitanforderungen entspricht. Ebenfalls wäre es besser, wenn sich das Zeitdelay automatisch an die Bandgeschwindikeit anpassen würde und die Dauer der Schrankenöffnung sich an die Größe des erkannten Legoteils.


=== Testfall 3 ===
== Planung der Aufgaben für das nächste Semester ==
Für das kommende Semester wurde anfangs geplant, eine Sortierungsanlage zu entwerfen und realisieren.
Leider wurde festgestellt, dass ein größeres Problem bei der Vereinzelung von den Legoteilen besteht.
Durch den "Flaschenhals"-Bilderkennung ist es unmöglich allein durch die Laufbandgeschwindigkeits-Differenzen alle Legoteile zu vereinzeln.
Das erste Laufband, welches die Legoteile aus dem Bunker auf die nächste Laufband fördert, muss modifiziert werden damit nicht zu viele Teile auf einmal gefördert werden.
Als eine der Hauptaufgaben für das nächste Semester wurde die Vereinzelung von Legoteilen vor der Bildverarbeitung festgelegt. Zusätzlich dazu noch andere Aufgaben aus dem Pflichtenheft.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


[[Datei:Lichttest3_1.png|240px|thumb|right|Lichttest: Reflektorfolie, RGB-LED]]
=== Konzept für Sortieranlage ===
[[Datei:Lichttest3_2.png|240px|thumb|right|Lichttest: Reflektorfolie, Weiße LED]]
[[Datei:Konzept_Sortierung.JPG|300px|thumb|left|Abbildung 19: Konzept_Sortierung]]
[[Datei:Konzept_CAD.JPG|300px|thumb|right|Abbildung 20: Konzept CAD]]
Da es ein Konzept bereits entworfen wurde, wird dieses hier auch dokumentiert (eventuell für zukünftige Aufgaben).
Gedacht ist ein durch einem Motor am Rand angetriebene (konstanter Geschwindigkeit) Scheibe mit Gummi- oder Filsbeschichtung (damit die Legoteile nicht abprallen). Welches auf mindestens drei freilaufende Räder mit einem Nut rotierbar gelagert wird. In der Mitte (feststehende runde Platte) soll dann die Verkabelung (entweder elektrische Leitungen für elektro Motoren, oder pneumatische Leitungen für pneumatischen Auswerfern) platziert werden, die entweder elektrischen oder pneumatischen Auswerfern versorgen. Radial zur drehender Scheibe werden Kisten angebracht mit passend gebogenen Führungsblechen (damit die Legoteile immer in die Kisten fallen).
<br /><br />
Zum Öffnen des 3D-Modells vom Konzept, laden Sie bitte folgende frei erhältliche Software [http://www.3ds.com/de/produkte-und-services/3d-xml/download/ 3DXML-Player] herunter und öffnen Sie die Datei [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\CAD_SORTIERUNG\CAD_3DXML\Sortieranlage.3dxml Sortieranlage.3dxml].
Um das 3D-Modell zu rotieren, drücken und halten Sie die mittlere und rechte Maustasten fest. Wenn Sie dann die Maus bewegen, dann wird das 3D-Modell in die entsprechende Richtung rotiert.
Zoomen: Halten Sie die mittlere Maustaste gedrückt, anschließend die rechte Maustaste antippen und loslassen (mittlere gedrückt halten), Maus nach oben bewegen --> Hineinzoomen, Maus nach unten bewegen --> Herauszoomen.


Tabelle 4: Auswahl aus dem morphologischen Kasten für Testfall 3
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
{| class="wikitable"
<br /><br /><br /><br />
!Kriterium
!Variante
|-
| Lichtquelle (Art)
| LED
|-
|-
| Lichtquelle (Form)
| Streifen
|-
|-
| Beleuchtung (Art)
| Von Oben (Diffusion *indirekt)
|-
|-
| Bewandung (Farbe)
| Reflektorfolie
|-
|-
| Bewandung (Struktur)
| Glatt
|-
|-
| Kamera (Position)
| Von Oben)
|-
|}


Dieser Testfall zeichnet sich durch die Verwendung einer lichtundurchlässigen Box aus, die von innen mit Reflektorfolie verkleidet ist. Die Beleuchtung und die Aufnahme der Bilder findet jeweils von oben statt. ###Tabelle 2 zeigt die Ergebnisse und die dazugehörigen Einstellungen, welche in MATLAB konfiguriert wurden.
= Ergebnisse =


=== Testfall 4 ===
== Anleitung Programmstart ==


[[Datei:Lichttest4.png|240px|thumb|right|Lichttest: Rundumbeleuchtung, Weiße LED]]
* Vorbereitung
** LED-Stecker anschließen
** Hauptstecker anschließen
** Hauptschalter betätigen
* Datenbank starten
** XAMPP control panel starten
** Apache Modul starten
** MySQL Modul starten
* Matlab Programm öffnen
** unter SVN\MTR_SDE_Praktikum_2015\SRC die main-datei öffnen
** Programm starten
* Baukasten in der GUI auswählen
* handgezählte Teile eintragen
* automatischer Zählprozess
** Motoren werden automatisch gestartet
** Kästen hinter das Förderband stellen
** Legoteile in den Bunker füllen
** Esc-Taste betätigen zur Beendigung des automatischen Zählprozess
* Motoren werden automatisch ausgeschaltet
* Inventurliste wird ausgegeben


Tabelle 5: Auswahl aus dem morphologischen Kasten für Testfall 4
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
{| class="wikitable"
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
!Kriterium
!Variante
|-
| Lichtquelle (Art)
| LED
|-
|-
| Lichtquelle (Form)
| Punkte
|-
|-
| Beleuchtung (Art)
| Rundumbestrahlung
|-
|-
| Bewandung (Farbe)
| Durchsichtig (Diffusion)
|-
|-
| Bewandung (Struktur)
| Matt
|-
|-
| Kamera (Position)
| Von Oben)
|-
|}


Dieser Testfall zeichnet sich durch die Verwendung einer doppelwandigen Box aus. Die innere Box ist ein Konstrukt aus Acrylglas-Scheiben, die zur Diffusion des Lichts dient. An der äußeren Box sind die LEDs befestigt. Ferner dient diese zur Abschottung fremder Lichtquellen. Im Gegensatz zu den vorherigen Testfällen wurde die Belichtung des Bandes von den Seiten und von oben realisiert. Außerdem wurde dieser Testfall nur mit einer Art der LEDs ausgeführt, da durch die vorherigen Testfälle bereits eine Präferenz ermittelt werden konnte. Aufgrund zu schwacher Diffusionsverhältnissen kam es zu Reflektionen auf der Oberfläche verschiedener Legoteile. Um diese zu vermeiden, wurde die Belichtung auf die seitliche Bestrahlung reduziert.  
= Fazit=
===Abgeschlossene Punkte===
* '''Einbau eines 24V Netzteils''', um Überlast beim Lauf aller Motoren zu verhindern.
* '''Bildverarbeitung''' Differenzierung der Legoteile durch Farbe, Umfang, Fläche, Schwerpunkt, max. "Radius", min. "Radius"
* '''Einbindung einer Datenbank mit SQ'''L, zum Verwalten von größeren Datensätzen
* '''Aufteilung Legoteile in Baukästen''', zu besseren Auswertung der  Datensätze
* '''Montage von Kabelkanälen''' zum Schutz und der mechanischen Entlastung der Leitung
* '''Montage von Kamerahaltung''' zum Einstellen und Fixieren der Kamera
* '''Montage von Bildverarbeitungskasten''' für festen halt und optimale Beleutungsverhältnisse
* '''Zentrierung der Teile''' auf dem Fließband zur besseren Bildverarbeitung und zum Auswerfen der (nicht) erkannten Teile
* '''Anpassung der Laufbänder:''' Höhenverstellung und Reduktion von Schleifkontakten
* '''GUI2.0:''' interaktive Benutzeroberfläche über mehrere Seiten
* '''Erkennung von mehr als 30 verschiedenen Teile'''n


=== Ergebnisse und Auswertung ===


Das beste Ergebnis lieferte Testfall 2 mit weißer Bewandung und weißen LEDs. Die Farben sind am
===Offene Punkte===
deutlichsten zu erkennen und es treten wenige Reflektionen auf den Legoteilen auf. Außerdem entfällt ein maßgeblicher Teil der Schattenbildung, welche durch die Seitenbeleuchtung hervorgerufen wurde.
* '''Optimierung der Bildverarbeitung:''' Mehr Merkmale, weniger Rechenleistung und schnellere Erkennung
* '''Bildverarbeitung:''' Problemfarbe: Schwarz
* '''Bildverarbeitung:''' Einbindung einer "Reinigungsfunktion", welche dem User ein Signal gibt, wenn fälschlicherweise Objekte auf dem Band erkannt werden
* '''Datenbank:''' Füllen der Datenbank mit weiteren Legoteilen bzw. Merkmalswerten
* '''Optimierung der Vereinzelung:''' eine absolute Vereinzelung wäre ideal
* '''Teach-In Einbindung in der GUI:''' Benutzerschnittstelle zu Eingabe und Bearbeitung der Teile
* '''GUI Fertigstellung:''' Optimierung von vorhandenen Programmteilen
* '''Schnellerer Durchlauf:''' Ziel: 60 Teile in 60 Sekunden
* '''Videoanleitung''' zum Erklären der Projektergebnisse
* '''Anleitung zum Start der Maschine''' eine „Broschüre“ mit vielen Bildern
* '''Erweiterung der Datenbank''' um neue Bauteile und Baukästen (z.B. NXT)
* '''Merge-Funktion''': Auswahl von mehrern Kästen ermöglicht
* '''Projektabschluss:''' Abschlusspräsentation und Dokumentation der Arbeit um künftigen Studiengängen einen besseren Einstig zu ermöglichen.


=== SVN ===
===Mögliche Themen für neue Projektziele===
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Lichttests SVN Link zu den Lichttests]
* '''Realisierung eines Auswerfers''' um Teile in bestimmte Kästen zu sortieren
* '''Serienproduktion''' Optimierung der Maschine auf kostengünstige Hardware
* '''Rückführung''' um nicht erkannte Teile wieder zurück in den Prozess zu führen
* '''Sortiersystem''' welche Bauteile kommen zusammen in ein Fach eines Kastens?




<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


== Gefährdungsbeurteilung ==
= Dokumentation =
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/13_Gefaehrdungsbeurteilung SVN Link zur Gefährdungsbeurteilung] <br />
== SVN ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\main.m Main Funktion] : Main-Funktion die alle andere Unterfunktionen aufruft


== [[Projekttagebuch Legoteil Zählmaschine 2015| Projekttagebuch]] ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\AutomatischesZaehlen.m AutomatischesZaehlen.m]


== Liste offener Punkte ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m]


Die offenen Punkte und Ideen für kommende Semester sind im Nachfolgenden aufgelistet.
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]


{| class="wikitable"
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
! width="11%" | Thema
! width="53%" | Beschreibung
! width="22%" | Nähere Informationen
! width="14%" | Status benötigter Teile
|-
|Neues 24 V Netzteil
|24V/10A Netzteil gegen 24V/20A austauschen, um Überlast beim Lauf aller Motoren zu verhindern.
|
|Netzteil ist bestellt (Frau König)
|-
|Software zur Bildverarbeitung (BV)
|Die Einbindung einer geeigneten Software zur Teileerkennung steht noch aus
|Kommunikation mit Systems sowie Ansteuerung ist fertig.
|Bildverarbeitung mit 'String' als Output
|-
|Bauteileliste in Excel
|Die Excel Liste, welche alle Teile eines Baukasten erhält, muss mit dem Ergebnis der BV abgeglichen werden.
|Erkannte Teile in mindestens zwei möglichen Ausrichtungen müssen erkannt und in der Liste vermerkt werden
|
|-
|Servo für Teilesortierung
|Identisches Servo wie bisher gegenüberliegend montieren, um drei Sortierfächer (Erkannt/Nicht Erkannt/Fremdteil) zu sortieren
|Konstruktion siehe Kapitel ''Konstruktion des Auswerfers für Teilesortierung''
|Bestellung wurde an Fr. König geleitet
|-
|Zeit bis zur Servoöffnung
|Das Delay zwsichen Befehl und öffnen der Servos muss ermittelt und je nach Geschwindigkeit angepasst werden
|Es ist problemlos möglich, einen weiteren 'String' - Befehl als Buchstaben für die Verzögerungszeit einzubinden
|String auslesen und verarbeiten muss in Arduino Software geschehen.
|-
|Kabelkanal montieren
|Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montieren
|
|
|-
|Kamerahalterung
|Konstruktion einer Kamerahalterung für die Logitech C920 WebCam
|Vorschlag: Brücke über Förderband
|
|-
|Bildverarbeitungskasten
|Für die Bildverarbeitung muss eine der gebauten Bildverarbeitungsbox-Prototypen ausgewählt und montiert werden. Hierfür wurden Lichttests durchgeführt.
|Ergebnisse sind protokolliert [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Lichttests/ SVN Link zu den Lichttests]
|Prototypen der Lichtboxen vorhanden
|-
|Teilezentrierung
|Die provisorisch aus Holz gefertite Teilezentrierung soll in fixierbarer Variante aus Aluminium gefertigt werden
|Ergebnisse zu den Tests der Zentrierungsmethoden sind in [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Bauteilzentrierung/ diesem SVN Ordner] protokolliert
|Prototypen der gewählten Teilezentrierung ist vor der Bildverarbeitungsbox verbaut
|-
|Idee Software: Flexible Bildverarbeitungs
|Durch definieren der Schnittstellen könnte in der GUI eine Einbindung frei wählbarer BV Software realisiert werden.
|Optimal geeignet um kleine Projekte dann an der Legoteilzaehlmaschine zu testen.
|
|-


== Gefährdungsbeurteilung ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/13_Gefaehrdungsbeurteilung SVN Link zur Gefährdungsbeurteilung] <br />
Eine Anlagenprüfung/Gefährdungsbeurteilung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>


|}
== Autoren ==
<references />


== Siehe auch / Weiterführende Links==
== Siehe auch / Weiterführende Links ==
# '''SVN:''' Checkout URL [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk | https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk]
# '''SVN:''' Checkout URL [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk | https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk]
# '''Rückblick (WS15):''' [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015 | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015]
# '''Fortsetzung Nr.2 (WS16/17):''' [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_2017 | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_2017]

Aktuelle Version vom 3. Februar 2017, 09:12 Uhr

Abbildung 1: Legoteilzählmaschine im Überblick

Bei der HSHL Lego® Zählmaschine handelt es sich um eine Maschine, die automatisch Legoteile zählen und sortieren kann, um gegebenen Falls fehlende Lego®-Steine nachbestellen zu können. Es ist ein studentisches Projekt, welches in Rahmen des System-Entwurf-Praktikums des Studiengangs Mechatronik mit Schwerpunkt System Design Engineering im 6. Semester durchgeführt wurde. [1] [2]

Autoren: Adam Fankhauser, Christo Tsibadze, Kevin Penner, Niklas Lingenauber, Sergej Krause, Simon Hanemann

Betreuer: Prof. Schneider


Aufgabenstellung

Die vorhandene Legoteilzählmaschine (siehe Legoteilzählmaschine_2015 ) soll Soft- und Hardwaremäßig modifiziert werden, um weitere Anforderungen zu erfüllen.[1]


Liste der offenen Punkten vom letzten Semester

  • Neues 24 V Netzteil, 24V/10A Netzteil gegen 24V/20A austauschen, um Überlast beim Lauf aller Motoren zu verhindern. Neues Netzteil ist vorhanden.
  • Software zur Bildverarbeitung (BV), Die Einbindung einer geeigneten Software zur Teileerkennung steht noch aus. Kommunikation mit Systems sowie Ansteuerung ist fertig. Bildverarbeitung mit 'String' als Output.
  • Bauteileliste in Excel, Die Excel Liste, welche alle Teile eines Baukasten erhält, muss mit dem Ergebnis der BV abgeglichen werden. Erkannte Teile in mindestens zwei möglichen Ausrichtungen müssen erkannt und in der Liste vermerkt werden.
  • Servo für Teilesortierung, Identisches Servo wie bisher gegenüberliegend montieren, um drei Sortierfächer (Erkannt/Nicht Erkannt/Fremdteil) zu sortieren, Konstruktion, Bestellung wurde an Fr. König geleitet.
  • Zeit bis zur Servoöffnung, Das Delay zwsichen Befehl und öffnen der Servos muss ermittelt und je nach Geschwindigkeit angepasst werden. Es ist problemlos möglich, einen weiteren 'String' - Befehl als Buchstaben für die Verzögerungszeit einzubinden, String auslesen und verarbeiten muss in Arduino Software geschehen.
  • Kabelkanal montieren, Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montieren
  • Kamerahalterung, Konstruktion einer Kamerahalterung für die Logitech C920 WebCam Vorschlag: Brücke über Förderband.
  • Bildverarbeitungskasten, Für die Bildverarbeitung muss eine der gebauten Bildverarbeitungsbox-Prototypen ausgewählt und montiert werden. Hierfür wurden Lichttests durchgeführt. Ergebnisse sind protokolliert SVN Link zu den Lichttests, Prototypen der Lichtboxen vorhanden.
  • Teilezentrierung, Die provisorisch aus Holz gefertigte Teilezentrierung soll in fixierbarer Variante aus Aluminium gefertigt werden. Ergebnisse zu den Tests der Zentrierungsmethoden sind in diesem SVN Ordner protokolliert, Prototypen der gewählten Teilezentrierung ist vor der Bildverarbeitungsbox verbaut.
  • Idee Software: Flexible Bildverarbeitungssoftware, Durch definieren der Schnittstellen könnte in der GUI eine Einbindung frei wählbarer BV Software realisiert werden. Optimal geeignet um kleine Projekte dann an der Legoteilzaehlmaschine zu testen.
    • Wird in diesem Projekt nicht bearbeitet.


[1]

Aufgabenteilung inkl. weiteren Aufgaben aus dem Pflichtenheft

Es wurden für jede Aufgabe ein oder mehrere Verantwortliche(n) aus der Gruppe festgelegt. Jede Person ist dann dafür zuständig, dass diese Aufgaben erfüllt werden. Bei Bedarf steht dieser Person die ganze Gruppe zur Hilfe zur Verfügung.


[1]

Projektplan

Abbildung 2: Aufgabenstellung und Projektplan
Abbildung 3: Projektplan


Meilensteine für das 6. Semester mit Deadlines:

  • 06.06.2016: Hardware und Software Inbetriebnahme
    • Inbetriebnahme "Erprobung von Sensoren und Aktoren"
    • Automatische Sortierung von mind. 30 Teilen
    • Sortierung: Erkannt und Nicht-Erkannt
    • Bildverarbeitung in "Echtzeit" am PC
    • Ausgabe der Inventurliste
  • 24.06.2016: Algorithmen:
    • Optimierung der Bildverarbeitung
    • Automatische vollständige Sortierung: NXT-Basis + Erweiterung
    • Planung und Beschaffung der Hardware-Änderung (Auswerfer) für die nächste Projektphase
  • 14.11.2016: wird noch festgelegt, entweder Auswerfer- oder Separierung vor der BV Optimierung
  • 16.01.2016: Algorithmen Optimierung, Teach-In XT/EV3 und Report

[1] [3]








Realisierung

Main-Funktion

Abbildung 4: Aufbau der Main-Funktion

Die Mainfunktion ist das Hauptprogramm der Legozählmaschine. Sie ruft nach Start des Programmes alle weiteren Module und Funktionen auf. Zu Beginn des Programmes startet die Main-Funktion eine Initialisierung. Hier werden allgemeingültige Aspekte, wie globale Variablen, Verbindungen zu Datenbank oder Kamera und Einstellungen vorgenommen. Anschließend wird ein Grafisches User-Interface aufgerufen, welches dem User ermöglicht die Legozählmaschine zu steuern. Sind notwendige Schritte wie die Auswahl von Baukästen oder dem manuellen Zählen von Bauteilen, die die Maschine nicht erkennen kann abgeschlossen, startet die automaische Erkennung der Legoteile. Der Anwender muss hier den Inhalt einer Kiste in den Förderbunker geben, die Maschine befördert die Teile automatisch in den Kamera-Raum und ermittelt durch Bildverarbeitung die enntsprechenden Bauteile. Nach Beendigung des automatischen Zählprozesses werden die Ergebnisse des manuellen und des automatischen Zählens in einer Liste zusammengefasst und die gewonnen Informationen können in einer Inventurliste ausgegeben werden. Fehlende Legoteile werden in einer seperaten Fehlteilliste ausgegeben.


Quellcode Matlab: main.m [1] [3] [2] [4] [5] [6]

GUI

Unter GUI (Graphical User Interface oder auch Grafische Benutzeroberfläche versteht man die Die Schnittstelle eines Programms für einen Menschlichen Nutzer. GUI dienen meist zu Eingabe und Ausgabe von Werten die durch ein Hauptprogramm berechnet werden, dabei haben GUI in der Regel nur wenig Rechenaufwand und dienen dem Benutzer Komfort. Die GUI der HSHL Legoteil-Zählmaschine lässt sich in folgende Bereiche aufteilen:

  • Auswahl des Baukastens
  • Manuelles Zählen der Bauteile
  • Autonomes Zählen der Bauteile
  • Korrektur des autonomen Zählens


In jedem Schritt gibt es die Möglichkeit auf Hilfe zuzugreifen. Man findet einen „Hilfe“-Knopf in der Taskleiste oben links.[2]


Auswahl der Baukästen

Im ersten Schritt müssen die Baukästen ausgewählt werden, die gezählt werden sollen. Es ist derzeit jedoch nur möglich einen Kasten aus zu wählen. In Zukunft soll es die Möglichkeit geben, zwei Kästen gleichzeitig auswählen zu können (Beispielsweise ein Hauptkasten und Zusatzkasten). Die Auswahl des Baukastens ist für die folgenden Schritte von Bedeutung. Sollte mindestens ein Kasten ausgewählt werden, so kann man mit dem nächsten Schritt dem manuellen Zählen fortfahren.[2]



Abbildung 5: GUI Auswahl der Baukästen

Manuelles Zählen

Wenn der im ersten Schritten gewählte Kasten Legoteile besitzt, die für den Zählprozess ungeeignet sind, müsse diese Teile vom Benutzer der Zählmaschine manuell gezählt werden. In diesem Schritt wird eine Tabelle mit den wichtigsten Eigenschaften der manuellen Teile gezeigt. Zudem wird dem Benutzer ein Bild des jeweiligen Bauteils angezeigt was er gerade in der Tabelle markiert. Ein Fortfahren ist nur möglich, wenn der Benutzer für jedes Teil eine positive ganze Zahl eingibt.[2]


Abbildung 6: GUI Manuelles Zählen

Autonomes Zählen

Es taucht nur ein Hinweisfenster Auf welches den Benutzer informiert, dass der Autonome Zählprozess bereits begonnen hat. Man kann den Prozess durch das Drücken von ESC beenden.[2]


Korrektur des Autonomen Zählens

Am Ende des Autonomen Zählprozess werden alle gezählten Teile angezeigt. Sollten bei autonomen Zählprozess Teile falsch erkannt werden, so hat der Benutzer die Möglichkeit die die Anzahl der Teile noch einmal manuell zu korrigieren. Nicht gezählte Teile können aber auch zurück in den Zählprozess geführt werden.[2]

Bildverarbeitung/Legoteil-Erkennung

Bildverarbeitung_Automatisches_Zaehlen

Abbildung 7: Bildverarbeitung_AutomatischesZaehlen

Die automatische Legoteilerkennung erfolgt mit der Unterfunktion: AutomatischesZaehlen.m und weiteren kleineren Unterfunktionen. Als Übergabeparameter bekommt die Funktion die Schnittstellen zu Webcam, Datenbank und die serielle Schnittstelle übergegeben und liefert als Rückgabe eine chronologische Liste mit Legoteil-IDs, welche beim automatischen Zählen erkannt wurden. Zu Beginn dieser Funktion werden einmalig diverse Parameter und Variablen angelegt und initialisiert. Anschließend wird in der äußeren Schleife Folgendes wiederholt (bis Betätigung der "Escape"-Taste) durchgeführt:

Bildverbesserung & Vorsegmentierung:

  • Bild bzw. Frame wird von der Kamera eingelesen
  • Ränder werden weggeschnitten (ROI)
  • normalverteiltes Rauschen entfernen (Gauß-Filter)
  • Bild wird in Rot-, Grün- und Blauanteil zerlegt
  • Mehrfache Binarisierung für die Segmentierung der einzelnen Legofarben + kleine Artefakte aus den Binärbilder filtern


Nachbearbeitung:
Bei einigen vorsegmentierten Farb-Binärbildern (z.B. bei einem roten Legoteil mit Bohrungen) wird der Schatten in den Bohrungen als schwarze Pixel bzw. "schwarzes Teil" interpretiert. Diese werden wie folgt aus dem schwarzen Binärbild entfernt:

  1. Die Binärbilder (außer das Binärbild, welches die schwarzen Legoteile beinhaltet) werden zusammenaddiert
  2. Beim entstandenen Binärbild wird die Closing Operation durchgeführt (Füllen von Löchern und Bohrungen) --> BW_CLOSING
  3. Die Löcher & Bohrungen aus dem schwarzen Binärbild (BW_SCHWARZ) werden entfernt mit:

BW_SCHWARZ = BW_SCHWARZ - BW_CLOSING

Um zu verhindern, dass die nicht optimal ausgeleuchtete Bereiche (z.B. dunkelgrauer Bereich in einem hellgrauen Legoteil) als zwei unterschiedliche Legoteile erkannt werden, wird Folgendes durchgeführt:

  1. Alle Binärbilder werden addiert, wodurch ein Binärbild mit Objekten verschiedener Farben entsteht
  2. Leichte Dilatation führt zu Verbindung zweier sehr nah benachbarter Objekte (Schattierungen mit Legoteilen "verschmelzen")


Segmentierung mit folgenden Matlab-Funktionen:

  • imclearborder: Entfernt alle weißen Pixel, welche eine Verbindung zum Bildrand besitzen (Objekte am Rand des Bildes) --> Objekte, deren Fläche nicht komplett von der Kamera erfasst werden, sind uninteressant
  • bwareaopen: Entfernt kleine zusammenhängende Segmente (Artefakte), deren Pixelanzahl unter einem vorgegebenen Schwellwert liegen.
  • Bwlabel: Die noch vorhandenen Objekte (Legoteile) im zusammenhängenden Binärbild werden mit einem Label versehen, damit jedes Objekt für sich betrachtet und ausgewertet werden kann

Die nachfolgenden Schritte werden in einer Schleife auf jedes gelabelte Objekt angewendet.

Klassifikation:
Merkmalsextraktion von jedem Objekt bzw. Legoteil (Mehr unter: Merkmalsextraktion):

  • SVN-Link: Merkmalsberechnung_3.m:
  • Berechnung von Umfang, Fläche, Schwerpunkt, maximaler und minimaler Abstand vom Schwerpunkt zum Objektrand


Nachdem der Schwerpunkt vom erkannten Teil berechnet wurde, wird Folgendes überprüft:

  • Der Flächenschwerpunkt (X-Koordinate) des Objektes befindet sich im mittleren Bildbereich
    • Vorteile: Objekt wird nur in mittiger Position analysiert --> Genauigkeit steigt, da die Verzerrungseigenschaften aufgrund des Blinkwinkels auf allen Objekten gleich sind
  • Der Flächenschwerpunkt (Y-Koordinate) befindet sich (inklusiver einer kleinen Toleranz) nicht an derselben Stelle, wie bei dem Legoteil, welches zuvor analysiert/gezählt wurde
    • Vorteile: Ein Legoteil wird nicht doppelt gezählt, da bei einer genau waagerecht ausgerichteten Kamera, sich die Höhe des Flächenschwerpunktes nicht ändert


Falls ein Teil erkannt wird (nicht doppelt):

  • Binärbild des Objektes wird an die Funktion FARBERKENNUNG_V2.m übergegeben, wo es einer Legofarbe zugeordnet wird (Mehr unter: Farberkennung).
  • Mit Hough-Transformation Kreise im Bild suchen (Matlab-Funktion: imfindcircles), da die Anzahl der gefunden Kreise als weiteres Merkmal dient
    • Minimaler und maximaler Radius muss mit der Höhe der Kamera angepasst werden
  • Abgleich der Merkmale des Objektes mit den eingetragenen Werten aus der Datenbank (inklusive modifizierbarer Toleranzen) mit der Funktion: Datenbankabgleich.m (Mehr unter: Datenbank). Diese erhält die Merkmale des Objektes und die Schnittstelle zur Datenbank als Übergabeparameter und liefert die ID des Legoteils zurück
    • falls keine Überschneidung zwischen Merkmalen und Datenbank --> ID = 0
  • ID wird in einer Liste gespeichert
  • Sollte die ID nicht "0" sein, wird der serieller Schnittstelle (Arduino) signalisiert, dass zu diesem Zeitpunkt ein Teil erkannt wurde. Mithilfe der konstanten und bekannten Bandgeschwindigkeit wird dann der Auswerfer vom Arduino angesteuert (erkannte Legoteile werden gesammelt).


Beendigung des automatischen Zählprozesses:
Falls die "Escape"-Taste betätigt wird:

  • Die Schleife (automatischer Zählprozess) wird unterbrochen
  • Arduino wird signalisiert, die Laufbänder zu stoppen
  • Eine Liste mit erkannten und fehlenden Teilen wird als Excel-Tabelle automatisch geöffnet.

[1] [6]

Farberkennung

Abbildung 8: Farberkennung


Die Funktion "FARBERKENNUNG_V2.m" bekommt als Übergabewerte zwei Matrizen:

  • Original-Frame (RGB-Bild) und Binärbild vom erkannten Objekt
  • mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).
    • Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
  • Anschließend werden Mittelwerte für Rot-, Grün- und Blau-Anteil berechnet.


Zuordnung zur nächstgelegenen Farbe:

  • Es werden die RGB-Mittelwerte mit einer Farbtabelle verglichen:
    • die Differenzen von jedem Farbanteil zur Farbtabelle werden ermittelt. Davon werden die Differenzen des Farbanteils mit dem größten Wert (Abweichung) gespeichert.
    • Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.


Die ermittelte Farbe wird als String zurückgegeben.[1]




Merkmalsextraktion

Abbildung 9: Merkmalsextraktion


Die Funktion "Merkmalsberechnung_3.m" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:

  • Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
  • Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
  • Flächenschwerpunkt --> Pixelkoordinaten {x/y}
  • Minimaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
  • Maximaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes


Die Berechnung der Fläche erfolgt über die Summenbildung der Zeilen und Spalten des Binärbildes. Da so nur die weißen Pixel addiert werden, handelt es sich hierbei nur um die Pixel, die zum Objekt gehören.
Die Schwerpunktskoordinaten lassen sich mit der Matlab-Funktion Regionprops berechnen, welche als Übergabeparameter das Binärbild des Objektes und die Option 'centroid' erhält.
Mithilfe des Kantenbildes des Objektes (erzeugt mit der Matlab-Funktion bwperim), kann eine Liste mit allen Kantenkoordinaten erstellt werden (Matlab-Funktion: Regionprops(Kantenbild, 'Pixellist')). Aus der Differenz zwischen jedem einzelnen dieser Kantenpixel und dem Schwerpunkt bestimmt man nun die Abstände vom Schwerpunkt zum Rand, welche nach minimalen und maximalen Wert durchsucht werden. Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank.
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox). [6]





Teach-IN

Zur Ermittlung von Merkmals-Daten (Datenbank) für die einzelnen Legoteile, wurde die Main-Funktion (Bildverarbeitung) kurzzeitig modifiziert, so dass die Daten der Merkmale 10 Mal ermittelt und anschließend gemittelt wurden. Diese Werte wurden in eine Datenbank geschrieben, in welcher die Legoteile mit ihren zugehörigen IDs hinterlegt sind. Während der Datensammlung wurde jedes Legoteil einzeln 10 Mal nacheinander in die Bilderkennungsbox gefahren. Bei Legoteilen, welche aus mehreren Perspektiven andere Merkmale aufweisen, wurden mehrere Merkmals-Daten der ID zugeordnet.

Ein automatisches Teach-IN von neuen Legoteilen mit GUI-Anbindung wurde für das kommende Semester vorgesehen. Dort könnte ein Legoteil in kleinen Positionsschritten automatisch vom Band in die Kamerabox eingefahren werden. So wäre eine Aufnahme des Objektes aus verschiedenen Blickwinkeln möglich.

[1] [6]

Datenbankanbindung, Listen IN/OUT

Datenbank

Abbildung 10: Datenbank UML Diagram

Die Datenbank ist in MySQL implementiert und eine Verbindung mit Matlab wurde realisiert. Hinzukommt das alle Daten im Excel-Format vorhanden sind. Die Daten sind aufgeteilt in drei Excel Dateien, Datenbank Teile-Kopie_fuer sql.xlsx, Datenbank Kastendetails.xlsx, Datenbank Kasten.xlsx, die die gesamte Datenbank representieren und alle einträge beinhaltet. Dies dient der Datensicherheit, da die Daten in getrennten Formaten und Speichermedien vorhanden sind. Die Struktur innerhalb der Tabellen sollte erhalten bleiben, aber die Daten innerhalb der Tupel können nach belieben manipuliert werden. In der Datei "InventurlisteErstellen_SQL.m" befindet sich ein Code, der die Daten in die gestartete SQL-Datenbank importieren kann. Dies ist aber nur möglich solange die Strucktur, Spaltennamen und Anzahl, bestehen bleibt.


Die Datenbank ist aufgeteilt in drei Tabellen, Legoteileliste, beinhaltet alle einzelnen Legoteile, Kastendetails, enthält die Nummer der Legokästen, und der Kasten Tabelle, die die Legoteile mit den Kästen verbindet. In der Tabelle Legoteileliste sollen alle Legoteile aufgenommen werden. Die Attribute für die Legoteile sind:

* DataID, der Primarykey, ist als Autoincrement implementiert und versieht jedes neu hinzugefügte Legoteil automatisch mit einer eindeutigen ID
* LegoteileID, entspricht der ID vom Hersteller Lego, kann in unserer Datenbank zweimal vorkommen, wenn das Legoteil mehrere Perspektiven hat
* Bezeichnung, eine kurze Beschreibung des Legoteils, eine eindeutige Beschreibung wurde mit zurhilfenahme von Onlineshops realisiert (max. 30 charakter lang)
* Farbe, die Farbe des Bauteils nach Hersteller Norm
* Form, noch in Bearbeitung
* Umfang, der Pixelumfang vom Teach-In Prozess
* Flaeche, der Flaecheninhalt des Legoteils in Pixel vom Teach-In Prozess
* MaxSchwerpunkt, der maximale Schwerpunkt vom Teach-In Prozess
* MinSchwerpunkt, der minimale Schwerpuntk vom Teach-In Prozess
* Rundloch, entspricht der Anzahl der vom Teach-In Prozess erkannten Löcher im Legoteil
* AnzPerspektiven, gibt die gesamt Anzahl aller vorhandenen Perspektiven, unterschiedliche Lagen eines einzelnen Legoteils, die neue Werte für die oben genannten Attribute liefert, an
* Scanbar, '1' oder '0', '1' bedeutet es kann von der Legoteil Zählmaschine erkannt werden, '0' bedeutet es muss manuell, per Hand, gezählt werden, zB. weil es zu groß ist

Die Tabelle Kastendetails besteht aus:

* KastenID, der Primarykey, die vom Hersteller Lego vorgesehene Kastennummer, muss eindeutig sein
* Bezeichnung, eine kurze Beschreibeung des Kasten bzw. den Namen des Kastens (max. 50 charakter lang)

Zu letzt die Tabelle Kasten, diese setzt sich zusammen aus einer LegoteileID, KastenID und Anzahl. Die Tabelle Kasten spiegelt die reale Welt wieder indem sie genau beschreibt welches Legoteil in welchem Kasten ist und wie oft dieses Legoteil in einem Kasten vorhanden ist:

* LegoteileID, Primarykey mit KastenID, Forenkey auf Legoteileliste.LegoteileID, dementsprechend eine ID aus Legoteileliste,
               (LegoteileIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist) 
* KastenID, Primarykey mit LegoteileID, Forenkey auf Kastendetails.KastenID, dementsprechend eine ID aus Kastendetails,
            (KastenIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist)
* Anzhal, die genaue Anzahl eines Legoteil in einem bestimmten Kasten entnommen von der Originalverpackung von Lego (max. vierstelliger Integer wert)

Um in Matlab auf die Zugriff auf die Datenbank zu haben muss XAMPP und der MySQL ODBC - Connector installiert und konfiguriert sein. Sobald dies geschehen ist, kann mit:

DatenbankVerbindung = database.ODBCConnection('Datenbank','root','');

eine Verbindung hergestellt werden. Danach kann man mit mit SQL Befehlen Daten aus der Datenbank extrahieren und einpflegen. Ein Beispiel: getAllKasten.m

In sqlquery wird der SQL-Befehl hinterlegt und mit exec(conn, sqlquery) wird der Befehl auf der Datenbank, die in conn spezifiziert ist, ausgeführt. Mit fetch(curs) wird das Ergebnis der SQL-Anfrage zurück gegeben, alles weitere ist eine manipulation der Struktur in der die Daten weitergeben werden sollen.

Installation der Datenbank

Für die Benutzung der Datenbank auf einem neun PC, müssen einige Dateien Installiert und Matlab Konfiguriert. Eine Schritt für Schritt Anleitung findet sich in der Einrichten der Datenbank.docx. Hier folgt eine Kurzanleitung anhand der Schritt für Schritt Anleitung:

1. Download von XAMPP und MySQL ODBC - Connector
2. Installation von XAMPP und MySQL ODBC - Connector
3. Starte XAMPP -> starte Apache -> starte MySQL
4. Erstelle eine neue Datenbank (Benenne die Datenbank, so das sie eindeutig und ihren nutzen klar werden lässt)
5. Konfiguration von Matlab
5.1 Im oberen Reiter auf APPS gehen
5.2 Wähle unter den APPS den Database Explorer
5.3 Gehe im Menu auf New->ODBC - Configure ODBC data source
5.4 Füge als neue Datenquelle den MySQl ODBC Unicode Driver hinzu
5.5 Server Daten eingeben -> Name: Lego ; TCP/IP Server: 127.0.0.1 Port: 3306; User: root; Password: - (leer lassen); Database: eure erstellte Datenbank wählen
5.6 Alles bestätigen -> Verbidung hergestellt

[4]

Erstellung einer Inventurliste

Eine Anforderung an die Legoteil Zählmaschine ist, dass dem Anwender nach Abschluss des Zählprozesses eine Liste in Excel ausgegeben wird, in der die gezählten Teile und dessen Anzahl aufgelistet sind. Dazu wurde zunächst eine Funktion InventurlistenTamplateMultiKaesten.m geschrieben, die aus der Datenbank die Bauteile ausliest, die in dem ausgewählten Baukästen enthalten sind und diese in eine Excel-Liste schreibt. Als Übergabeparameter benötigt die Funktion die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank. Als Rückgabewert gilt ein Cell-Array, welches den Inhalt der Inventurliste in Excel enthält.


Die Funktion InventurlistenTamplateMultiKaesten.m ist wie folgt implementiert: InventurlistenTamplateMultiKaesten.m


Nach der Erstellung des Templates werden die Gezählten IDs in die Liste eingetragen. Dazu wird der Inhalt des Templates nach den entsprechenden IDs durchsucht und die dazugehörige Anzahl notiert. Durch den Angleich voll Soll- und Ist-Anzahl der einzelnen Legoteile, wird außerdem eine Fehlteilliste erstellt, die dem Anwender anzeigt, welche Teile in welcher Häufigkeit fehlen. Die Funktion InventurlisteFuellen.m benötigt ebenfalls die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank als Übergabeparameter.Außerdem werden die gezählten Legoteil-IDs und dessen Anzahl benötigt. Als Rückgabewert gilt erneut der Inhalt der Excel-Liste.


Die Funktion InventurlisteFuellen.m ist wie folgt implementiert: InventurlisteFuellen.m

[3]

Separierung und Zentrierung der Legoteile

Abbildung 11: Zentrierung

Teilezentrierung

Die provisorisch aus Holz gefertigte Teilezentrierung wurde mit fixierbarer Variante aus Aluminium ersetzt. An den Zentrierungskomponenten wurden elastische Kunststoffstreifen geklebt und anschließend an den Alu-Profilen vor der Bildverarbeitungsbox festgeschraubt. [1] [3] [5]

Separierung

Die Separierung wurde mit Hilfe von Geschwindigkeitsdifferenzen an den Laufbandübergängen realisiert. Je größer die Geschwindigkeitsdifferenzen, desto bessere ist die Separierung möglich. Aber die Bilderkennung fungiert in diesem Punkt als "Flaschenhals", wenn das letzte Laufband zu schnell dreht, dann werden weniger Teile erkannt. Es wurden experimentell die optimalen Geschwindigkeiten für jedes Laufband ermittelt, so dass Separierung und Bilderkennung optimal laufen. [1] [3] [2] [4] [5] [6]

Elektronik und Sicherheit

Abbildung 12: 24VDC Installation
Abbildung 13: Kabelkanal
Abbildung 14: Kamera/Bildbox Fixierung

Neues 24V Netzteil

Wie in den offenen Punkten aus dem Artikel Legoteil Zählmaschine 2015 beschrieben, benötigte die Lego Zählmaschine ein stärkeres Netzteil. Bei der Auslegung der Maschine wurde das Netzteil für die Versorgung der Bandmotoren zu klein dimensioniert und bei gleichzeitigem Anlaufen der Motoren ist es vorgekommen, dass das alte Netzteil mit einem maximalen Ausgangsstrom von 10 A sich aus Selbstschutz abgeschaltet hat. Hier wurde ein stärkeres Netzteil vom selben Hersteller mit 20 A maximalem Ausgangsstrom eingebaut. Dies besitzt eine etwas breite Bauweise, konnte aber durch leichte Änderungen im Schaltschrank installiert werden.[5]

Kabelkanal

Ebenfalls in den offenen Punkten des Artikels Legoteil Zählmaschine 2015 beschrieben, sollten die bisher provisorisch verlegten Leitungen fest verlegt werden. Hierzu wurde ein Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montiert. Er dient dem Schutz und der mechanischen Entlastung der Leitung. Es wurde ein geschlitzer Kabelkanal wewählt, da an vielen unterschiedlichen Stellen Leitungen z.B. zu den Motoren abgehen. So war es nicht nötig, einen geschlossenen Kabelkanal zu modifizieren, um die Leitungsabgänge möglich zu machen.[5]


Kamera/Bildbox- und Auswerferhalterung

Die Bildbox und die Kamera waren bis zum jetzigen Zeitpunkt noch nicht befestigt und lagen lose auf dem Förderband auf. Dies barg die Gefahr, dass aus beide Teile aus ihrer beträchtlichen Höhe immer drohten herunterzufallen und irreperabel beschädigt zu werden. Zur Befestigung wurde "Boschprofil" mit den Zubehörwinkeln genutzt. Die Bildbox wurde so befestigt, dass sie über vier Schrauben Höhenverstellbar ist, um auch die Einfuhr von größeren Teilen möglich zu machen. Ebenso ist die Befestigung am Förderband mit vier Schrauben lösbar und damit die gesamte Konstruktion verschiebbar. Die Kamera wurde an der Bildboxbefestigung so fixiert, dass sie bei dieser Höhen- und Seitenverstellung immer an der selben Stelle verharrt. Dies ermöglicht eine ein mal eingestellte Kameraposition beizubehalten.

Ebenso wurde der Auswerfer am Ende des letzten Förderbandes mit Boschprofil und Winkeln befestigt. Somit ist die bisherige Befestigung über eine Holzkiste ersetzt worden. [5]

Höhenanpassung der Laufbänder

An den Laufbandübergängen wurden verbesserungswürdige Fallhöhen festgestellt. Die Legoteile fallen von einem Laufband auf das andere, wenn die Fallhöhe zu groß ist, dann federn die Teile ab und fallen manchmal vom Band runter. Deshalb wurden die Höhen der Laufbänder so eingestellt, dass es kleinstmögliche Fallhöhen gibt. Ebenso wurde damit der das Förderband steiler gestellt und somit die Vereinzelung der Legoteile leicht verbessert, da die größeren Teile im Bunker weniger Halt auf den Lamellen finden können und eher abrutschen. [5]

Elektrische Sicherheit

Die elektrische Sicherheit des Schaltschrankes wurde im Zuge der Umbauarbeiten sichergestellt, indem alle Leitungen gegen spannungsfestere Leitungen vom Typ H07 bzw. H05 ausgetauscht wurden. So werden nun auch die Anforderungen nach VDE 0100-600 erfüllt. Eine Anlagenprüfung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden. [5]

HSHL-Wiki-Dokumentation

Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet. Jedes Themenabschnitt unterliegt der bereits oben genannten Verantwortlichkeiten. [1]

Evaluation der Druckluftdüsen

Der vollständige Bericht befindet sich im SVN unter
...\Dokumentation\16_Pneumatik\Evaluation_der_Druckluftdüsen.docx

Im ersten Test wurden verschiedene Legoteile und den unten in der Tabelle genannten Düsen getestet. Ziel des Versuches war es heraus zu finden, welche Legoteile sich am besten für den Test der Düsen eigen. In dem Test stellte sich heraus, dass sie Komplexität der Form der Legoteile kaum Einfluss auf das Ergebnis hat. Dies ist auf das geringe Gewicht und die großen Oberflächen der Legoteile zurückzuführen.

Im zweiten Test wurden getestet wie weit die Düsen die Legoteile bei einmaligen betätigen bewegen können. Ein Teil muss dabei mindestens eine Strecke von 20 cm überwinden können. In dem Test zeigte sich, dass die Testergebnisse von der punktuellen Düse nur dann sinnvolle Ergebnisse erzielen, wenn das Objekt mit einem optimalen Angriffswinkel getroffen wird. Deshalb schwanken die Messwerte auch sehr stark im Test. Dies ist sehr ungünstig da die Lage der Teile im laufenden Prozess der Legoteilzählmaschine sehr variabel ist. Das optimalste Ergebnis haben die spitzen Luftdruck-Düsen erzielt, da selbst mit geringen Drücken viel Kraft auf die Legoteile übertragen werden konnte.


Platz Düsen-Nr Bild Düsenart Material min. Druck Preis
1 1761 Spitz Aluminium >2,5 Bar 11,40€
2 1873 Spitz Edelstahl >2,5 Bar 21,70€
3 2075 Spitz Kunststoff (ABS) >2,5 Bar 18,80€
4 R02-100 Spitz Edelstahl 3,5 Bar 10,60€
5 1761 Spitz Edelstahl 3,5 Bar 40,90€

Video-Anleitung

UNTER BEARBEITUNG: wird im nächsten Semester mit Vollendung des Programm erstellt

[2] [5] [6]

Pflichtenheft Dokumentation in DOORS

Das Pflichtenheft wurde mit Hilfe der Software DOORS dokumentiert.

[6]

Prozessvisualisierung mit Visio

Die Prozesse wurden mit Microsoft´s Visio dokumentiert.

Abbildung 15: Übersicht des Gesamtprogramms Abbildung 16: Detailierte Sicht der Bildveraberbeitung Abbildung 17: Teilgebiet der Bildverarbeitung:
Farberkennung im Detail
Abbildung 18: Teilgebiet der Bildverarbeitung:
Merkmalsextraktion im Detail

[1] [2] [6]

QM-Tests

Wurde mit Genehmigung von Prof. Schneider auf das nächste Semester verlegt. [1]

Auswerfer

Die bestehende Lösung hat zwei Auswerfer vorgesehen, welche die Legoteile in 3 Kategorien sortieren sollte. In unserem Pflichtenheft ist aber festgeschrieben worden, dass die Legoteile nur noch in 2 Kategorien eingeteilt werden sollen. Daher ist für den Auswefer auch nur ein Servomotor installiert worden. Die bestehende Implementierung auf dem Arduino wurde übernommen und angepasst. Die Matlab Software schickt immer, wenn ein Teil "erkannt" wurde einen String über die serielle Schnittstelle zum Arduino, dieser ließt den String ein und speichrt sich den Zeitstempel bei Eintreffen der Nachricht. Darauf wird ein Zeitdelay gerechnet, bei dem dann die Schranke für einen festgesetzten Zeitraum öffnet. Diese Umsetzung ist noch nicht sehr robust, da das Senden und Empfangen der Nachricht über eine Erkennung eines Legoteils nicht den geforderten Echtzeitanforderungen entspricht. Ebenfalls wäre es besser, wenn sich das Zeitdelay automatisch an die Bandgeschwindikeit anpassen würde und die Dauer der Schrankenöffnung sich an die Größe des erkannten Legoteils.

Planung der Aufgaben für das nächste Semester

Für das kommende Semester wurde anfangs geplant, eine Sortierungsanlage zu entwerfen und realisieren. Leider wurde festgestellt, dass ein größeres Problem bei der Vereinzelung von den Legoteilen besteht. Durch den "Flaschenhals"-Bilderkennung ist es unmöglich allein durch die Laufbandgeschwindigkeits-Differenzen alle Legoteile zu vereinzeln. Das erste Laufband, welches die Legoteile aus dem Bunker auf die nächste Laufband fördert, muss modifiziert werden damit nicht zu viele Teile auf einmal gefördert werden. Als eine der Hauptaufgaben für das nächste Semester wurde die Vereinzelung von Legoteilen vor der Bildverarbeitung festgelegt. Zusätzlich dazu noch andere Aufgaben aus dem Pflichtenheft.[1]

Konzept für Sortieranlage

Abbildung 19: Konzept_Sortierung
Abbildung 20: Konzept CAD

Da es ein Konzept bereits entworfen wurde, wird dieses hier auch dokumentiert (eventuell für zukünftige Aufgaben). Gedacht ist ein durch einem Motor am Rand angetriebene (konstanter Geschwindigkeit) Scheibe mit Gummi- oder Filsbeschichtung (damit die Legoteile nicht abprallen). Welches auf mindestens drei freilaufende Räder mit einem Nut rotierbar gelagert wird. In der Mitte (feststehende runde Platte) soll dann die Verkabelung (entweder elektrische Leitungen für elektro Motoren, oder pneumatische Leitungen für pneumatischen Auswerfern) platziert werden, die entweder elektrischen oder pneumatischen Auswerfern versorgen. Radial zur drehender Scheibe werden Kisten angebracht mit passend gebogenen Führungsblechen (damit die Legoteile immer in die Kisten fallen).

Zum Öffnen des 3D-Modells vom Konzept, laden Sie bitte folgende frei erhältliche Software 3DXML-Player herunter und öffnen Sie die Datei Sortieranlage.3dxml. Um das 3D-Modell zu rotieren, drücken und halten Sie die mittlere und rechte Maustasten fest. Wenn Sie dann die Maus bewegen, dann wird das 3D-Modell in die entsprechende Richtung rotiert. Zoomen: Halten Sie die mittlere Maustaste gedrückt, anschließend die rechte Maustaste antippen und loslassen (mittlere gedrückt halten), Maus nach oben bewegen --> Hineinzoomen, Maus nach unten bewegen --> Herauszoomen.

[1]



Ergebnisse

Anleitung Programmstart

  • Vorbereitung
    • LED-Stecker anschließen
    • Hauptstecker anschließen
    • Hauptschalter betätigen
  • Datenbank starten
    • XAMPP control panel starten
    • Apache Modul starten
    • MySQL Modul starten
  • Matlab Programm öffnen
    • unter SVN\MTR_SDE_Praktikum_2015\SRC die main-datei öffnen
    • Programm starten
  • Baukasten in der GUI auswählen
  • handgezählte Teile eintragen
  • automatischer Zählprozess
    • Motoren werden automatisch gestartet
    • Kästen hinter das Förderband stellen
    • Legoteile in den Bunker füllen
    • Esc-Taste betätigen zur Beendigung des automatischen Zählprozess
  • Motoren werden automatisch ausgeschaltet
  • Inventurliste wird ausgegeben

[4] [3]

Fazit

Abgeschlossene Punkte

  • Einbau eines 24V Netzteils, um Überlast beim Lauf aller Motoren zu verhindern.
  • Bildverarbeitung Differenzierung der Legoteile durch Farbe, Umfang, Fläche, Schwerpunkt, max. "Radius", min. "Radius"
  • Einbindung einer Datenbank mit SQL, zum Verwalten von größeren Datensätzen
  • Aufteilung Legoteile in Baukästen, zu besseren Auswertung der Datensätze
  • Montage von Kabelkanälen zum Schutz und der mechanischen Entlastung der Leitung
  • Montage von Kamerahaltung zum Einstellen und Fixieren der Kamera
  • Montage von Bildverarbeitungskasten für festen halt und optimale Beleutungsverhältnisse
  • Zentrierung der Teile auf dem Fließband zur besseren Bildverarbeitung und zum Auswerfen der (nicht) erkannten Teile
  • Anpassung der Laufbänder: Höhenverstellung und Reduktion von Schleifkontakten
  • GUI2.0: interaktive Benutzeroberfläche über mehrere Seiten
  • Erkennung von mehr als 30 verschiedenen Teilen


Offene Punkte

  • Optimierung der Bildverarbeitung: Mehr Merkmale, weniger Rechenleistung und schnellere Erkennung
  • Bildverarbeitung: Problemfarbe: Schwarz
  • Bildverarbeitung: Einbindung einer "Reinigungsfunktion", welche dem User ein Signal gibt, wenn fälschlicherweise Objekte auf dem Band erkannt werden
  • Datenbank: Füllen der Datenbank mit weiteren Legoteilen bzw. Merkmalswerten
  • Optimierung der Vereinzelung: eine absolute Vereinzelung wäre ideal
  • Teach-In Einbindung in der GUI: Benutzerschnittstelle zu Eingabe und Bearbeitung der Teile
  • GUI Fertigstellung: Optimierung von vorhandenen Programmteilen
  • Schnellerer Durchlauf: Ziel: 60 Teile in 60 Sekunden
  • Videoanleitung zum Erklären der Projektergebnisse
  • Anleitung zum Start der Maschine eine „Broschüre“ mit vielen Bildern
  • Erweiterung der Datenbank um neue Bauteile und Baukästen (z.B. NXT)
  • Merge-Funktion: Auswahl von mehrern Kästen ermöglicht
  • Projektabschluss: Abschlusspräsentation und Dokumentation der Arbeit um künftigen Studiengängen einen besseren Einstig zu ermöglichen.

Mögliche Themen für neue Projektziele

  • Realisierung eines Auswerfers um Teile in bestimmte Kästen zu sortieren
  • Serienproduktion Optimierung der Maschine auf kostengünstige Hardware
  • Rückführung um nicht erkannte Teile wieder zurück in den Prozess zu führen
  • Sortiersystem welche Bauteile kommen zusammen in ein Fach eines Kastens?


[1] [3] [2] [4] [5] [6]

Dokumentation

SVN

Main Funktion : Main-Funktion die alle andere Unterfunktionen aufruft

AutomatischesZaehlen.m

FARBERKENNUNG_V2.m

Merkmalsberechnung_3.m

[1]

Gefährdungsbeurteilung

SVN Link zur Gefährdungsbeurteilung
Eine Anlagenprüfung/Gefährdungsbeurteilung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden [5]

Autoren

  1. 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 1,11 1,12 1,13 1,14 1,15 1,16 1,17 Autor Christo Tsibadze
  2. 2,00 2,01 2,02 2,03 2,04 2,05 2,06 2,07 2,08 2,09 2,10 Autor Simon Hanemann
  3. 3,0 3,1 3,2 3,3 3,4 3,5 3,6 Autor Niklas Lingenauber
  4. 4,0 4,1 4,2 4,3 4,4 Autor Sergej Krause
  5. 5,00 5,01 5,02 5,03 5,04 5,05 5,06 5,07 5,08 5,09 5,10 Autor Adam Fankhauser Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „Autor: Fankhauser“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert.
  6. 6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 Autor Kevin Penner

Siehe auch / Weiterführende Links

  1. SVN: Checkout URL | https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk
  2. Rückblick (WS15): | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015
  3. Fortsetzung Nr.2 (WS16/17): | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_2017