TechTipps

Roboter erkennt Codes

HALCON-Bildverarbeitung in Roboterabläufe integrieren

Viele Robotikanwendungen wie Bin Picking und Teile-Handling sind bereits mit den integrierten Features von Mikado ARC einfach und effizient realisierbar. Ein neues Werkzeug ergänzt die Robotersteuerung nun mit einer Schnittstelle, die Erweiterungen von Mikado-Programmabläufen durch selbst erstellte HALCON-Bildverarbeitungsabläufe ermöglicht. Dadurch wird Mikado flexibler und selbst spezielle Anwendungen können effizient automatisiert werden.

Bildverarbeitung mit HALCON ist von Anfang an eine der Basiskomponenten für viele integrierte Bildanalysen und damit Grundlage der adaptiven Eigenschaften der Robotersteuerung. Dank des intuitiven Bedienkonzepts arbeiten die HALCON-Prozesse vollständig im Hintergrund, wodurch Anwender keine Bildverarbeitungsexperten sein müssen, um Mikado zu nutzen. Mit "HALCON Script Tasks" kann die Bildverarbeitungsbibliothek der Firma MVTec auch für eigene Bildanalysen innerhalb des Mikado-Programmablaufs verwendet werden.

Der Techtipp beschreibt beispielhaft die Integration eines individuellen HALCON Tasks in einen Mikado-Programmablauf. Durch Lesen von 2D-Codes kann Mikado z.B. einen Produktwechsel einleiten, um andere Kisten oder Ablagepositionen zu verwenden.

Folgende 2D-Codes werden dazu im Beispiel verwendet:

ECC 200 Code
für den Artikel ‚12345678‘
ECC 200 Code
für den Artikel ‚98765432‘
Mikado QR-Code
mit Link auf die Mikado-Info Webseite

Hinweis
2D-Codes wie diese können Sie kostenlos mit Online-Code-Generatoren wie z.B.  https://barcode.tec-it.com/de erstellen.

Vorbereitung

Wählen oder erstellen Sie zuerst eine geeignete Roboterzelle mit dem Mikado-Assistenten mit einer Kamera, welche die 2D_Codes lesen soll. Starten Sie anschließend Mikado mit dieser Zelle. Da mithilfe eines 2D-Codes ein Produktwechsel stattfinden soll, benötigen Sie als nächstes eine geeignete Produktliste. In diesem Beispiel beginnen die Produkte mit dem Präfix "Product_" gefolgt von der Artikelnummer, die durch den 2D-Code eingelesen wird. Das Einrichten von Produkten ist in der Mikado-Dokumentation in Kapitel "Produktverwaltung" erläutert.

Beispiel einer Produktliste
Beispiel einer Produktliste

Weiterhin benötigen Sie eine Kamerakonfiguration für Ihre Ensenso 3D-Kamera, die für die Aufnahme eines Monobildes geeignet ist. Insbesondere sollten Sie den Projektor deaktivieren und die Belichtungszeit für einen guten Kontrast anpassen. Speichern Sie die Konfigurationsdatei schließlich in das Unterverzeichnis "config" des Zellen-Projektverzeichnisses (Beispiel: "cameraconfig.json").

Hinweis
Die Kamerakonfiguration kann mithilfe der Ensenso NxView Applikation erstellt werden.

Mikado Programmablauf erstellen

Programm-Editor: Einbindung eines Hdev-Scripts in den Programmablauf
Programm-Editor: Einbindung eines Hdev-Scripts in den Programmablauf

Als nächsten Schritt erstellen Sie den Programmablauf wie abgebildet mithilfe des Programm-Editors und legen dabei die benötigten Variablen an.

Startsequenz: "Code Detection"

