Mustafa Sarı

Mustafa Sarı hakkında

(Samsun, 26.03.1973, ,İTÜ, Elektronik ve Haberleşme Mühendisliği, Yazılım)

Döndürme İşlemi

Resim ve Region döndürmek, görüntü işleme uygulamalarında çok sık karşılaşılan bir durumdur. Aşağıdaki kod, en yalın döndürme örneğidir. (HALCON da farklı alternatifler de mevcut olmakla birlikte)

Aşağıdaki kalem resmini ve onu çevreleyen ROI yi, yatay düzleme paralel olacak şekilde döndürelim.

read_image (Image, ‘2.bmp’)
dev_set_line_width(2)
dev_set_draw(‘margin’)
threshold (Image, Regions, 0, 218)
fill_up (Regions, RegionFillUp)
shape_trans (RegionFillUp, RegionTrans, ‘rectangle2’)
dilation_circle(RegionTrans, RegionDilation, 20)
Kodun buraya kadar olan kısmı, kalemi seçip, etrafına ovalleştirilmiş dörtgen şeklinde bir ROI çizmeye yarar…
area_center(RegionFillUp, Area, Row, Column)
orientation_region (RegionFillUp, Phi)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_rotate (HomMat2DIdentity, -Phi, Column, Row, Yatay)
dev_clear_window()
affine_trans_image (Image, YatayKalem, Yatay, ‘constant’, ‘false’)
affine_trans_region (RegionDilation, RegionAffineTrans, Yatay, ‘false’)
Kodun devamının da çalıştırıldığında, kalemin ve etrafındaki ROI nin birlikte döndürülmüş hali.

iROB Otomasyon ile Ölçüm ve Kalite Kontrol

Bursa’da Robot entegratörü olarak çalışan iROB firması ile birlikte, Robot destekli %100 ölçüm esasına dayalı hassas ölçüm uygulamamız için ilk çalışma yapıldı.

Sistemin Çalışması

iROB tarafından kullanılan DENSO robot, hat üzerindeki soketleri alıp kameraya gösterecek, kamera bu esnada gerekli ölçümleri yapıp parçanın uygun olup olmayacağını belirleyecek.

Sistemin Zorlukları

  • Sağ ve sol olmak üzere ayna izometrisine sahip farklı soketler, kameraya farklı açılardan gösterilmek zorunda
  • Robot kolu bir defada 2 soket yakalamakta ve soketlerin alt ve üst tarafta olmasından dolayı her birinin pozisyonu görece farklı olabilmekte
  • Soketlerin üzerindeki pinler ve içindeki iletkenlerin tek bir kamerayla görünemeyeceği için 2 kamera kullanılması gerekliliği ve her 2 kamera için ön ve zemin aydınlatmasının robot hareketini engellememesi

Yapılan ön çalışmada, burada bahsedilen zorluklar aşılmış, hassas ölçüm için telecentrik lens ve 1.3 MP kamera kullanılmıştır. Alınan resimler incelendiğinde istenen hassasiyet değerlerine ulaşıldığı görülmüştür.

Sağlam Yaprak Seçimi (Kameralı Yaprak Kontrolü)

Yaprakların sağlam ya da hatalı olup olmadığının ayıklanmasında istenenler

  • Yırtıklık kontrolü
  • Delik kontrolü
  • Kırıklık Kontrolü
  • Yabancı maddelerin ayrıştırılması
  • Renk kontrolü

gibi kontrollerdir.

bu kontrollerin gerçekleştirilmesinde, her birinde farklı yaklaşım söz konusu olabilir.  İyi bir görüntü işleme algoritması ile bu kontroller yapılabilir. Kullandığımız yöntemlerden biri, yaprağın sol tarafı ile sağ tarafı arasındaki simetrinin aranmasıydı.

Yaprağın sol ve sağ tarafının bulunması :

Basit Yöntem

  1. Yaprak seçilir (thresholding)
  2. Dönme açısı belirlenir (orientation_region)
  3. yatayla sıfır derece yapacak şekilde döndürülür (rotate_image)
  4. En küçük dörtgenle sınırlandırılır (smallest_rectangle1)
  5. Dörtgen yatay olarak tam ortadan ikiye bölünür.

Elde edilen 2 region dan, üstte olan yaprağın sol kısmı, allta olan sağ kısmını verir.

Bu yöntemin dezavantajı, yaprağın sol ve sağ tarafı tam simetrik değilse (genelde de olmaz) tam ortadan bölünmüş dörtgen, yaprağı tam ortadan ikiye bölmüş olmaz.

