Hazar Ekin Uçan

Ausgewählte Projekte

FANUC Text-to-Trajectory Writing Robot

Ein Python-Programm, das aus eingegebenem Text ein FANUC-Bewegungsprogramm erzeugt, und der Industrieroboter, der den Text mit einem Stift auf Papier geschrieben hat.

Rolle
Eigenes Projekt
Kontext
Neksus Endüstriyel Otomasyon, İzmir
Zeitraum
Jun bis Jul 2026
Stack
Python · FANUC TP / LS · RoboGuide · SVG · CSV
RoboGuide zeigt die erzeugte Werkzeugbahn als vier Zeilen gelben Text vor dem Robotermodell in der simulierten Zelle.

Was es ist Ein Industrieroboter, der eingegebenen Text mit einem Stift schreibt. Das Bewegungsprogramm wird erzeugt, statt jeden Punkt einzeln einzulernen.

Was ich gebaut habe Eine einzige Python-Datei, ein Stiftgreifer mit einer Feder darin und die Kalibrierung, die beides zusammen zum Laufen gebracht hat.

Meine Rolle

Ich habe das Python-Programm geschrieben: die Strichschrift, die Anordnung und automatische Größenanpassung des Textes, die Berechnung der Punkte und die drei Exporter. Den Stifthalter habe ich selbst konstruiert und gebaut. Weil die erste Version keine gleichmäßige Linie zeichnete, habe ich ihn überarbeitet und eine Feder eingebaut. Ich habe die Zelle in RoboGuide aufgebaut, das Teach Pendant bedient, Werkzeug und Schreibebene kalibriert und am realen Roboter die Fehler im Ergebnis gesucht und behoben. Diese Aufgaben sind auch im Empfehlungsschreiben meines Betreuers festgehalten.

01

Einem Roboter das Schreiben beibringen, ohne jeden Punkt zu teachen

Ein kurzer Satz bedeutet Hunderte Roboterpositionen. Ich wollte sie nicht von Hand aufnehmen.

In den letzten zwei Wochen meines Praktikums stand in der Werkstatt ein FANUC 200iD/7L, der gerade für kein Kundenprojekt gebraucht wurde. Die Wochen davor hatte ich an Palettierzellen gearbeitet, wo der Roboter einen Sack von einer Stelle zur anderen bewegt. Ich wollte ein vollständiges System bauen, statt einzelne Befehle zu üben, also habe ich mich entschieden, den Roboter schreiben zu lassen.

Normalerweise fährt man den Roboter im Jog-Betrieb zu jedem Punkt und speichert die Position. Schon ein kurzer Satz braucht Hunderte Positionen. Sie von Hand einzulernen war deshalb nicht praktikabel. Ich wollte einen wiederholbaren Weg von dem Text, den ich tippe, zu einem Bewegungsprogramm, das die Steuerung ausführen kann.

Schreiben verzeiht außerdem weniger als Pick and Place. Die Stiftspitze muss über das ganze Blatt hinweg nahe an einer Ebene bleiben. Der Kontakt muss fest genug sein, um eine Linie zu hinterlassen, und leicht genug, um nichts zu verbiegen. Hunderte kleiner Bewegungen müssen in der richtigen Reihenfolge laufen. An jeder dieser Stellen zeigt sich ein Fehler im Koordinatensystem.

  • Papier Passt auf A4 quer bei 297 × 210 mm, sonst schrumpft der Text, bis er passt
  • Zeichen A-Z, a-z, 0-9, Satzzeichen und die türkischen Buchstaben ç ğ ı İ ö ş ü
  • Sicherheit Keine Koordinate außerhalb des konfigurierten Arbeitsbereichs erreicht je den Roboter
  • Arbeitsablauf Das erzeugte Programm muss sich über den üblichen FANUC-Workflow laden lassen
  • Orientierung Kartesisches CONFIG und W/P/R stammen aus einem am realen Roboter geprüften Punkt, nicht aus einer Vermutung
Zwei große FANUC-Palettierroboter in der Werkshalle, die Arme über Portal und Förderband erhoben.
Ein Ausschnitt der Werkstattumgebung während meines Praktikums. Der Roboter hier ist nicht der FANUC aus dem Schreibprojekt; der Aufbau stand in einem anderen Bereich.

02

Das Programm erzeugen, statt die Punkte zu teachen

Text geht hinein, ein Bewegungsprogramm kommt heraus, und eine SVG-Vorschau zeigt den Pfad, bevor der Roboter ihn fährt.