Die Sequenz wird bei Programmstart einmalig ausgeführt und enthält folgende Tasks:

  • Kamera Konfiguration laden
    Wechselt die Konfiguration für die Ensenso Kamera. Die Konfiguration cameraconfig.json (Variable cameraConfigCodeDetection", String) ist hinsichtlich 2D Bildaufnahme optimiert. In diesem Fall wird der Projektor deaktiviert und die Belichtungszeit für gute Kontraste angepasst.
  • Punktwolke aufnehmen
    Triggert die Kamera für eine Aufnahme. In den folgenden Schritten wird keine 3D-Punktwolke ausgewertet, dieser Task löst jedoch ebenso die Aufnahmen der Mono-Kameras aus.
  • Halcon Script ausführen
    Die eigentliche Code-Erkennung findet in diesem Schritt statt. Das HDev-Script mikado_code_detection.hdev (Variable "codeDetectionHdev", String) wird ausgeführt und kann auf Bilddaten der Ensenso zugreifen. Das Skript selbst wird im nächsten Schritt erstellt.
  • Liste leer?
    Das HDev-Script zur Code-Erkennung wird auf die Mikado-Variablen zugreifen und erkannte Codes als StringList in die Variable "dataCodeResultList" schreiben. Bleibt die Liste leer, so wurde kein Code erkannt. In diesem Fall springt der Ablauf zur zweiten Sequenz namens "Detection failed" und endet hier im Fehlerzustand. Enthält die Liste mindestens einen Eintrag, so findet kein Sequenzwechsel statt und der Ablauf fährt mit dem nächsten Task fort.
  • Kopiere nächsten Eintrag aus Liste
    Kopiert den ersten Eintrag der Liste "dataCodeResultList" in die Variable "detectedProductNr". Es wird also lediglich der erste erkannte Code ausgewertet.
  • Setze aktives Produkt
    Führt den Produktwechsel durch. Hinweis: Existiert das Produkt nicht, wird an dieser Stelle ein Fehler ausgegeben und die Programmausführung bricht ab.
  • Programm beenden
    Programm anhalten.

Sequenz: "Detection failed"

Wird ausgeführt wenn die Barcode-Erkennung keine Barcodes findet.

  • Fehler
    Hält das Programm im Fehlerzustand an.

HALCON-Script für die Erkennung von 2D-Codes erstellen

Als nächstes widmen wir uns dem Erstellen des HALCON-Scripts, welches die Erkennung der verschiedenen 2D-Codes realisieren soll.

Hinweis
Alle Mikado-spezifischen HALCON-Operatoren werden in der Mikado-Dokumentation in Kapitel "Halcon Script Task" erklärt.

Öffnen Sie hierzu HDevelop und erstellen ein neues HDev-Script. Zu Beginn des Programms wird ein rektifiziertes Monobild der rechten Kamera der Ensenso eingelesen und in der Variable Image2D abgelegt (Zeile 4).

1  * Read right image from last capture of Ensenso camera and
2  * detect data matrix codes / QR codes in image.
3
4  mikado_get_2d_image(Image2D, 'Ensenso_Camera_0', 'right', 'rectified')

Danach nutzen Sie den Operator find_data_code_2d um das Bild nach Datamatrix-Codes vom Typ 'ECC 200' zu durchsuchen (Zeile 6 - 7). Die Standardparametrierung erfüllt hier ihren Zweck. Natürlich kann die Parametrierung auch durch Training optimiert werden. Zu diesem Thema finden Sie Informationen in der HALCON-Dokumentation.

Da die Produkte der Beispiel-Produktliste mit dem Präfix ‚Product_' beginnen sollen, werden die dekodierten Artikelnummern damit entsprechend erweitert (Zeile 11 - 13)

6   create_data_code_2d_model('Data Matrix ECC 200', [], [], DataCodeHandle)
7   find_data_code_2d(Image2D, dataMatrixXLDs, DataCodeHandle, [], [], resultHandles,
      decodedDataStrings)
8   clear_data_code_2d_model(DataCodeHandle)
9
10  * Prepend 'Product_' to article number (as this is our Mikado product name)
11  for Index := 0 to |decodedDataStrings|-1 by 1
12     decodedDataStrings[Index] := 'Product_' + decodedDataStrings[Index]
13  endfor

Da das Script ebenfalls "QR Codes" erkennen und dekodieren soll, starten wir die Suche erneut mit der entsprechenden Parametrierung (Zeile 15 - 17).

15  create_data_code_2d_model('QR Code', [], [], DataCodeHandle)
16  find_data_code_2d(Image2D, qrXLDs, DataCodeHandle, [], [], resultHandles,
       decodedQrStrings)
17  clear_data_code_2d_model(DataCodeHandle)

Die dekodierten Informationen aus beiden Suchvorgängen werden zu einer Liste von Strings zusammengefügt (Z. 19) und an Mikado weitergegeben (Z. 20). Beim Erstellen des Mikado-Programmablaufs im vorherigen Schritt wurde die Variable "dataCodeResultList'" für diesen Zweck erstellt.

19  decodedStrings := [decodedDataStrings, decodedQrStrings]
20  mikado_write_variable('dataCodeResultList', 'StringList', decodedStrings, [])

Als letzten Teil des Scripts können Sie noch ein Bild an Mikado weitergeben, das z.B. Ergebnisse oder Analyseinformationen anzeigen soll. In diesem Fall verwenden Sie eine Reihe an Operatoren, mit denen Sie die Umrisse der erkannten Codes farblich ins Bild einzeichnen (ab Z. 24). ECC 200 Codes werden grün, QR-Codes werden orange umrahmt.

23  * Publish an image with results
24  get_image_size(Image2D, Width, Height)
25  open_window(0, 0, Width, Height, 0, 'buffer', '', WindowHandle)
26  disp_image(Image2D, WindowHandle)
27  set_line_width(WindowHandle, 5)
28  set_color(WindowHandle, 'green')
29  disp_xld(dataMatrixXLDs, WindowHandle)
30  set_color(WindowHandle, 'orange')
31  disp_xld(qrXLDs, WindowHandle)
32  dump_window_image(OutputImage, WindowHandle)
33  mikado_publish_2d_image(OutputImage)

Folgender Screenshot zeigt nochmals das gesamte Script als Screenshot aus der HDevelop-Umgebung.

Speichern Sie das fertige HDev-Script schließlich in das Unterverzeichnis "scripts" des Zellen-Projektverzeichnisses.

Hinweis
Einige HALCON Operatoren am Ende des Scripts sind mit einem roten Warnsymbol gekennzeichnet. Die Warnung betrifft die Ausführung des Scripts innerhalb der HDevelop-Umgebung. Da das Skript jedoch später in Mikado von der Hdev-Engine ausgeführt wird, können diese Warnungen ignoriert werden.

Tipp
Wenn Sie HDevelop direkt auf dem Mikado-Controller ausführen, können Sie das Script auch direkt in HDevelop testen. Dann haben Sie zudem die volle Unterstützung der Entwicklungsumgebung für die Mikado-Operatoren. Starten Sie hierfür Mikado einfach parallel zu HDevelop. Sowohl der Mikado-Programmablauf als auch die einzelnen HALCON-Operatoren können nun Schritt für Schritt ausgeführt werden. Dies hilft Ihnen bei der Entwicklung und beim Testen des HDev-Scripts.

Programm ausführen und testen

Die folgenden Mikado-Screenshots zeigen Ergebnisse der Programm-Ausführung. Wird einer der beiden ECC 200 Codes gescannt, für deren kodierten Artikelnummern entsprechende Produkte angelegt wurden, so wird das aktive Produkt erfolgreich gewechselt.

Möchten Sie das zugehörige Kamerabild mit eingezeichneten Resultaten anzeigen, so wechseln Sie vor dem Start des Programms unten rechts zum Reiter "Camera". Dort wählen Sie oben bei "Show Image:" in der Combobox den Eintrag ‚/mikado_hdevengine_node/halcon_picture' aus. Nun wird nach Ausführung Ihres Hdev-Scripts das aufgenommene Bild angezeigt und die dekodierten 2D-Codes farblich eingerahmt.

Statusansicht bei Verwendung der Datamatrix des Artikels ‚12345678‘
Statusansicht bei Verwendung der Datamatrix des Artikels ‚12345678‘
Statusansicht bei Verwendung der Datamatrix des Artikels ‚98765432‘
Statusansicht bei Verwendung der Datamatrix des Artikels ‚98765432‘

Ist die Kamera auf den QR Code gerichtet, enthält die dekodierte Information keine Artikelnummer, sondern eine URL zur Mikado Webseite. Da kein Produkt mit diesem Namen existiert, endet der Programmablauf, wie im Screenshot dargestellt, in einem Fehler.

Statusansicht bei Verwendung des Mikado QR Codes
Statusansicht bei Verwendung des Mikado QR Codes

Zusammenfassung

Durch die Einbindung individueller HALCON Tasks in einen Mikado Programmablauf können die unterschiedlichsten Bildauswertungen und deren Ergebnisse in einer Roboteranwendung eingesetzt werden. Sowohl Inspektionsaufgaben, Vermessungen, Texterkennung mittels OCR, sowie die Klassifikation von Produkten mittels Deep Learning sind möglich. Auch eine anwendungsspezifische Objekterkennung lässt sich über ein HDev-Script realisieren. Anwender erhalten damit eine Schnittstelle, um Mikado mit Machine Vision-Features zu erweitern. Mit der Möglichkeit eigenes Bildverarbeitungswissen zu integrieren, können auch spezielle Anwendungen effizient automatisiert werden. Weitere Infos und Beispiele für die HALCON-Integration finden Sie in der Mikado-Dokumentation.