Gelişmiş Yöntem :

  1. Yaprak Seçilir (thresholding)
  2. skeleton komutu ile yaprağın ortadan geçen çizgisi yakalanır
  3. junctions_skeleton komutu ile yaprağın başlangıç ve bitiş noktasının koordinatları çıkartılır
  4. gen_region_points komutu ile, skeleton da çıkan noktaların üst tarafı yaprağın sol tarafını, alt tarafı ise sağ tarafını verecek şekilde 2 region elde edilir.

Sonuçta, burada işi yapan asıl fonksiyon skeleton dur. skeleton fonksiyonunun yaprak resmine uyarlanmış hali, neredeyse yaprağın ortasından geçen damar ile aynı yolu izlemektedir.

Projenin tamamında, kameralı yaprak ayrıştırması (kameralı yaprak kontrolü) ile hızlı bir şekilde yaprakların sağlam olup olmadığı algılanabilmektedir.

Ölçüm (Measure)

Mavis olarak, son zamanlarda her zamankinden daha fazla ölçüm sistemi talebiyle karşılaşmaktayız. Üretici firmalar, daralan kar marjını sıfıra yakın hata oranlarıyla sübvanse edebileceklerinden, eskiye göre daha çok kalite kontrol ve ölçüm uygulamalarına yer vermeyi düşünüyor olmalılar. Hızlı ve hassas ölçüm dendiğinde, kameralı ölçüm sistemleri en cazip alternatif olarak görünmektedir. Mavis olarak, %100 ölçüm ve kontrol esasına dayalı görüntü işleme uygulamaları geliştirdiğimizden, var olan çözümlerimizi megapixel telecentric lens ve yüksek çözünürlükte  kamera kullanarak hassas ölçüm yapabilecek şekle getirdik. Yine kendi geliştirdiğimiz USB IO modülü ile PLC ya da konveyör gibi dış ortamlarla haberleşmek te hızlı ve basit bir hale indirgendi. En önemlisi, ölçüm gibi nokta altı hassasiyet (subpixel precision) gerektiren durumlarda, HALCON un gücünü kullanan çözümlerimiz, müşteri tarafından beklenen tolerans değerlerine uyabilmemizi sağladı.

Dağınık Kalsın

Ölçüm yapmadan önce, ölçülecek parçanın açısal olarak dönmüş vaziyette olması, görüntü işleme ile ilgilenenlerin genelde pek hoşuna gitmeyen bir durumdur. Açısal olarak dönmüş bir parça üzerinden ölçüm  yapılacak ise 2 farklı çözüm sözkonusu olabilir. Parçayı x yada y eksenine göre dik/yatay olacak şekilde  (0 ya da 90 derece) döndürmek (ki bu durumda resim kalitesinden (en azından teorik olarak) feragat etmek gerekiyor) ya da parçanın halihazırdaki konumu üzerinden ölçüm yapmak.

HALCON ile her iki durumda da ölçüm yaptığımda aynı sonucu elde ettim. Zaten HALCON ölçüm için gen_measure_rectangle2 kullanıyordu ki, dönmüş prçanın dönüş açısını belirleyip (orientation_region) rectangle2 bu açıya göre verilirse, sistem zaten direk açısal dönmüş ölçümü yapacaktı. Dolayısıyla, dönmüş parçalar için hom_mat2d_rotate, affine_trans_image vb. komutlarla uzun uzadıya uğraşmaya gerek kalmamış olur. Ben yine de uğraştım. Denedim. Aynı sonucu verdiğini gördüm. (Beklenmeyen bir durum da değil ama yinede deneyip görmek daha ikna edici oluyor… Tıpkı şimdi measure_pairs ve gen_rectangle2_contour_xld kullanmak arasında fark olmayacağını göreceğim gibi…)

ini File dan Kamera Ayarları

VYP Programında, Kamera ayarlarının (pozlama sürese, çalışma frekansı, fps oranı vb…) programa bildirildiği arabirime ini File dan yükleme özelliği eklendi.

Önceki versiyonlarda, Klasör ya da Kamera şeklinde olabilen seçeneklere son olarak ini File seçeneği eklendi. Sahadaki çalışmalarda, görüntü alma işlemleri genellikle uEye kamera programlarından olan uEye Demo ile gerçekleştirilmekte, daha sonra oradaki değerler VYP programına bildirilmekteydi. Şimdi 2 işi tek bir defada yapabilmek için, uEye kamera ayarlarını direk olarak yükleme seçeneği eklendi.  Bunun en büyük avantajı IR Filter, Red Gamma Gain, Hotpixel Correction vb. tüm değişkenleri VYP içinden de ayrıca set etme zorunluluğunu ortadan kaldırması oldu. (Aksi halde Kamera üreticisinin sağladığı tüm fonksiyon seti için ayrı bir arayüz yapmak gerekecekti. Bu da neredeyse imkansız bir iş)