Der Generator ist eine einzige Python-Datei ohne Fremdbibliotheken. Das war Absicht: Er musste auf einem Werkstattlaptop laufen, ohne dass jemand etwas installiert.

Die Schrift ist der Teil, den niemand erwartet. Jedes Zeichen ist eine Liste von Polylinien in einer Einheitsbox. Es gibt keine Umrisse zum Füllen, denn der Stift zieht immer nur einen Strich. In dieser Box ist y = 0 die Versalhöhe, y = 1 die Grundlinie, und Unterlängen reichen bis 1.30. Eine Glyphe bildet direkt die Abschnitte ab, in denen der Stift aufliegt.

Die türkischen Zeichen werden zur Laufzeit zusammengesetzt. ç ist c plus Cedille, ğ ist g plus Breve, ü ist u plus Trema. Um eine Sprache hinzuzufügen, ergänze ich Akzentfunktionen, statt ein Alphabet neu zu zeichnen.

Diagramm: vom Text zum Bewegungsprogramm

  1. 01 Eingabe Text A-Z, a-z, 0-9, türkische Buchstaben, Satzzeichen
  2. 02 Schrift Polylinien je Strich Einheitsbox, y=0 Versalhöhe, y=1 Grundlinie
  3. 03 Layout Striche in Millimetern Textposition, Abstände, Zeilenumbrüche
  4. 04 Auto-Fit Größte Höhe, die passt Binärsuche, Abbruch unter 3 mm
  5. 05 Punkte Geordnete Roboterpunkte TRAVEL · PEN_DOWN · DRAW · PEN_UP
  6. 06 Prüfung Prüfung des Arbeitsbereichs bei Grenzverletzung Fehler statt Koordinatenkorrektur

Ausgaben

  • writing_preview.svg wird geprüft, bevor irgendetwas den Roboter erreicht
  • writing_points.csv Punktliste mit Bewegungsart und Geschwindigkeit
  • ISIM.LS /PROG /ATTR /APPL /MN /POS /END
Eine Python-Datei ohne Fremdbibliotheken erzeugt aus Text ein FANUC-Bewegungsprogramm. Die Koordinaten werden vor dem Export geprüft. Liegt eine außerhalb des Papierbereichs, bricht das Programm ab, bevor sie den Roboter erreicht. Pro Durchlauf entstehen drei Dateien. Die SVG-Vorschau dient dazu, die Bahn vor dem Einsatz zu prüfen.

Drei Entscheidungen waren in diesem Ablauf besonders wichtig.

Die erste ist die automatische Anpassung. Passt der Text nicht auf das Papier, sucht der Generator die größte Buchstabenhöhe, die passt, und skaliert Zeichen- und Wortabstände im selben Verhältnis, damit die Proportionen stimmen. Er verkleinert den Text nur. Bei einer nötigen Höhe unter 3 mm bricht er ab, weil der Stift so kleine Buchstaben nicht mehr ausreichend genau zeichnen kann.

fanuc_writer_ls.py · fit_text_to_paper()

low = minimum_height_mm
high = original_height

# Binary search for the largest height that fits.
for _ in range(50):
  middle = (low + high) / 2.0
  candidate = scaled_config(middle)
  if fits_paper(layout_text(candidate), candidate):
      low = middle
  else:
      high = middle

return scaled_config(low * 0.999)

Nach fünfzig Schritten der binären Suche wird eine Höhe knapp unter dem letzten passenden Wert gewählt.

Die zweite ist die Terminierungsart an jedem Punkt. Sie entscheidet darüber, ob die Linie sauber aussieht.

Diagramm: Zustandsautomat der Stiftbewegung

Z = 10 mm · sicher Z = 0 mm · Papier
  1. Fahrt Über den ersten Punkt des nächsten Strichs fahren 100 mm/sec · CNT10
  2. Stift ab Auf die Schreibebene absenken 20 mm/sec · FINE
  3. Zeichnen Die Eckpunkte des Strichs nacheinander anfahren 20 mm/sec · CNT10
  4. Stift hoch Vor dem nächsten Strich vom Papier abheben 100 mm/sec · FINE
Jeder Strich durchläuft dieselben vier Zustände. Die Punkte, an denen der Stift aufsetzt und abhebt, werden mit FINE-Terminierung ausgegeben, denn dort muss die Spitze die vorgegebene Position exakt erreichen. Die Eckpunkte dazwischen nutzen CNT10, damit die Steuerung die Ecken verschleift und die Linie sauber bleibt. Sichere Höhe, Schreibhöhe und beide Geschwindigkeiten sind die Voreinstellungen des Generators.

