FANUC Text-to-Trajectory Writing Robot
Girilen metni FANUC hareket programına dönüştüren Python programım ve bu metni gerçek bir kalemle kâğıda yazan endüstriyel robot.
Nedir Noktaları tek tek öğretmek yerine oluşturduğum hareket programını kullanarak metni kalemle yazan bir endüstriyel robot.
Ne yaptım Tek dosyalık bir Python programı, yaylı kalem tutucu ve bunların birlikte çalışmasını sağlayan kalibrasyon.
Benim rolüm
Metni robot hareketine dönüştüren Python programını ben yazdım. Çizgi fontunu, metin yerleşimini, otomatik ölçeklemeyi, robot noktalarını oluşturan kısmı ve üç çıktı biçimini hazırladım. Kalem tutucuyu tasarlayıp yaptım; ilk hali düzgün çizgi çizemeyince yay ekleyerek yeniden tasarladım. Hücreyi RoboGuide’da kurdum, teach pendant’ı kullandım, takım ucunu ve yazma düzlemini kalibre ettim. Gerçek robotta karşılaştığım sorunları da ben giderdim. Staj sorumlumun referans mektubunda da bu çalışmalar yer alıyor.
01
Her noktayı öğretmeden robota yazı yazdırmak
Kısa bir cümle yüzlerce robot pozisyonu demek. Bunları elle kaydetmek istemedim.
Stajımın son iki haftasında atölyede herhangi bir müşteri projesine ayrılmamış bir FANUC 200iD/7L vardı. Önceki haftalarda, robotun çuvalları bir yerden alıp başka bir yere taşıdığı paletleme hücrelerinde çalışmıştım. Tek tek komutları denemek yerine baştan sona çalışan bir sistem kurmak istiyordum. Bunun için robota yazı yazdırmaya karar verdim.
Normalde robotu jog modunda her noktaya götürüp pozisyonu kaydetmek gerekiyor. Kısa bir cümle bile yüzlerce pozisyon gerektirdiğinden bunu elle yapmak pratik değildi. İstediğim, yazdığım metni her seferinde aynı yöntemle kontrolcünün çalıştırabileceği bir hareket programına dönüştürmekti.
Yazı yazmak, alıp bırakma işlerine göre hataya daha az tolerans gösteriyor. Kalem ucu, kâğıdın her yerinde yazma düzlemine yakın kalmalı. Kâğıda çizgi bırakacak kadar basmalı ama hiçbir parçayı eğmemeli. Yüzlerce küçük hareket de doğru sırayla gerçekleşmeli. Koordinat sistemindeki bir hata bunların her birini etkileyebiliyor.
- Kâğıt 297 × 210 mm yatay A4 kâğıda sığıyor, sığmazsa metin sığana kadar küçülüyor
- Karakterler A-Z, a-z, 0-9, noktalama ve Türkçe harfler ç ğ ı İ ö ş ü
- Güvenlik Tanımlı çalışma alanının dışındaki hiçbir koordinat robota ulaşmıyor
- İş akışı Oluşturulan program, standart FANUC program yükleme sürecine uygun olmalı
- Oryantasyon Kartezyen CONFIG ve W/P/R değerleri tahminden değil, gerçek robotta doğrulanmış bir noktadan geliyor
02
Noktaları tek tek öğretmek yerine programı oluşturmak
Girilen metinden bir hareket programı oluşturuluyor. Robotu çalıştırmadan önce izleyeceği yol SVG önizlemede kontrol edilebiliyor.
Programı harici kütüphane kullanmadan, tek bir Python dosyası olarak yazdım. Bu bilinçli bir tercihti: atölyedeki dizüstü bilgisayarda ek kurulum gerektirmeden çalışması gerekiyordu.
İşin pek beklenmeyen kısmı yazı tipi. Her karakteri, birim kutu içinde
birbirine bağlı çizgi parçalarıyla tanımladım. Kalem bir seferde tek çizgi
çizdiği için harflerin içini doldurmak gerekmiyor. Bu kutuda y = 0 büyük
harflerin üst sınırı, y = 1 taban çizgisi. Aşağı uzanan harf parçaları
1.30 değerine kadar iniyor. Böylece her karakter doğrudan kalem kâğıttayken
izlenecek çizgilere dönüşüyor.
Türkçe karakterler program çalışırken oluşturuluyor. ç için c harfine
çengel, ğ için g harfine yay biçimli işaret, ü için u harfine iki nokta
ekleniyor. Yeni bir dil eklerken alfabeyi baştan çizmek yerine bu işaretleri
çizen fonksiyonlar ekliyorum.
Diyagram: metinden hareket programına
- 01 Girdi Metin A-Z, a-z, 0-9, Türkçe harfler, noktalama
- 02 Font Çizgilerle tanımlı harfler birim kutu, y=0 harf üst sınırı, y=1 taban çizgisi
- 03 Yerleşim Milimetre cinsinden çizgiler imleç ilerlemesi, boşluklar, satır sonları
- 04 Otomatik sığdırma Sığan en büyük harf boyu ikili arama, 3 mm altında reddediyor
- 05 Noktalar Sıralı robot noktaları TRAVEL · PEN_DOWN · DRAW · PEN_UP
- 06 Kontrol Çalışma alanı doğrulaması sınır aşımında hata, koordinatı sınıra çekme yok
Çıktılar
- writing_preview.svg robota bir şey ulaşmadan önce kontrol ediliyor
- writing_points.csv hareket tipi ve hızıyla birlikte nokta listesi
- ISIM.LS /PROG /ATTR /APPL /MN /POS /END
Bu akıştaki üç karar diğerlerinden daha önemliydi.
İlki, metni kâğıda otomatik sığdırmak. Metin taşarsa program, kâğıda sığan en büyük harf yüksekliğini buluyor. Harf ve kelime aralıklarını da aynı oranda küçülterek yazının oranlarını koruyor. Metni asla büyütmüyor. Harf yüksekliğinin 3 mm altına düşmesi gerekiyorsa işlem duruyor, çünkü kalem o kadar küçük harfleri yeterince ayrıntılı çizemiyor.
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) Elli adımlık ikili aramanın ardından, kâğıda sığan son yüksekliğin biraz altındaki değer seçiliyor.
İkinci karar, her noktada hangi sonlandırma tipinin kullanılacağıydı. Çizginin düzgün çıkması buna bağlı.
Diyagram: kalem hareketi durum makinesi
- Geçiş Sonraki çizginin ilk noktasının üzerine git 100 mm/sec · CNT10
- Kalem iniyor Yazma düzlemine in 20 mm/sec · FINE
- Çiz Çizginin köşelerinden sırayla geç 20 mm/sec · CNT10
- Kalem kalkıyor Sonraki çizgiden önce yukarı kalk 100 mm/sec · FINE
Kalemin indiği ve kalktığı noktalarda FINE kullanılıyor. Kalem ucunun
tanımlanan konuma tam olarak ulaşması gereken yerler bunlar. Aradaki köşe
noktalarında ise CNT10 var; kontrolcü her köşede durmak yerine geçişleri
yumuşatıyor. Her noktada FINE kullanıldığında robot harfleri duraklayarak
çiziyor. Her noktada CNT10 kullanıldığında ise çizgilerin başlangıcı
yuvarlanıyor.
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} ;"
)
Üçüncü karar, hata durumunda ne yapılacağıydı. Dosyalar oluşturulmadan önce her noktanın tanımlı sınırlar içinde olup olmadığı kontrol ediliyor. Dışarıda kalan bir koordinat sessizce sınıra çekilmiyor; program hata veriyor. Program oluşturulamaması bir dakika kaybettirir. Noktayı haber vermeden kâğıdın kenarına taşımasıysa robotun çarptığı şeye zarar verebilir.
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") Aynı nedenle CONFIG ve takım yönelimini parametre olarak bıraktım, kodun açıklamasına da uyarı ekledim. Sabit değerler kullanmadım. Bu değerler, kullanılacak robotta doğrulanmış bir noktadan alınmalı. Doğru gibi görünen bir varsayılan değer vermek, hiç vermemekten daha riskli olurdu.
03
Tutucudaki yay
Hareket yolu doğruydu ama çizgi yine de soluk çıkıyordu. Sorunu mekanik bir değişiklikle çözdüm.
Yazılımda en çok koordinat sistemiyle uğraştım; beklediğimden uzun sürdü. Ölçek, orijin, yazma düzlemi ve çizgilerin sırası birbiriyle tutarlı olmalı. Biri bile yanlışsa harfler yamuluyor, ters dönüyor veya yanlış sırayla çiziliyor. Her şey doğru çalıştığında ise bu sorunların hiçbiri sonuçtan anlaşılmıyor.
Sonra robotta çalıştırdım. Yol doğruydu, RoboGuide’da da doğruydu. Kâğıtta ise çizgi yer yer soluktu, yer yer hiç yoktu.
İlk aklıma gelen, kalemi biraz daha bastırmak için yazma düzlemini bir milimetre aşağı alıp tekrar denemekti. Ama bu yanlış bir yaklaşım. Rijit bir yüzeye bastırması söylenen bir robot, bir yer esneyene ya da kırılana kadar ilerlemeye devam eder. Tutucunun eğilmesi ve kalemin zarar görmesi riskini almış olurdum; her küçük kalibrasyon hatası azalmak yerine daha tehlikeli hale gelirdi. Bu hatalar küçük ve kaçınılmaz. Tool center point bir miktar kaymış oluyor, kâğıt tam düz değil, masa tam terazide değil. Tek bir TCP hatası sayfadaki her karakteri etkiliyor.
Ben de tutucuyu değiştirdim ve içine bir yay koydum.
Diyagram: mekanik esneklik
Rijit tutucu
Kullanılabilir bir çizgi yalnızca dar bir yükseklik hatası bandında çıkıyor. Bu aralığın dışında kalem ya çizgiyi kesiyor ya da fazla bastırıyor.
Yaylı tutucu
Yay, yükseklik farklarını karşılayarak düzgün çizgi çizilebilen aralığı genişletiyor. Küçük kalibrasyon hataları artık belirleyici olmuyor.
Çözüm buydu. Kalem artık tutucunun içinde hareket edebiliyor. Bu sayede temas kuvvetini büyük ölçüde yay belirliyor; kuvvet, kâğıdın konumunu robota ne kadar hassas tanıttığıma eskisi kadar bağlı değil. Önceden çizginin kaybolmasına veya aşırı basınca yol açan küçük yükseklik farklarını artık yay karşılıyor.
Bu basit değişiklik bana önemli bir şey öğretti. Temas sorununu yazılımla çözmeye çalışıyordum ama daha iyi çözüm mekanikteydi.
04
Yazdı
Aynı metnin programdaki SVG önizlemesi ve robotun kâğıda yazdığı hali.
Program çalışıyor. Hazar Ekin Uçan metni için 19 çizgi ve 127 robot noktası
oluşturuyor. Yazının sayfaya sığması için istenen 30 mm harf yüksekliğini
23.31 mm değerine düşürüyor. Bu sayıları programı çalıştırarak elde ettim.
Aşağıdaki videoda robot yazarken görünüyor. Videoyu sessiz paylaşıyorum; orijinal kayıtta yalnızca atölye gürültüsü var ve anlatıma bir katkısı yok.
FANUC 200iD/7L ikinci satırı çizerken; kalem temasta, kâğıt masaya bantlanmış. Stajın sonunda telefonla çekildi. Ses yok.
Önceki haftalarda öğrendiğim neredeyse her şeyi bu projede kullandım. Teach pendant, tool ve user frame tanımları, register ve pozisyon register’ları, dijital I/O, hareket tipleri ve hızlar, mastering, kalibrasyon ve alarm giderme bu işin parçaları oldu. Sonunda, çalışıp çalışmadığını doğrudan görebildiğim bir sistem ortaya çıktı.
Sınırlar ve kısıtlar
Herhangi bir performans ölçümü yapmadım. Tekrarlanabilirlik, çizgi kalınlığının ne kadar değiştiği veya çevrim süresi için ölçüm verim yok. Metnin okunaklı çıkıp çıkmadığına baktım ve okunaklıydı. Yayı hesap yaparak değil, farklı yayları deneyerek seçtim. Tekrar yapsam plakaya bir komparatör yerleştirip mekanik esnekliği ölçerdim. Komut verilen Z ile gerçekte ulaşılan Z değerini de kaydederdim. Böylece kalibrasyon hatasını gözle değerlendirmek yerine sayıyla ifade edebilirdim.
Projeyi destekleyen materyaller: Demo videosu · Kaynak kodu · Üretilen çıktı