Son olarak, ini file yüklendikten sonra, kullanıcı isterse VYP üzerinden ayarları dilediğince değiştirebilecek. Örneğin ini file olarak yüklenen dosyada pozlama değeri 23.07 ise, kullanıcı bunu 24.01 gibi bir değere çektiğinde, tüm diğer ayarlamalar ini file dan gelmek kaydıyla, sadece pozlama değeri yeni değerine göre set edilmiş olacak.

Sonuçta uEye Demo ile alınan görüntünün birebir aynısı VYP içinden de alınmış oluyor.

ini File üzerine

ini file, en eski windows versiyonlarından beri oldukça yaygın olarak kullanılmaktaydı. Birçok program geliştirme ortamı (VB, Delphi, VS…) ini file işlemleri için API sunuyorlardı. Zamanla ini file yerini önce registry kaydına, daha sonra  özellikle .NET yaygınlaşmasıyla birlikte xml dosyalarına bırakmıştır. (Dolayısıyla VS gibi .NET tabanlı güncel IDE ler  daha az api desteği sunmaktadır)  Buna rağmen ini File, gerek eskiyle uyum, gerek basit oluşu yüzünden hala güncelliğini ve yaygınlığını korumaktadır.

OCR ve VIN (Şase No) Okuma

Aracın gövdesi üzerine yazılı VIN numarasını, 2 mt. kadar yüksekten okuyup OCR etme işi, gerçektende zorlu bir çalışmadır. (Mavis olarak nadiren telaffuz ettiğimiz bir kelime olmakla birlikte) Ford’da ki proje, sadece VIN (şase numarası) okunması işlemi değil, yazım kalitesinin (ve tabi doğruluğunun) da tesbit edilmesi işlemi idi.

75 mm. lens, 1.3 MP ethernet kamera, elektronik balast ve fluoresan aydınlatma ile kurduğumuz setup sonrası aldığımız ilk fotoğraflar, düşündüğümüz kadar zorlanmayacağımız sonucunu çıkardı. Gerçektende HALCON default OCR fonksiyonları ile bile, %90-95 lik bir başarı yüzdesi yakalanmıştı. Kendi öğreteceğimiz karakter setleri ile, bu oran %100 e çıkarılabilirdi.

Bugün,  pratik – güçlü – akıllı bir OCR arayüzünü VYP içine entegre etmeyi düşünüyorum. Son zamanlarda OCR ile ilgili çok talep olduğundan tüm projelere uyarlanabilir olması gerekiyor.

Ford da PVS sisteminden gelen verilerin algılanması sağlandı. USB Seial converter şeklinde çalışan cihaz bazı sorunlar çıkarttı. İlginç olarak PCI slot üzerinden Serial connector olarak çalışan cihaz gayet düzgün çalıştı. (Kurulum seri portu olan bir PC de olduğu için böyle bir sorun yaşanmayacaktı)

Görünüşe göre, OCR işleminde de pek bir sorun çıkmayacak. Sonuçta başlangıçta hayli zor görünen, yürüyen hat üzerinden Şase no okuma işlemi düşündüğümüz kadar uğraştırmayacak.

Ya da biz artık OCR konusunda çok fazla yol katettik ve görüntü işleme ile ilgilenen birçok firmanın teklif bile vermek istemediği konular, bizim için neredeyse hazır çözüm durumunda.

Eski Projelere Destek (6 Kameralı Fren Kontrol Sistemi)