Die Punkte, an denen der Stift aufsetzt und abhebt, werden als FINE ausgegeben. An diesen beiden Punkten muss die Spitze die vorgegebene Position exakt erreichen. Jeder Eckpunkt dazwischen ist CNT10, damit die Steuerung die Ecken verschleift, statt an jeder einzelnen anzuhalten. Mit FINE überall stottert der Roboter durch jedes Zeichen. Mit CNT10 überall rundet der Stift den Anfang jedes Strichs ab.

fanuc_writer_ls.py · export_fanuc_ls()

for point in points:
  termination = (
      "FINE"
      if point.motion_type in {"PEN_DOWN", "PEN_UP"}
      else "CNT10"
  )
  motion_instructions.append(
      f"L P[{point.number}] {point.speed_mm_sec}mm/sec "
      f"{termination} ;"
  )
Ein Laptopbildschirm mit der RoboGuide-3D-Ansicht neben der Programmliste des Teach Pendant, in der Zeilen wie Stroke 18 vertex 3, P[111] 20mm/sec CNT10, Stroke 18 pen up und P[119] 100mm/sec FINE stehen.
Das erzeugte Programm auf dem Teach Pendant. Die Strichkommentare und der Wechsel zwischen CNT10 und FINE kommen direkt aus dem Exporter.

Die dritte Entscheidung betrifft den Umgang mit Fehlern. Jeder Punkt wird gegen die konfigurierten Grenzen geprüft, bevor überhaupt eine Datei geschrieben wird. Eine Koordinate außerhalb des Arbeitsbereichs löst einen Fehler aus, statt stillschweigend begrenzt zu werden. Ein Programm, das sich nicht erzeugen lässt, kostet eine Minute. Ein Programm, das einen Punkt stillschweigend an den Papierrand schiebt, kann dagegen das beschädigen, was der Roboter trifft.

fanuc_writer_ls.py · validate_xyz()

if not all(math.isfinite(value) for value in (x, y, z)):
  raise ValueError(f"Non-finite coordinate: {(x, y, z)}")
if not (config.min_x_mm <= x <= config.max_x_mm):
  raise ValueError(f"X out of bounds: {x:.3f} mm")

Aus demselben Grund sind der CONFIG-String und die Werkzeugorientierung Parameter mit einer Warnung im Docstring. Ich habe keine Werte fest in die Datei geschrieben. Sie müssen von einem geprüften Punkt an genau diesem Roboter kopiert werden, und ein Standardwert, der plausibel aussieht, wäre schlimmer als gar kein Standardwert.

03

Eine Feder im Greifer

Die Bahn stimmte, aber die Linie war trotzdem zu blass. Geholfen hat eine mechanische Änderung.

Das Koordinatensystem war der schwierige Teil der Software, und es hat länger gedauert als erwartet. Maßstab, Ursprung, Schreibebene und Strichreihenfolge müssen alle zusammenpassen, und wenn eines davon nicht stimmt, kommen die Zeichen verzerrt, gespiegelt oder in falscher Reihenfolge heraus. Sobald es stimmt, sieht man davon nichts mehr in der Ausgabe.

Dann habe ich es am Roboter laufen lassen. Der Pfad war richtig, und in RoboGuide war er es auch. Auf Papier war die Linie stellenweise blass und stellenweise gar nicht da.

Mein erster Impuls war, das Werkzeug weiter ins Papier zu drücken, die Schreibebene um einen Millimeter tiefer zu legen und es noch einmal zu versuchen. Das wäre der falsche Ansatz gewesen. Ein Roboter, der in eine starre Oberfläche kommandiert wird, fährt weiter, bis etwas nachgibt. Ich hätte riskiert, den Halter zu verbiegen und den Stift zu beschädigen, und jeder kleine Kalibrierfehler wäre gefährlicher geworden statt harmloser. Diese Fehler sind klein und unvermeidbar. Der Tool Center Point liegt um einen Bruchteil daneben, das Papier ist nicht perfekt eben, der Tisch nicht perfekt waagerecht. Ein TCP-Fehler betrifft jedes Zeichen auf der Seite.

Also habe ich den Greifer geändert und eine Feder hineingesetzt.

