Legoteil Zählmaschine 2016 2017: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 140: Zeile 140:
[[Datei:Thresholder Binaerbild Legoteilerkennung.PNG|500px|thumb|zentriert|Segmentierung der Legoteile mithilfe des Color Thresholder Tools]]
[[Datei:Thresholder Binaerbild Legoteilerkennung.PNG|500px|thumb|zentriert|Segmentierung der Legoteile mithilfe des Color Thresholder Tools]]
<br />  
<br />  
Die Funktion zur Segmentierung findet man hier:  
Die Funktion zur Segmentierung findet man hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\createBinary_V3.m  createBinary_V3]
   
   
<br /><br />
<br /><br />

Version vom 5. Januar 2017, 21:47 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 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:

  • 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


[1]

Projektplan

Meilensteine für das 7. Semester mit oder ohne Deadlines: UNTER BEARBEITUNG

[1] [3]








Realisierung

Gruppe: Separierung


Gruppe: Bildverarbeitung/Legoteil-Erkennung

[1] [4]

Im vorherigen Semster 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 Bilverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen (Link zum Wikiteil mit der Separierung einfügen!!!). 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:

Abbildung 2: Schnittstellen der Legoteilerkennung


Mechanischer Aufbau



Grober Ablauf der Legoteilerkennung


Abbildung 3: Grober Ablaufplan Legoteilerkennung


Matlabimplementierung



Ablaufplan:
Ablaufplan Legoteilerkennung

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 4), 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:

Abbildung 4: Kalibrierbild

Ablaufplan Kamerakalibrierung
Das Kalibrierbild befindet sich im folgenden Ordner: Calib_Img

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.

Segmentierung der Legoteile mithilfe des Color Thresholder Tools


Die Funktion zur Segmentierung findet man hier: createBinary_V3



Legoteilerfassung:
Stickwort: Legoteil an Kante, Legoteil in Bewegung, Nur ein Legoteil (Labeln)

Teach In



Gruppe: Sortierung

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€

[2]

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: Vereinzelung pusten (1)
01: Vereinzelung pusten (2)
02: Erkennung pusten
Z: Status (0=aus; 1 = an) B ID NR Z E B V 02 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: [4]

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

[5] [3]

Fazit

Abgeschlossene Punkte

Offene Punkte

Ausblick/ Planung der Aufgaben für das Folgesemester

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

Dokumentation

UNTER BERARBEITUNG


[1]


Autoren

  1. 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 Autor Christo Tsibadze
  2. 2,0 2,1 2,2 Autor Simon Hanemann
  3. 3,0 3,1 3,2 Autor Niklas Lingenauber
  4. 4,0 4,1 4,2 Autor Kevin Penner
  5. 5,0 5,1 Autor Sergej Krause
  6. Autor Adam Fankhauser