Bugün, 4 yıldan daha uzun bir süre önce kurmuş olduğumuz bir projeye güncelleme yapmak gerekti. En başta projede değişiklikler yapabilmek (yazılımı re-compile edebilmek) için HALCON 7.1 i yeniden kurmak gerekti. Bunun için (ne olur ne olmaz) HALCON 8.1 ve HALCON 9.0 sürümlerini bilgisayarımdan kaldırdım. Kurulum yapıldıktan sonra, istenen değişikliklere göre modifiye edilmiş versiyonu derleyip çalıştırdım. Neyseki herşey yolunda gitti.  Projede Native .NET kütüphaneleri yerine COM+ teknolojisi kullanılmıştı. Aslında değişen çok bir şey olmuyor. Nihayetinde aynı HALCON DLL leri çağırılıyor. Yine de en azından kodlama kalitesi olarak Native .NET yazılımı çok daha güçlü. Hiç değilse, değişken tanımlarını yapabiliyorsunuz. COM+ kulanımının gerektirdiği object kullanımı başta kullanışlı gelse de, VB programcısı değiliz ya, bir C# programcısı her değişkeni kendi tipinde tanımlamak ister. Değişken tanımlamada kişisel olarak takıntılı olduğumu kabul ediyorum. Name Condition olarak Pascal Case kullanımından, Camel Case kullanımına geçmek bile benim için zordu. Bir de bunlara sürekli boxing (type cast) işleçlerini eklemek hepten eziyet.

Neyseki tüm bunlar COM ile birlikte geçmişte kaldı da nadiren eski projelere destek vermek dışında günlük hayatta pek karşımıza çıkmıyorlar.

Bugünkü proje için Sabah 7:30 gibi yola çıktım. Bursa’ya gittim. Çalışma 3 saat sürdü. Renault Yeni Megane ve Fluence modelleri için fren kapağı tasarımları ve kontrolleri programa bildirildi. Programın exe si (uygulaması) yanı sıra UserControl modülü için DLL güncellemesi yapıldı. (MyViewControl isimli DLL i de güncellemek gerektiğini bulmam pek kolay olmadı) Mevcut kontrollere ilaveten Aktif ROI de, Intensity kontrolü de ekledim. Böylece farklı kapağın hattan kazara geçme şansı iyice sıfıra yaklaştı.

Birkaç saatliğine de olsa, HALCON 7.1 ile çalışmak zorunda kaldığımda, MVTec firmasının özellikle 7.1 – 8.0 geçişinde HDevelop tasarımında devasa yol katettiğini yeniden farkettim. Aynı geliştirme sürecini 8.0 dan 9.0 a geçişte söylemek pek mümkün değil. Bu durum artık görsel olgunluğa erişildiği şeklinde yorumlanabilir belki. Yine de bir sonraki versiyonu merakla bekliyorum.

Kameralı Robot Yönlendirme

Teknodrom firması ile birlikte geliştirilen bu projede amaç; konveyör üzerinde rastgele pozisyonda gelen parçaların, robot tarafından alınıp belirlenen bir yere yüklenmesini sağlamaktı. Daha önceden Teknodrom’da Emrah Hünerlitürkoğlu ile birlikte bilgisayar – robot arası seri protokol üzerinden haberleşme arabirimi geliştirmiştik. Elimizde hazır olduğu için aynı protokolü kullanarak bu projeye devam ettik. (İlerleyen aşamalarda, ethernet üzerinden haberleşmeye geçecektik.)

Teknodrom Motoman Mavis Robot Yönlendirme

Projeye başlamadan önce, Teknodrom parçaları yakalamak için özel olarak Gripper geliştirdi. Projenin ilk gününde, Mavis tarafından Emre, Teknodrom tarafında Emrahla birlikte sistemin çalışacağı ortamı oluşturup, ilk fotoğrafları aldı. Gelen fotoğrafları inceleyip daha iyi bir sonuç almak için kamerayı ve lensi değiştirdik. Nihai setup (kurulum) sağlandıktan sonra, gerçek  sistem üzerinde çalışılmaya başlandı.

2. gün ben  yazılım üzerinde ben çalışmaya devam ederken, Emrah gripper ile manual olarak nesneleri yakalamaya çalıştı. Sonuçta yazılım gerekli koordinatları bulacak, gripper ise sorunsuz çalışacak hale getirildi. Artık yapılması gereken bilgisayar ile robotu konuşturmaktan ibaretti. Bu konuda en çok vakit harcadığımız nokta, yakalanacak nesnelerin farklı farklı olmasından dolayı her birinin tutma noktasının kendine özgü koordinatlar içeriyor olmasıydı. Boru şeklindeki parçayı farklı, dirsek şeklindeki parçayı farklı pozisyonlardan yakalamak gerekiyordu. Sonuçta her parça için sanal yakalama noktası belirleyip yazılımın bu sanal noktaya göre koordinatları robota iletmesiyle sorun çözüldü. (Müjdat Bey’in soruna el atmasıyla 🙂 )