Diagramm: mechanische Nachgiebigkeit

Starrer Halter

Nur in einem schmalen Bereich der Höhenabweichung entsteht eine saubere Linie. Außerhalb setzt die Linie aus oder der Stift drückt zu stark auf.

Gefederter Halter

Die Feder fängt dieselbe Schwankung ab, das brauchbare Band wird also breit genug, dass der Kalibrierfehler nicht mehr entscheidend ist.

Bei einem starren Halter hängt die Kontaktkraft davon ab, wie weit die Spitze in die Oberfläche hineingefahren wird. Bei zu wenig Zustellung verschwindet die Linie, bei zu viel steigt die Belastung schnell. Eine Feder im Halter gleicht dieselben Höhenabweichungen aus und begrenzt dadurch die Änderung der Kontaktkraft. Kleine Kalibrierfehler und Unebenheiten fallen dann weniger ins Gewicht. Die Kurven zeigen den Mechanismus. Es wurde keine Kraft gemessen.

Mehr brauchte es nicht. Der Stift kann sich im Halter bewegen. Die Kontaktkraft wird deshalb hauptsächlich von der Feder bestimmt und hängt weniger davon ab, wie genau die Papierposition kalibriert ist. Kleine Höhenabweichungen führten vorher zu fehlenden Linien oder zu hoher Belastung. Jetzt gleicht die Feder sie aus.

Diese einfache Änderung ist mir in Erinnerung geblieben. Ich hatte versucht, das Kontaktproblem in der Software zu lösen. Die bessere Lösung lag aber in der Mechanik.

04

Er hat geschrieben

Derselbe Satz, einmal als SVG-Vorschau des Generators und einmal in Tinte.

Der Generator funktioniert. Für den Text Hazar Ekin Uçan erzeugt er 19 Striche und 127 Roboterpunkte und verkleinert die angeforderte Buchstabenhöhe von 30 mm auf 23.31 mm, damit die Zeile auf die Seite passt. Diese Werte habe ich beim Ausführen des Programms ermittelt.

Die SVG-Vorschau des Generators: vier Zeilen einstrichiger Text mit Hazar Ekin Uçan, Constructor University, Robotics and Intellegent Systems, Precision in Automation.
Geplant. Die SVG-Vorschau, die der Generator neben dem Bewegungsprogramm schreibt. Das ist es, was ich prüfe, bevor der Roboter läuft.
Dieselben vier Zeilen, vom Roboter mit Stift auf Papier geschrieben, die Striche sichtbar aus geraden Segmenten gebildet.
Das Ergebnis auf Papier. Den Schreibfehler hatte ich schon bei der Texteingabe gemacht. Das Programm und der Roboter haben ihn unverändert übernommen.

Das Video unten zeigt den Roboter beim Schreiben. Ich zeige es ohne Ton, weil auf der Originalaufnahme nur Werkstattlärm zu hören ist.

Der FANUC 200iD/7L zeichnet die zweite Zeile, Stift im Kontakt, Papier auf den Tisch geklebt. Am Ende des Praktikums mit dem Handy gefilmt. Kein Ton.

In diesem Projekt habe ich fast alles angewendet, was ich in den Wochen davor gelernt hatte. Bedienung des Teach Pendant, Tool- und User-Frames, Register und Positionsregister, digitale E/A, Bewegungsarten und Geschwindigkeiten, Mastering, Kalibrierung und Alarmbehebung kamen alle zum Einsatz. Am Ende stand ein System, bei dem ich am Ergebnis sofort sehen konnte, ob es funktioniert.

Wo die Grenzen liegen

Ich habe nichts gemessen. Es gibt keine Angabe zur Wiederholgenauigkeit, keine Messung der Schwankungen in der Strichbreite und keine erfasste Zykluszeit. Ich habe geprüft, ob der Text lesbar war. Das war er. Die Feder habe ich durch Ausprobieren ausgewählt, nicht durch Rechnung. Würde ich das noch einmal bauen, käme eine Messuhr auf die Platte und ich würde die Nachgiebigkeit sauber charakterisieren. Außerdem würde ich die vorgegebene und die tatsächlich erreichte Z-Position aufzeichnen. Dann ließe sich der Kalibrierfehler beziffern, statt ihn nur nach Gefühl einzuschätzen.

Belege auf dieser Seite: Demo-Video · Quellcode · Erzeugte Ausgabe

Offen für Gespräche über Robotik, Automatisierung und Software für physische Systeme.