Das Steuern von Bewegungen beispielsweise von Robotern erfordert häufig Bildverarbeitung, um etwa die Position von Objekten oder Zielen zu ermitteln. Während Motion-Control- und Logikfunktionen in einem SPS-Programmiersystem erstellt werden können, erfolgt die Programmierung von Bildverarbeitung meist in einem zweiten Programmiersystem. Dadurch entsteht nicht nur ein erhöhter Aufwand für Entwickler und Anwender, sondern ein anfälliger und meist langsamer Datenaustausch zwischen beiden Systemen.
Zur Lösung dieses Problems werden Bildverarbeitung und Steuerung häufig komplett in Hochsprachen wie C++ programmiert, zumal hierfür umfangreiche Bildverarbeitungsbibliotheken wie OpenCV als Open Source Software zur Verfügung stehen. Andererseits verfolgt die industrielle Steuerungstechnik das Ziel, Software transparent mit Standardbausteinen zu erstellen, um sie so einfach ändern, übertragen und erweitern zu können.
Für Motion-Control-Anwendungen gibt es deshalb in den meisten Programmiersystemen zahlreiche nach PLCopen standardisierte Funktionsbausteine, auch zur Bewegungssteuerung von Mehrachssystemen wie Werkzeugmaschinen und Robotern. Da für Motion-Control-Anwendungen oft nur einfache Bildverarbeitungsfunktionen benötigt werden, lassen sich diese auch im gleichen SPS-Programmiersystem mit umsetzen. In dem hier vorgestellten Projekt werden Bilder während der Fahrt eines mobilen Roboters mit der Kamera eines Raspberry-PI-Mikrocomputers aufgenommen. Der Einsatz des Raspberry-PI erlaubt es, Bewegungen von Robotern oder anderen Anlagen zur Fabrikautomatisierung durch eine Soft-SPS-Anwendung mit dem SPS-Programmiersystem Codesys zu programmieren.
Mit einer an den Raspberry angeschlossenen Kamera kann aus Codesys heraus die Bildaufnahme aktiviert werden. Hierfür wurde der Funktionsbaustein fb_TakePicture entwickelt, der den Kameraserver des PI ansprechen kann, sodass dieser ein Bild aufnimmt und dieses als Bitmap-Datei in einer RAM-Disk abspeichert.
Der Vorteil dieser RAM-Disk ist, dass alle Bilder nur im Arbeitsspeicher gespeichert werden, was eine schnelle Bildaufnahme ermöglicht. Außerdem dürfen Flash-Speicher natürlich nicht beliebig oft neu beschrieben werden, weil sie bei zu vielen Schreibvorgängen schnell verschleißen.
Bildanalyse durch SPS-Programmierung
Das Einlesen des gespeicherten Bildes erfolgt mit dem Funktionsbaustein fb_ReadImage. Dieser analysiert zunächst Dateiformat sowie Breite und Höhe des Bildes und wandelt das aufgenommene Farbbild in ein Grauwertbild um. Im Funktionsbaustein fb_ExtractObjekt wird eine Binärisierung eines Bildausschnitts vorgenommen. Dadurch kann ein dunkles Objekt von einem hellen Hintergrund getrennt werden. Somit charakterisieren die schwarzen Pixel das Objekt, dessen Bildposition der Funktionsbaustein fb_ExtractObjekt ermittelt.
In dem hier vorgestellten Beispiel soll die Kamera eine schwarze Linie auf dem Boden erkennen, damit der Roboter dieser Linie folgen kann:
Da die Kamera schräg nach unten blickt, ist weitgehend nur der Boden im Bild zu sehen und die schwarze Linie stellt das einzige dunkle Objekt im Bild dar. Da die Bildverarbeitung den Mittelpunkt der Linie bestimmt, kann aus dem Abstand zur Bildmitte eine Korrektur der Bewegungsrichtung für das Fahrzeug ermittelt werden. Die verarbeiteten Bilder werden dann wieder auf der RAM-Disk abgelegt. Ein Webserver, der auf dem Raspberry-PI installiert ist, stellt diese auf einer Webseite zur Ansicht zur Verfügung. Zur Prozessvisualisierung werden die Bilder in einem Browser-Plugin in Codesys angezeigt, sodass Programmierer und Bediener das Ergebnis der Bildverarbeitung in der HMI (Human Machine Interface) direkt betrachten können.
Visuelle Führung eines mobilen Roboters
Die Bildanalyse ist nun zyklisch während der Fahrt des Roboters auszuführen. Während der Fahrt sind also Bildaufnahme und -speicherung, das Wiedereinlesen des Bildes, die Segmentierung und Positionsermittlung der Linie in Echtzeit durchzuführen, um die Drehzahlregelung der Räder an Richtungsänderungen der Linie anzupassen.
Liegt der durch die Bildanalyse bestimmte Mittelpunkt der Linie zum Beispiel links von der Bildmitte, muss das Fahrzeug nach links gelenkt werden. Hierzu wird die Sollgeschwindigkeit für das linke Rad um vlenk vergrößert und für das rechte Rad um den gleichen Betrag verkleinert. Der Betrag von vlenk ist proportional zum Abstand von der Bildmitte. Die Bildverarbeitung kann so etwa alle 50 Millisekunden ein Bild aufnehmen und verarbeiten.
Damit ist es möglich, das Fahrzeug mit einer Geschwindigkeit von etwa 20 Zentimeter pro Sekunde fahren zu lassen und die Linie zu verfolgen.
Cyber-Physical-System in der digitalen Fabrik
Die hier vorgestellte Anwendung ist nur ein Benchmarktest, um die Möglichkeiten und Grenzen SPS-integrierter Bildverarbeitung zu testen. Das vorgestellte System zeigt, dass Bildverarbeitung und Motion-Control-Funktionen in einem SPS-Programmiersystem erstellt und in einem dezentralen Mikroprozessor ablaufen können. Eine zeitaufwändige Einarbeitung in unterschiedliche Programmiersprachen und fehleranfällige Schnittstellen über TCP/IP entfallen.
Solche verteilten Systeme, die zentral und einheitlich ohne aufwändige Schnittstellen programmiert werden, werden als Cyber-Physical-Systems eine wichtige Rolle in der digitalen Fabrik der Zukunft spielen.