Projenin 3. günü gece yarısı, tüm sistem sorunsuz ve seri olarak çalıştı. Böyle bir proje için 3 gün rekor derecede kısa bir süre sayılabilir. Daha önceden Mavis ve Teknodrom firmalarının  birlikte çalışmış olmasının getirdiği avantajları kullandık. Elimizde hazır çözümlerimiz vardı. Yine de en önemli faktör, Mavis ve Teknodrom firmalarının kendi alanlarındaki profesyonelliklerinde yatıyordu. Kamera Kontrollü Robot Otomasyonu, böylece hayat bulmuş oldu. Yorgun geçen 3 günün sonunda sistemin daha da efektif çalışması için bazı iyileştirmelere karar verildi. Robotun daha hızlı çalışmasını sağlamak için, robot hareketini sürdürürken bilgisayarla konuşabilmesi (paralel processing) yapılacaktı. Bu değişiklikler PC tarafında da benzer bazı değişiklikleri gerektiriyordu. Robotla hem seri port üzerinden hem de digital Input / output (24V) modül üzerinden haberleşiliyordu. Bu durum, Hem robotun, hem PC nin senkronize olmasını gerektiriyordu ki,  tamamıyla hareketli bir sistem üzerinde bu senkronizasyonu sorunsuz sağlamak pek kolay olmadı.

Tüm sistem, saat 10:30 gibi müşteriye demo kurulum olarak gösterilecekti. Sabahın erken saatlerinde paralel processing denemeleri yapıldı. Eğer bir sorun çıkarsa, zaten çalışan bir versiyon elimizde vardı. Bu garantiyle, son dakikaya kadar paralel processing denemelerine devam edildi. Nihayet demo başladığında, sistem kısaca tanıtılıp robot PLAY modunda çalıştırıldı.

Sonuç başarılıydı. Nihayetinde bu bir demo sistemdi ve amacına ulaşmıştı. Bundan sonra yapılması gereken, sistemi daha da iyileştirmekti.

Bugünlerde bu iyileştirmeler üzerine çalışmaktayız.

Bunlar genel olarak;

  • Parçaların tanıtılması amacıyla Autocad dxf dosyasından yüklenebilmesi
  • Ortam ışık şiddetinin değişiminden sistemin etkilenmemesinin sağlanması
  • İlave kontrol fonksiyonları ve görsel arayüzler (Ekranda robot hareketlerinin izlenmesi, sesli kontrol vb. gibi)

Kullanılan Bileşenler :

  • Motoman Robot
  • iDS uEye renkli kamera
  • Mavis VYP Yazılımı
  • Mavis USB DIO Modülü (Elektriksel Haberleşme İçin)
  • Seri Haberleşme Kablosu
  • Konveyör
  • Test Parçaları (Dz boru ve dirsek şeklinde boru)
  • Sensör
  • Bilgisayar (Windows İşletim sistemi yüklü)

Sistemin Çalışması :

  1. Rastgele yüklenen test parçaları konveyör üzerinde ilerler
  2. parçalar sensör tarafından algılandığında Robot Mavis VYP programına işaret gönderir (24V. sinyali, Mavis DIO modülünün girişine iletir)
  3. VYP yazılımı, sensörün önündeki parçanın fotoğrafını çeker ve çevresini (contour), ağırlık merkezini, dönme açısını 3 eksende belirler.
  4. Kartezyen koordinatlardaki veriyi, daha önceden kalibre edilmiş olarak, robotun koordinat sistemine çevirir, Robotun tutacağı (X, Y, Z) koordinatlarını ve dönme açılarını (RX, RY, RZ) seri port üzerinden robota iletir.
  5. Robot verileri aldım sinyali gönderirse iletişim başarıyla gerçekleştirilmiş demektir ve robot parçayı belirtilen yerden alarak, daha önceden belirlenmiş hedef konuma taşır.
  6. Robot parçayı hedef konuma yerleştirmek veya geri dönmek için hareketini sürdürürken, VYP yazılımı yeni bir parça gelmişse, benzer şekilde bu parçanın koordinatlarını da robota iletir.
  7. Sistem döngüsel bir biçimde bu şekilde tüm parçalar için devam eder

Projenin Zorlukları :

  • Farklı parçaların, farklı pozisyonlardan tutulmak zorunda olması, dolayısıyla robota verilecek konum bilgilerinin parça bazında değişiyor olması
  • Sistemin gece-gündüz değişen ışık şiddeti koşullarında %100 çalışabilmesi
  • Konveyörü durdurmadan ve robotu bekletmeden çok hızlı fotoğraf alınıp işlenmesi, robotla haberleşmenin robot hareketini sürdürürken gerçekleştirilebilmesi

Proje Geliştirme Sürecinden Resimler