Legoteil Zählmaschine 2016 2017
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 7. Semester durchgeführt wurde. [1] [2]
Autoren: Adam Fankhauser, Christo Tsibadze, Kevin Penner, Niklas Lingenauber, Sergej Krause, Simon Hanemann
Betreuer: Prof. Schneider, Prof. Goebel
Aufgabenstellung
Die vorhandene Legoteilzählmaschine (siehe Legoteilzählmaschine_2016 ) soll Soft- und Hardwaremäßig modifiziert werden, um drei wichtigsten Anforderungen zu erfüllen. Die Vereinzelung bzw. Separierung der Legoteile soll verbessert werden damit in Bildverarbeitungsbox nur einzelne Legoteile zugeführt werden. Für die Bildverarbeitung bzw. Legoteilerkennung soll ein neuer Ansatz entwickelt werden. Bisherige Ansätze konnten Merkmale bei einigen Legoteilen teilweise ungenau ermitteln. Die größten Probleme gab es bei schwarzen und braunen Legoteilen, sowie an Licht-reflektierenden Flächen der Legoteile und bei Schattenbildung. Nach der Legoteilerkennung wurde bisher nur binär sortiert, erkannt und nicht erkannt. In diesem Semester soll ein Konzept aufgestellt und zum Teil realisiert werden.
[1]
Aufgabenteilung
Die in der Aufgabenstellung genannten wichtigsten Arbeitspakete wurden wie folgt in drei Teams aufgeteilt:
- Adam Fankhauser, Niklas Lingenauber:
- Separierung:
- Neues Konzept zur Separierung der Legoteile
- Umbau der Legoteil-Zählmaschine
- Erkennung von Legoteil-Gruppen
- Neues Konzept zur Separierung der Legoteile
- Weitere Aufgaben:
- Entwurf einer Steuerplatine zur Realisierung des neuen Konzeptes
- Umbau Schaltschrank
- Separierung:
- Kevin Penner, Christo Tsibadze:
- Bildverarbeitung: Neuer Ansatz für bessere Farb- und Merkmalerkennung der Teile
- Ablauf der Bildverarbeitung / Legoteilerkennung
- Schnittstellen
- Mechanischer Aufbau Neuer BV-Box
- Matlabimplementierung
- Ablaufplan
- Parametrisierung der Kamera
- Automatische Kalibrierung der Kamera
- Legoteilerkennung
- Weitere Aufgaben:
- "Abflussrohr", Transportsrohr für Legoteile (Bildverarbeitungsbox --> Sortierung)
- "Drosselklappe", Prototyp für Separierung in Y-Richtung
- Kommunikation mit Arduino
- Bildverarbeitung: Neuer Ansatz für bessere Farb- und Merkmalerkennung der Teile
- Simon Hanemann, Sergej Krause:
- Sortierung:
- Konzepte verschiedener Sortierverfahren
- Realisierung eines Linearläufers
- Hardwareaufbau der Sortierungskästen
- Programmierung des Linearläufers mithilfe des GeckoDrive
- Hardwaresicherung für Linearläufer
- Weitere Aufgaben:
- Sortierung:
Projektplan
Meilensteine für das 7. Semester mit oder ohne Deadlines: UNTER BEARBEITUNG
Realisierung
Gruppe: Separierung
[4]
[3]
Die Ergebnisse des vorausgegangenen Praktikums haben aufgezeigt, dass eine Vereinzelung der Legoteile mit dem vorhandenen Aufbau schwer zu verwirklichen ist (siehe Semster 2016 Fazit). Durch das Befüllen des Bunkers mit einer Vielzahl an Legoteilen lässt sich die Anzahl der sich auf den Fließbändern befindlichen Teile nur schwer steuern. Ein langsameres Fördern aus dem Bunker reicht nicht aus, da sich bereits die Anzahl der mit einer Ladungszufuhr transportierten Legoteile nicht durch das In-Reihe-Schalten zwei unterschiedlich schnell laufender Bänder separieren lässt. Hinzu kommt, dass das Anbringen von Hindernissen auf dem ersten Förderband nicht wie gewünscht die Legoteil-Gruppen auseinander zieht und gelegentlich durch verklemmte Teile die Legoteilzufuhr zur Bilderkennung verstopft. Dies hat in Kombination mit den Problemen bei der Sortierung von Legoteilen nach dem Erkennungsprozess dazugeführt, dass eine Überarbeitung des Gesamtkonzeptes notwendig war, um eine zuverlässige Legoteil-Zählmaschine realisieren zu können. Aufgrund der ebenfalls neuen Konzepte der Erkennung und der Sortierung ist es nun notwendig, die Legoteile einzeln, nacheinander in die Bildverarbeitungsbox einzuführen.
Neues Konzept zur Separierung der Legoteile
Das neue Konzept zur Separierung besteht aus einer eigenen Bilderkennungsbox, in der zu erkennen ist, ob sich mehrere Legoteile zur selben Zeit in ihr befinden. Ist dies der Fall, sind zwei Luftdüsen, die am Ausgang der Box angebracht sind und entgegen der Laufrichtung des Fließbandes zeigen, anzusteuern, um die Teile zurückzuwerfen. Da das Fließband weiterläuft, werden die Legoteile wieder zurück in diese Bildverabeitung befördert und können für den Fall, dass sie vereinzelt sind, die Box passieren und in die Bilderkennung für die Legoteilerkennung zu gelangen. Ist dies nicht der Fall werden erneut die Düsen angesteuert, um die Legoteile zurückzuwerfen. Bei diesem Konzept der Separierung kann auf ein zweites Förderband zunächst verzichtet werden.
Umbau der Legoteil-Zählmaschine
Um das angesprochene Konzept umzusetzen, mussten einige Komponenten an der Legozählmaschine umgebaut und angepasst werden (siehe Abbildung 2). Zum Einen wurde das erste, kurze Förderband entfernt, sodass nur noch das Lange verwendet wird. Dies war notwendig um Platz für den Anlagenteil zur Sortierung zu schaffen, außderdem ist die Separierung durch zwei unterschiedlich schnell laufende Förderbänder nicht mehr Teil des Separierungskonzepts. Am Anfang des Förderbandes wurde der Bunker platziert, der die Legoteile auf das Band befördert. Die Box zur Bilderkennung befindet sich nach wie vor mittig auf dem langen Förderband. Innerhalb dieser Box wird die Lage der Legoteile erfasst. Am Ausgang der Box wurden zwei Luftdruckdüsen so angebracht, dass diese die Legoteile in der Box auf dem Band zurück pusten können. Mithilfe dieser Düse ist es nun möglich, von der Bilverarbeitung erkannte Häufungen von Legoteilen auseinander zu treiben. Am Ende des langen Laufbandes wurde eine neue Bildverarbeitungsbox angebracht, in der die Legoteile erkannt werden (weitere Informationen hierzu sind im Kapitel "Gruppe: Bildverarbeitung/Legoteil-Erkennung" zu finden). Diese wurde schräg montiert, sodass Legoteile hineinrutschen können. Über ein Abwasserrohr, welches seitlich an der Box angebracht wurde, können nach der Erkennung die Legoteile per Druckluft in die Sortierung befördert werden (siehe Kapitel "Gruppe: Sortierung"). Für die Sortierung wurde ein Linearläufer mit Gecko-Drive verbaut. Auf dem Linearläufer wurde eine Befestigung für Sortierkästen angebracht. Um Platz zur Umsetzung einer Sortieranlage zu schaffen, wurde der Stromkasten vor Kopf der Anlage platziert. Unter dem Förderband wurde ein Ventilinsel platziert, mit der sich alle Luftdruckdüsen des Systems steuern lassen. Die Ventilinsel ist mit vier Ventilen bestückt, es können aber weitere Ventile nachgerüstet werden. Die Kontakte der Ventilinsel sind in den Schaltschrank geführt. Der Druckluftanschluss kann über ein Schnellspannanschluss an normale Druckluftanschlüsse angeschlossen werden. Die Verkabelungen und Verschlauchungen des neuen Aufbaus wurden, soweit möglich, in Kabelkanälen verlegt.
Bisher noch nicht abgeschlossene Arbeiten am Umbau sind die Schutzbleche hinten und seitlich am langen Förderband, die die Legoteile vom herabfallen vom Förderband hindern, so sie aus dem Bunker auf das Band fallen und von den Druckluftdüsen auf dem Band zurück gepustet werden. Darüber hinaus wurden bereits Besen angeschafft, von denen einer als Abstreifer über dem Bunkerförderband befestigt werden muss, um größere Haufenbildung im Bunker zu unterbinden. Dafür muss ein Besen gekürzt werden und eine Halterung aus Boschprofilen angebracht werden. Die Arbeiten konnten aufgrund von mangelnder Zeit nicht mehr umgesetzt werden, da die Umbauarbeiten an der Maschine und die Neuentwicklung der Steuerplatine sehr aufwendig waren.
Erkennung von Legoteil-Gruppen
Zur Umsetzung der Separierung wurde eine Funktion entwickelt, die Gruppen von Legoteilen erkennen soll und die Separierung per Luftdruck durchführt.
Programmablauf (siehe Abbildung 3)
Zu Beginn der Separierungsfunktion müssen zunächst Steuerbefehle zur Betreibung der Anlage erteilt werden. Dazu gehört die Einrichtung einer Seriellen Schnittstelle mit dem steuernden Arduino. Außerdem sind Einstellungen an der Webcam vorzunehmen, um Fehler durch unterschiedliche Kameraparameter zu verhindern. Diese können beispielsweise durch Kalibrierungsfunktionen entstehen. Neben der Definition von weiteren Parametern, mit denen sich beispielsweise der betrachtete Bereich im inneren der Bildverarbeitungsbox einstellen lässt, wird die Anlage automatisch gestartet, d.h. es sind die Laufbänder zu starten und das Licht in der Fotobox einzuschalten.
Nach dem die Anlage gestartet wurde, wird die eigentliche Funktion der Legoteil-Gruppenerkennung gestartet. Es wird ein Bild vom Innenraum der Bildverarbeitung aufgenommen (siehe Abbildung 4, oben links) und anhand der zuvor eingestellten Parameter so zugeschnitten, dass Bildränder und weitere uninteressante Bereiche wie der unmittelbare Ein- und Ausgangsbereich entfernt werden. Anschließend wird das Bild so gefiltert, dass nur noch die Legofarben Inhalt des Bildes sind. Das Ergebnis wird dabei in ein Binärbildumgewandelt, die Erkennung der Farben wird durch mehrere Unterfunktionen realisisert. Die entstandenen Bilder werden von kleinen Pixelelementen entfernt, und Lücken im Inneren der Objekte geschlossen. Anschließend werden die Bilder zu einem zusammengeführt. Durch Labeln der Pixelgruppen kann nun die Anzahl der Objekte im Raum bestimmt werden (siehe Abbildung 4, unten links). Anschließend wird ein zweiter Zuschnitt des Bildes vorgenommen, der einen kritischen Bereich betrachtet. Dieser Bereich liegt an einer Stelle, an der die Luftdruckdüsen präzise auf die Legoteile ausgerichtet sind. Außerdem handelt es sich hieberi um einen dünnen Streifen, der die Breite des Förderbandes aber zwingend abdecken muss. Nach dem erneuten Zuschnitt des Bildes wird ausgewertet, wie viele verschiedene Label in diesem Bereich vertreten sind (siehe Abbildung 4, rechts). Befindet sich mehr als ein Objekt im kritischen Bereich, sind die Luftdruckdüsen anzusteuern, da die Legoteile nicht separiert in der Legoteilerkennung ankommen würden. Befindet sich ein oder kein Legoteil in diesem Bereich, werden die Düsen geschlossen und die Teile werden in die Legoteilerkennung befördert. Das Ergebnis der Software wir in Abbildung 4 in der Überschift oben links ausgegeben. Diese Funktion muss während des gesamten Programmablaufs durchgeführt werden. Wird das Programm beendet, wird die Anlage gestoppt, d.h. das Licht und die Motoren werden ausgeschaltet. Das Software-Modul lautet: Separierung.m
Verbesserungsmöglichkeiten der Software
Aufgrund des hohen Zeitaufwandes des Anlagenumbaus und einer später Lieferung der Pneumatik, konnte die Software nicht ausgibig im Betrieb getestet und nicht optimiert werden. Erste Schnelltests haben jedoch gezeigt, dass die Legoteile bei einer großen Anzahl in der Bildverarbeitungsbox durch gegenseitige Behinderung die Box nicht mehr verlassen und gegen den unteren Rand des Eingangsbereiches der Box stoßen. Dadurch werden die Teile nicht ausreichend weit zurückgeworfen. Da in die aktuelle Version der Software noch kein Stoppen des Bunkers integriert ist, sobald mehrere Teile in der Box erkannt werden, werden zeitgleich weitere Teile in die Bildverarbeitung transportiert. Dies führt zu einer durchgängigen Aktivierung der Düsen. Eine Bunkeransteuerung in Abhängigkeit des Auswertungsergebnisses ist durch eine zusätzliche Verwendung der Seriellen Schnittstelle leicht umzusetzen. Weitere Abhilfe sollte die Vergrößerung des Eingangsbereiches schaffen, sodass zurückgepustete Legoteile die Bildverarbeitung wieder verlassen können.
Ein weiterer Aspekt ist, dass über- oder direkt aneinanderliegende Legoteile mit dem aktuellen Algorithmus als ein Teil erkannt und durchgelassen werden. Dies kann dadurch verbessert werden, dass z.B. durch die Verwendung von Besen und Abstreifern das Übereinanderliegen der Legoteile verhindert wird. Außerdem kann beispielsweise ermittelt werden, ob erkannte Objekte aus unterschiedlichen Farben bestehen. Ist dies der Fall, handelt es sich nicht um ein Teil, sondern um mehrere. Dies würde die Wahrscheinlichkeit reduzieren, dass mehrere Legoteile in die Bildverarbeitung der Legoteilerkennung gelangen.
Des Weiteren ist es denkbar, die beiden Luftdruckdüsen einzeln anzusteuern. Dadurch kann möglicherweise erreicht werden, dass bei einer geringen Anzahl an Legoteilen nebeneinander, nicht alle zurückgeworfen werden und eines dennoch durchlaufen kann. Dazu muss jedoch sowohl die Ausrichtung der Luftdüsen als auch die Erkennung der Algorithmen dahingehend angepasst werden, dass erkannt werden kann, welche Düse zu betätigen ist und welche Auswirkungen dies auf die Legoteile hat.
Eine weitere Unterstützung der Separierung wäre möglich, in dem das Fließband und der Bunker angehalten werden, sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung erkannt wird. Wurde dieses aus der Box entfernt, könnten beide Bänder wieder gestartet werden.
Weitere Aufgaben
Entwicklung einer Steuerplatine zur Realisierung des neuen Konzeptes
Zur Inbetriebnahme der umgebauten Anlage war es notwendig, die Funktionen der Schaltplatine zu erweitern. Die eingebaute Steuerplatine war auf den Arduino aufgesattelt und bezog Steuersignale sowie die 5 V Versorgungsspannung direkt über die eingesteckten Pins. Mit dieser Platine ist es möglich, drei Motoren mit Strom zu versorgen bzw. durch ein PWM Signal zu steuern. Zusätzlich konnten noch zwei Servomotoren und zwei Infrarotsensoren betrieben werden. Durch die Konzeptänderung der Separierung und der Bildverarbeitung wurde es notwendig, weitere Schaltfunktionen hinzuzufügen. Die Bildverarbeitung benötigte durch Software schaltbares Licht, um zwischen Durch- und Drauflicht in der Bildverarbeitungsbox umschalten zu können. Die Ansteuerung des Lichts sollte, ebenso wie bei den Motoren, über den Arduino erfolgen. Die Spannungsversorgung der Bildverarbeitungsbox war in der Vergangenheit mit einem eigenen Netzteil erfolgt, welches direkt in eine Steckdose eingesteckt wurde. Neben der Einrichtung von schaltbaren Licht, wurde die Schaltung der Pneumatik hinzugefügt. Auch diese sollte über den Arduino gesteuert werden. Die Ventilinsel wird mit 24 V Signalen angesteuert. Die Motoransteuerung musste auch bei der neuen Steuerplatine wieder per MOSFETs umgesetzt werden, da die Geschwindigkeit hier per PWM Signal gesteuert wird. Die Lichtansteuerung der LED Streifen in den Bildverarbeitungsboxen sollte ebenfalls per MOSFET geschehen, da die Schaltfrequenz gegebenfalls recht hoch werden kann und mechanische Relais nicht für höhere Schaltfrequenzen ausgelegt sind. Außerdem benötigen diese eine 12 V Versorgungsspannung. Die Option auf einen weiteres Netzteil, um aus 230 V Netzspannung die 12 V Spannung für die LEDs herzustellen, wurde aufgrund des hohen Kaufpreises für das Netzteil sowie des hohen Aufwandes für den Umbau abgelehnt. Als Alternative wurde sich für die Verwendung von Linearspannungsreglern auf der Steuerplatine entschieden, die aus der vorhandenen Spannung von 24 V, die zur Versorgung der Motoren benötigt werden, 12 V erzeugen sollen. Bei der Ansteuerung der Ventilinsel gab es ebenfalls zwei Optionen. Die erste Möglichkeit war die Nutzung von Relais, wie z.B. Solid State Relais, durch die Arduino-Ausgänge weniger belastet werden. Die zweite Option war die Nutzung der selben MOSFETs, die schon bei der Ansteuerung der Motoren und des Lichts verwendet wurden. Hier wurde sich aug Grund von bereits vorhandenen Komponenten und der damit verbundenen Einheitlichkeit für die zweite Variante entschieden. Der Schaltplan der Platine wurde in Multisim erstellt, der Leiterplattenentwurf in Ultiboard (die entsprechenden Dateien sind im Ordner D:\Studium und Arbeit\Studium Mechatronik\7. Semester\Systemintegration\MTR_SDE_Praktikum_2015\Dokumentation\12_Schaltplaene und Layouts\03_Layout_Schaltplatine_inkl_Pneumatik zu finden. Die Platine wurde anschließend in der Hochschule gefräst und bestückt(siehe Abbildung 5). Zum Anschluss an den Arduino wurde die Platine mit Schraubklemmen versehen. Der Arduino wurde eine Platine aus dem Zubehör erweitert, welche jeden Anschluss als Schraubklemme zur Verfügung stellt, um Platine und Arduino zu verbinden.
Während der Tests der Platine sind 2 MOSFETs aus unbekannten Gründen zerstört worden. Die Platine ist weiterhin für die aktuellen Funktionen einsatzfähig, für die Hinzunahme weiterer Funktionen, wie beispielsweise der Einbindung einer weiteren Druckluft-Düse, müssen die Bauteile jedoch ausgetauscht werden.
Umbau des Schaltschranks
Aufgrund des Einsatzes der neuen Steuerplatine war es notwendig, den Schaltschrank umzubauen (siehe Abbildung 6). Hierzu wurde die alte Steuerplatine entfenrt und an ihrer Stelle die neue Sattelplatine mit Schraubklemmen auf dem Arduino installiert. Auch wurde der Arduino auf einer Hutschienenhalterung installiert. Ebenso wurde die neue Steuerplatine auf einer solchen Halterung installiert. Die Anschlüsse untereinander wurden verbunden, die Anschlüsse zu den Geräten außerhalb des Schranks wurden auf Reihenklemmen gelegt. In dem Schaltschrank wurde zusätzlich noch der Gecko-Drive für die Steuerung des Linearläufers installiert. dieser wurde auf eine Seitenwand geschraubt, um Kühlung zu gewährleisten.
Gruppe: Bildverarbeitung/Legoteil-Erkennung
[1]
[5]
Im vorherigen Semester stellte sich heraus, dass bei dem bestehenden Konzept zur Erkennung von Legoteilen Probleme aufgetaucht sind. Darunter die Erkennung von schwarzen und braunen Legoteilen. Aber auch Schattierungen und Lichtrefelxionen an Legoteilen verfälschten die Merkmale so(z.B. Flächeninhalt), dass oftmals keine Klassifikation stattfinden konnte aufgrund von Nichtübereinstimmungen zwischen gemessenen Merkmalen und hinterlegten Merkmalen in der Datenbank (siehe Semster 2016 Fazit). So wurde ein neues Konzept mit einer neu angefertigten Kamerabox geplant und realisiert, da die Probleme softwaretechnisch nicht zu lösen waren.
Schnittstellen
Damit die Bildverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen (Separierung). Sobald ein Legoteil erkannt wurde, wird es aus der Box per Druckluft gefördert und muss anschließend sortiert werden. Damit das Legoteil richtig sortiert wird, wird dem jeweiligen Legoteil anhand der ID eine Box zugeorndet. Der Schnittstellenplan lässt sich zusammengefasst folgendermaßen darstellen:
Mechanischer Aufbau
Um die Lichtreflexionen und Schatten an den Legoteilen während der Bilderkennung zu vermeiden, wurde ein neues Konzept entwickelt. Wenn ein Legoteil sich auf einem halb-transparentem Milchglas befindet (siehe Skizze), wird zuerst die untere Beleuchtung angeschaltet und mittels Durchlichtverfahren die genaue Kontur des Legoteils mit der Kamera ermittelt. Hier können bereits einige Merkmale genau extrahiert werden und eine Maske erzeugt werden. Anschließend wird das untere Licht ausgeschaltet und das Obere angeschaltet. Nach diesem Schritt wird mit Hilfe der Maske nur in dem Bereich wo das Legoteil liegt die Farbe ermittelt.
Im nächsten Schritt wurde die Idee mit Hilfe der CAD ausgearbeitet. Die Konstruktion wurde einfach gehalten --> miteinander verschraubte Holzbretter.
Im Unteren Box am oberen Rand wurde die halbtransparente Plexiglasplatte angebracht. Direkt da drunter in einem bestimmten Abstand wurde eine weitere Ebene mit LEDs platziert. Der Abstand wurde so gewählt, dass bei angeschalteten LEDs das Licht oben am Plexiglas optimal gestreut wird (ohne Helle Punkte, ohne Licht-Spots).
Im oberen Box wurde im Deckel eine Bohrung erzeugt, wo die Leitungen der Kamera und weiteren LEDs durchlaufen können. Die LEDs wurden in rechteckiger Form angeordnet und von innen an Deckplatte befestigt (siehe Abbildung 9). Auf einer weiteren halbtransparenten Plexiglasplatte wurde die Kamera befestigt. Für die Kamera wurde eine weitere Bohrung erzeugt. Im oberen Box wurden Ein- und Ausgänge für die Legoteile erzeugt, sowie eine Aussparung für eine flache Druckluftdüse. Zur besseren Vorstellung befindet sich unter den folgenden Link das CAD-Modell als 3dxml-Datei:
BV_Box_Komplett.3dxml
Grober Ablauf der Legoteilerkennung
Matlabimplementierung
Das einzelne Programm für die Erkennung von Legoteilen befindet sich hier: Bildverarbeitung_Main_V1. Die einzelne Funktion für ein späteres Gesamtprogramm wurde ebenfalls geschrieben und befindet sich hier: AutomatischesZaehlen. der Funktion wird ein kalibriertes Kameraobjekt, die Schnittstelle zur Datenbank, die serielle Schnittstelle zum Arduino und das Kalibrierbild übergeben. Als Rückgabewert wird eine Liste mit den gezählten Legoteil-IDs zurückgegeben.
Parametrisierung der Kamera:
Für die Einstellungen der Paramter wurde das Matlabtool Image Acquisition Toolbox benutzt. Dort wurden einzelne Parameter so ausgetestet/eingestellt, dass sich zum einen die Legoteile beim Durchlichtverfahren gut vom Hintergrund abgrenzen und zum anderen die unterschiedlichen Legofarben beim Auflichtverfahren erkennen lassen. Folgende Einstellungen wurden getroffen:
cam.BacklightCompensation = 0;
cam.Tilt = 0;
cam.Sharpness = 128;
cam.Pan = 0;
cam.Saturation = 128;
cam.Brightness = 128;
cam.Contrast = 128;
cam.Gain = 0;
cam.ExposureMode = 'manual';
cam.FocusMode = 'manual';
cam.WhiteBalanceMode = 'manual';
cam.WhiteBalance = 4000;
cam.Focus = 10;
cam.Exposure = -3;
Kamera-Kalibrierung:
Obwohl die Parameter der Kamera konstant und unverändert waren, stellte sich heraus, dass das Bild der Kamera bei einigen Programmstarts trotzdem heller war. Um Neustarts des Programms zu vermeiden wurde so eine Kalibrierfunktion geschrieben, welche anhand eines aufgenommenen Bildes erkennt, ob die Kameraeinstellungen korrekt vorgenommen.
Dabei wird in einer Schleife ein Kameraobjekt erzeugt und mit den oben aufgeführten Einstelllungen/Parametern versehen. Nun wird ein Bild mit diesen Einstellungen geschossen (im Auflichtverfahren) und mit einem zuvor gespeicherten Bild (siehe Abbildung 12), welches die richtigen Einstellungen beinhaltet, verglichen. Sollten sich die durchschnittliche Helligkeiten der Bilder Unterschiede aufweisen, wird das Kameraobjekt neu erzeugt und der Vorgang wiederholt sich, bis die richtigen Einstellungen getroffen wurden.
Zusammenfassend beschreibt folgendes Diagramm den Ablauf der Selbstkalibrierung:
Das Kalibrierbild befindet sich im folgenden Ordner: Calib_Img und die Kalibrierfunktion hier: Cam_Configuration_Check_V1
Legoteilerkennung:
Die Legoteilerkennung erfolgt in einer Schleife, in welcher jeder einzelne Frame ausgewertet wird. Zum Beenden der Schleife und damit des Programms muss hier die Escape-Taste gedrückt werden.
Vorverarbeitung, Segmentierung & Nachverarbeitung:
Zunächst wird das im Durchlichtverfahren aufgenommene Bild zugeschnitten, damit unnötige Bildregionen nicht bearbeitet werden müssen. Die Anzahl an Pixeln, welche in Höhe und Breite weggeschnitten werden, wurde experimentell ermittelt und so ausgelegt, dass sich das größte Legoteil immer im Blickfeld befindet.
Daraufhin erfolgt die Binarisierung bzw. Segmentierung. Die Schwellwerte für die jeweiligen Farbkanäle und die Funktion zur Binarisierung wurden mithilfe des Matlabtools Color Thresholder ermittelt. Sollte sich im Laufe des Projektes die Kamerabox verändern (z.B. mehr LEDs eingebaut oder ein anderer Lichteinfall) muss diese Funktion ersetzt werden, da es sonst zu Segmentierungsfehlern kommen kann.
Die Funktion zur Segmentierung findet man hier: createBinary_V3
Im Anschluss werden noch kleine, einzelne Pixel im Hintergrund und im Legoteil gelöscht. Damit ist das Bild bereinigt und vollständig segmentiert.
Legoteilerfassung:
Damit ein Legoteil erfasst werden kann, müssen folgende Kriterien eingehalten werden:
- Legoteil muss sich an der Kante befinden
- Legoteil muss sich in einer Ruhelage befinden
- Es darf nur ein Legoteil im Bild vorhanden sein
Sollte mehr als ein Legoteil ein Bild sein, werden alle vorhandenen Legoteile in der Box herausgepustet und als "nicht erkannt" deklariert.
Farbliches Merkmale extrahieren:
Damit die Farbe erkannt werden kann, wird das Auflichtverfahren angewendet. Die Funktion "FARBERKENNUNG_V2" bekommt als Übergabewerte zwei Matrizen:
- RGB-Bild aus Auflichtverfahren 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. Es können weitere Farben im Nachhinein hinzugefügt werden oder Farbschwellwerte verändert werden, falls sich die Lichtverhältnisse in der Kamerabox durch Umbauten verändern.
Geometrische Merkmale extrahieren:
Die Funktion "Merkmalsberechnung_V3" 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).
Herauspusten der Legoteile:
Sobald alle Merkmale erfasst wurden, werden diese mit einer Datenbank abgeglichen und einer Legoteil-ID zugeordnet, anhand derer man die zugehörige Box (des Linearläufers) ermittelt und mitteilt. Danach erfolgt das Herauspusten des Legoteils aus der Kamerabox. Um herauszufinden, wann der Herauspusten beendet werden kann, wird das aktuelle Kamerabild (bei Auflichtverfahren) mit dem Kalibrierbild verglichen. Sollten hier keine großen unterschiede vorliegen, ist die Box leer und das Ventil der Druckluftdüse kann geschlossen werden.
Teach In
Coming soon
Gruppe: Sortierung
Die SDE-Gruppe von dem Semester 2016/2017 hat sich dafür entschieden, einen Linearläufer einzusetzen. Im folgenden Bild wird schematisch der Aufbau und Ablauf der Sortierung dargestellt.
Es wurden noch weitere Konzepte ausgearbeitet. Mögliche Ansätze für zukünftige Optimierungen des Auswerfers findet man [hier].[2] [6]
Schaltplan des Linearläufers
Geckodrive-> 24V-Netzteil | ||||||
Klemme (Gecko) |
Bezeichnung | Farbe | Überträgt | Klemme (Netzteil) |
Zusatz-Information | |
---|---|---|---|---|---|---|
1 | GND | Schwarz | Ground | GND | --- | |
2 | 24V | Rot | Spannung | 24V | 18-80 VDC |
Geckodrive-> Stecker des Schrittmotors | |||||||
Klemme (Gecko) |
Bezeichnung | Farbe | Überträgt | Stecker (Motor) |
Zusatz-Information | ||
---|---|---|---|---|---|---|---|
3 | WINDING A+ | Gelb | Schritte | PIN1 (Weiß) | Phase 1 | ||
4 | WINDING A- | Blau | Schritte | PIN2 (Braun) | |||
5 | WINDING B+ | Rot | Schritte | PIN3 (Blau) | Phase 2 | ||
6 | WINDING B- | Schwarz | Schritte | PIN4 (Schwarz) |
Geckodrive-> Stoppschalter -> Arduino | |||||||
Klemme (Gecko) |
Bezeichnung | Farbe | Überträgt | Klemme (Arduino) |
Zusatz-Information | ||
---|---|---|---|---|---|---|---|
7 | DISABLE | Blau | Signale | GND | Benötigt einen 33kΩ-Pulldown Widerstand | ||
--- | 5V | --- | Spannung | 5V | Versorgt den Not-Stopp-Schalter des Linearläufers |
Anmerkung: Sollte der Linearläufer zu nah an das Ende seiner Schiene kommen, so betätigt er einen der Stoppschalter. Diese schalten den Geckodrive aus und somit auch den Schrittotor. Im Notfall wird somit die Hardware geschont.
Geckodrive-> Arduino | ||||||
Klemme (Gecko) |
Bezeichnung | Farbe | Überträgt | Klemme (Arduino) |
Zusatz-Information | |
---|---|---|---|---|---|---|
8 | DIRECTION | Gelb | Signale | D5 | Gibt die Richtung an | |
9 | STEP | Blau | Signale | D6 | Gibt die Schritte an | |
10 | COMMON | Rot | Signale | D7 | Ein/Aus des Geckodrives |
Einstellung des Geckodrives
Elektrische Charakteristiker des Linearläufers | |||
Ohne Last | Auf max. Geschwindigkeit entgegen der Richtung des motors |
Auf max. Geschwindigkeit in Richtung Motor) | |
---|---|---|---|
Spannung | 24 V | 22 V | 24 V |
Strom | 0.63 A | 2.02 A | 1,60 A |
Leistung | 15,12 W | 44,44 W | 35,19 W |
Motor: MOT-AN-S56(NEMA23)
0,55m / 1,81 s = 0,304 m/s Richtung ende mit der Einstellung von F = 1000000 0,55m / 1,42 s = 0,387 m/s Richtung Motor mit der Einstellung von F = 1000000
Pin Options am GeckoDrive G201X:
1-5 Stromstärke einstellen eingestellt auf 4,4 AMPS
PIN | Schaltstellungen des Geckodrives | |
---|---|---|
1 | ON | |
2 | OFF | |
3 | OFF | |
4 | ON | |
5 | OFF | |
6 | ON | |
7 | ON | |
8 | ON | |
9 | ON | |
10 | ON |
Hinweis:
- 6-8 Keine Funktion bei dem NEMA-23
- 9 Auto Standby um den Motor bei stillstand auf 70% der Stromstärke zu drosseln um die Hitzeentwicklung zu reduzieren.
- 10 auf ON wenn mit NEMA-23 Motoren gearbeitet wird. (Es wird ein NEMA-23 Motor verwendet!)
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.
Elektronik/Arduino-Kommunikation
Arduino-Kommunikation
Zum Ansteuern der Aktoren mithilfe des Arduino Mega, wurde ein Kommunikationsprogramm geschrieben. Dieses ermöglicht dem Nutzer über den PC einen seriellen Befehl an den Arduino zu schicken, der daraufhin den Befehl ausführt. Zu den Befehlen gehören:
- Ansteuern der LED's in den Kameraboxen für die Erkennung bzw. Separierung
- Ventilsteuerung für die Druckluftdüsen für die Erkennung bzw. Separierung
- Einstellung der Drosselklappenstellung für die Sortierung
- Ansteuern der Förderbandmotoren
- Ansteuern des Linearläufers für die Sortierung
Für die Botschaften wurde ein einheitliches Framework herausgearbeitet. So besitzt jede serielle Botschaft folgende kodierte Inhalte:
- Am Anfang jeder Botschaft steht ein B
- Eine 1-stellige ID, welche die oben aufgeführten Aufgaben repräsentiert
- Eine 2-stellige Nummer (NR), welche einen bestimmten Aktor beinhaltet
- Eine 3-stellige Zusatzzahl, welche z.B. den Motoren eine relative Geschwindigkeit vorgibt, den LEDs bzw. Ventilen an/auf und aus/zu vorgibt oder die Sollposition für den Linearläufer bzw. Drosselklappe beinhaltet
- Die Botschaft wird mit einem E beendet
Eine detalierte Beschreibung der Kommunikation findet sich in folgender Tabelle:
Beschreibung | ID | NR | ZUSATZ | Gesamtstring | Beispielstring (ohne Leerzeichen) |
---|---|---|---|---|---|
Drosselklappe | D | 00 (nur eine Drosselklappe vorhanden) | Z: Stellung (0 oder 1) | B ID NR Z E | B D 00 001 E (Drosselklappe in Stellung 1) |
LED's | L | 00: Erkennung oben 1: Erkennung unten 2: Sortierung |
Z: Status (0=aus; 1 = an) | B ID NR Z E | B L 01 001 E (Erkennung unten an) |
Förderbandmotoren | M | 00: Bunker 01: Förderband |
Z: Power in % | B ID NR Z E | B M 01 080 E (Förderband mit 80%) |
Schrittmotor Sortierung (Linearläufer) | S | 00 - 08: Position | Z: 0 (kein Zusatz) | B ID NR Z E | B S 08 000 E (Linearläufer auf Position 8) |
Ventile | V | 00: Erkennung pusten 01: nicht belegt 02: Vereinzelung pusten (1) 03: Vereinzelung pusten (2) |
Z: Status (0=aus; 1 = an) | B ID NR Z E | B V 00 001 E (Erkennung pusten) |
Das Programm auf dem Arduino beobachtet dauerhaft den seriellen Eingang und reagiert bei einem Eintreffen einer Botschaft mit einem jeweiligen Ansteuern der digitalen Ausgänge. Das Programm befindet sich im folgenden Ordner:
Serielle_Kommunikation_Arduino_Matlab
Autor/Verantwortlicher: [5]
HSHL-Wiki-Dokumentation
Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet. Jedes Themenabschnitt unterliegt der bereits oben genannten Verantwortlichkeiten. [1]
Ergebnisse
Anleitung Programmstart
Fazit
Abgeschlossene Punkte
- Allgemein
- Evaluierung der Druckluftdüsen
- CAD-Modell des „Klemmbocks“ zu Befestigung der Düsen
- Sortierung
- Prozessablaufplan der Sortierung
- Montage Konzept der Sortierung
- Ansteuerung des Linear-Läufers
- Verdrahtung des Linearläufers
- Test der Funktionalität des Linearläufers
- Einbindung der Sensoren des Linearläufers
- Montage der einzelnen Kästen
Offene Punkte
- Allgemein
- Parallele Ausführung zweier Funktionen
- Bildverarbeitung der Separierung
- Bildverarbeitung der Legoteilerkennung
- Parallele Ausführung zweier Funktionen
- Separierung
- Schutzbleche für herunterfallende Legoteile
- Anbringung von Besen oder Abstreifern zur Verhinderung von Legoteil-Überlagerungen
- Sortierung
- Montage und Einbindung der „Auswerfer-Klappe“ vor dem Linearläufer
Kritikpunkte
- Es werden nicht die optimalen Luftdruckdüsen eingesetzt
- Ein zweite Bildverarbeitung zum Erkenn von Bauteilhaufen erfordert viel Rechenleistung
- Die Startposition des Linearläufers ist kann stark variieren und den den kompletten Prozess anhalten.
- Beim Überschreiten der Notfall Schalter des Linearläufers kann das System nicht eigenständig reagieren. Daher muss der Läufer manuell auch dieser Lage befreit werden.
- Es gibt noch keine Sicherheitsvorkehrungen, die im Fehlerfall den Prozess oder Teilprozesse stoppen.
- Wenn ein Sortierkasten überfüllt ist, können einzelne Teile aus dem Kasten fallen. Die Kapazität der Sortierkästen könnte angepasst werden.
Optmierungen
- Separierung
- Bildverarbeitung zum Erkennen von Bauteilhaufen
- Stoppen des Bunkers sobald mehrere Teile in der Box erkannt werden
- Vergrößerung des Eingangsbereiches
- über- oder direkt aneinanderliegende Legoteile als unterschiedliche Teile erkennen
- beid Luftdruckdüsen einzeln anzusteuern
- Erkennung welche Düse anzusteuern ist
- Ausrichtung der Düsen
- Anhalten der Fließbänder sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung ist
- ausgiebig testen
- Bildverarbeitung zum Erkennen von Bauteilhaufen
- Sortierung
- Einbau von zusätzlichen Sensoren für das Start/Kalibrierungsproblem des Linearläufers
- Verbinden der Sensoren des Linearläufers mit dem Arduino um automatisch bei Fehlerfällen eingreifen zu können.
- Ein Rohr mit geringerem Durchmesser würde den Trichter vor dem Linearläufer sparen.
Referenzen
Dokumentation
UNTER BERARBEITUNG