Merhaba Arkadaşlar
Bu yazımda bir KickStarter Projesi olan CMUcam5 veya diğer adıyla Pixy Dijital kamera modülünü inceleyeceğiz. Bu kamerayı bir arkadaşımın projesi için satın aldık. Arkadaşım kendi projesiyle uğraşırken benimde bu arada kamerayı inceleme fırsatım oldu.
Bahsettiğim gibi bu kamera bir KickStarter projesi olarak yola çıkmış. Carnegie Mellon, Robotics Institute ve Charmed Labs’ın birlikte tasarladığı bir sensör. Geliştiriciler arasında Rich LeGrand, Scott Robinson ve Anthony Rowe var. Gerçekten büyük bir başarı yakalamış. Tarihin en popüler görme sensörü olduğundan bahsediliyor. Üstelik tamamen açık kaynak kodlu!
Kameranın ayrıntılarına girmeden önce şunu söylemeliyim ki bu kamera gerçekten harika! Kameranın tasarımını gerçekten çok beğendim. Alt seviyede embedded sistemlerle uğraşanları bir adım daha ileriye götürebilecek güzel bir kamera modülü.
Pixy’i tanıyalım
Pixy; hızlı bir şekilde öğrenerek nesneleri bulmak için tasarlanmış ve programlanmış bütünleşik bir kamera modülüdür. Biz buna görme sensörüde (Vision Sensor) diyebiliriz. Kamera modülü üzerindeki tek bir butonla kameranın gördüğü renkli bir objeyi takibe alabiliyorsunuz. Bu renkler şimdilik 7 adet renk ile sınırlı. Bu Renkler Kırmız, Turuncu, Sarı, Mavi, Açık Mavi, Mor ve Yeşil olarak sıralanabilir. Başlangıç için oldukça yeterli.
Ben sensörü 69$ dan aldım. İlk başta biraz pahalı gelebilir ama görüntü işlemeyle uğraşanlar bu işin ne kadar eziyetli olduğunu bilirler. Kamera benim elime geldikten sonra Arduino Uno ile bağlantısını yapıp Örnek Programı çalıştırmam 10dk sürmedi. Birde bu alçıdan düşünmek lazım.
Kameramız işte budur 🙂
Oldukça şık görünüyor 🙂
Sensörün üzerinde NXP Firmasının LPC4330 Çift çekirdekli Mikrodenetleyicisi bulunmakta. İçerisinde 204Mhz de çalışan 32bit ARM Cortex-M4 ün yanında birde yine 204Mhz de çalışan 32bit ARM Cortex-M0 işlemcisi bulunmakta. Daha önce CoPilot deyimini duymuşsunuzdur. Bunada CoProcessor deniliyor 🙂
Kamera olarak OmnVision firmasının OV9715 image sensörü bulunmakta. 1Megapixel çözünülüğe sahip olan bu sensör 30FPS de 1280×800(WXGA) çözünürlükte resim verebilme kabiliyetine sahip. Ayrıca 640×400 çözünürlükte ise bu hız 60FPS ye çıkmaktadır.
Genel olarak modülün teknik özellikteri aşağıdaki gibidir.
Processor: NXP LPC4330, 204 MHz, dual core
Image sensor: Omnivision OV9715, 1/4″, 1280×800
Lens field-of-view: 75 degrees horizontal, 47 degrees vertical
Lens type: standard M12 (several different types available)
Power consumption: 140 mA typical
Power input: USB input (5V) or unregulated input (6V to 10V)
RAM: 264K bytes
Flash: 1M bytes
Available data outputs: UART serial, SPI, I2C, USB, digital, analog
Dimensions: 2.1″ x 1.75″ x 1.4″
Pixy gerçekten hızlı. OV9715 Sensörünün 60FPS de görüntü alabildiğini yukarıda söylemiştim. Pixy’de ise yine 680×400 çözünürlükte ve 50FPS de görüntü alınmaktadır. Buda algılanan bütün nesnelerin pozisyonlarının ve boyutlarının 20ms içerisinde güncellenmesi anlamına gelir. Bir örnek vermek gerekirse Pixy ile düşen veya sıçrayan bir topun takibini yapabilirsiniz. 50FPS gayet iyi bir değer. Bu kadar hızlı olmasında 204Mhz’de çalışan LPC4330 ‘un etkisi büyük olsa gerek.
Pixy nesneleri algılamak için bir çeşit renk tabanlı filtreleme algoritmasını kullanıyor. Pixy görüntü sensöründen gelen her bir pixel’in Rengini ve doygunluğunu hesaplar. İlk uygulanan filtreleme budur. Daha sonra yine bir takım çeşitli algoritmalar kullanılarak cisimlerin yerleri ve boyutları tespit edilir.
Evet kartımızın arka tarafı resimdeki gibidir.
Gördüğünüz üzere 1 adet buton, USB konnektörü, I/O Portu, RC Servo çıkışı ve Power girişi mevcut.
Pixy birçok haberleşme protokolünü desteklemektedir. Modül üzerinde bulunan I/O portu sayesinde SPI, UART, I2C gibi protokollerde iletişim kurulabiliyor. Ayrıca Analog Out, Digital Out gibi destekleri mevcut.
Pixy’nin Arduino başta olmak üzere birçok platform ile çalışması hedeflenmiş. Arduino birlikte Rasperry Pi ve Beagle Bone Black’a doğrudan desteği mevcut. Tabi bununla kalınmaz elbette isteyen istediği platformda kullanabilir 🙂
Pixy’nin kutu içeriği ise resimdeki gibi
Pixy ile birlikte 1 adet interface kablosu ve bağlantı aparatları çıkıyor.
Pixy üzerinde birde 2 Adet RC servo çıkışı mevcut. Bu sayede doğrudan Pixy’ye RC Servo bağlayıp PAN-TILT mekanizmasını kontrol edebiliyorsunuz. Pixy’nin kendi içerisinde Pan-Tilt uygulaması var. Bunu çalıştırabileceğiniz gibi kendinizde pixy üzerindeki servoları kontrol edebiliyorsunuz. Bu özellik bayağı hoşuma gitti.
Bununla ilgili KickStarter’in çok güzel bir videosu mevcut. İzlemenizi tavsiye ediyorum.
Pixy USB Bağlantısı
Kart üzerinde USB bağlantısıda var. USB üzerinden bilgisayara bağlayıp öğretme işlemini ve çeşitli ayarlamaları yapabiliyoruz. Bilgisayar ortamında ayarların yapılabilmesi için PixyMon adındaki program bilgisayarınızda kurulu olması gerekiyor. Bu programın Mac, Windows XP, 7,8 ve Linux Desteği mevcut.
Hızlı başlangıç için ilk önce kendi işletim sistemimize uygun PixyMon programını indirmemiz Gerekiyor. Mac-OS kullananlar Buradan kurulum işlemini yapabilirler.
Linux için ise yine buradan kurulum işlemi takip edilebilir. Fakat anladığım kadarıyla linux ile çalışabilmek için Pixy’nin yazılımını güncelleştirmek gerekiyor. Ben satın aldığımda 0.1.44 yüklü olarak geldi. İsterseniz buradaki açıklamaları takip ederek Pixy’nin yazılımını güncelleştirebilirsiniz. En son 1.0.2Beta sürümü çıkmış.
İzlediğim videolardan anladığım kadarıyla bu sürümde ekstra birkaç özellik daha eklenmiş. Renk kodu denen bir sistem eklenmişler. Şöyleki, iki adet farklı renklerdeki renk bandını yan yana yapıştırarak takip edilen objenin kameraya göre açısını veya eğimini hesaplatmışlar. Hatta ileride yüz tanıma gibi özellikleri ekleyeceklerinden bahsediyorlar 🙂 Biraz düşününce bayağı iş çıkar gibi geliyor 🙂 Yüz tanıma neysede En azından şuanda açı hesaplama özelliğini kullanabilmek için PixMon’un da 1.0.2 ve üzeri olması gerekiyor. Ayrıntılı bilgi burada mevcut.
Her neyse 🙂 Windows 7 için Buradan pixymon_windows-0.1.49.exe dosyasını bilgisayarımıza indirip kurulumunu yapıyoruz. Ayrıca PixyMon’un 1.0.2Beta sürümüde mevcut fakat bu sürüm ile çalışabilmek için PixyMon’un da sürümünün 1.0.2 olması gerekiyor. Henüz Beta aşamasında olduğu için tam oturmuş değil. Bu yüzden 0.1.49 sürümünü kuruyoruz. PixyMon’u kurarken Pixy’nin driverininde kurmuş olacaksınız. Kurulum işlemi tamamlandıktan sonra artık Pixy’i bilgisayarınıza bağlayabilirsiniz.
PixyMon’u çalıştırdığınızda aşağıdaki gibi bir görüntü elde ediyorsanız her şey yolunda demektir.
Bundan sonra Raw Video butonuna tıklarsanız görüntü gelecektir.
Nesne Öğretme:
Şimdi programın kullanımına bakalım. İlk etapta hemen bir cisim tanıtalım. Ben renkli toplar kullanacağım 🙂
Pixy’i USB den bilgisayara bağladıktan sonra PixyMon programını çalıştırıyoruz. Sonrasında Raw Video butonuna basarak görüntünün gelmesini sağlayın.
Sonrasında kameranın önüne Pixy’nin algılayabileceği renkli bir obje koyun 🙂 Son olarak Action menüsünden Set Signature 1’i seçin. Ardından görüntü ekranda sabitlenecekdir. Fareyi kullanarak görünü üzerinde takip edilmesini istediğiniz objenin üzerinde bir alan seçin.
Sonrasında Pixy hemen seçtiğiniz objeyi kutucuk içerisine alacaktır. Tam olarak aşağıdaki gibi.
Pixy artık o objeyi öğrenmiş oldu. Pixy bunun gibi 7 farklı renkte objeyi öğrenebilir. Ayrıca aynı renkteki objelerden 10’larca tespit edebiliyormuş. Bunun altında ise Connected Componed Algorithm yatıyor.
Aynı şekilde yeşil, mavi ve sarı top içinde öğretme işlemini tekrarladım.(Set Signature 2, Set Signature 3..) Sonuç aşağıdaki gibi 🙂
Kameranın Objeleri tanıması birazda ortam ışığına bağlı. Genellikle en iyi sonuç gün ışığında alınıyor. Eğer ortam ışığı yetersiz ise veya Çok parlak bir görüntü var ise Color Saturation isn’t high enough! Hatasını alırsınız. Bu durumdan çıkarmanız gereken şey kameranın gördüğü renk algılayabildiği 7 Renk’ten herhangi biriyle uyuşmuyor. Mesela ben telefonumun ekranını komple kırmızı yapıp Pixy’ye gösterdim. Telefon ekranını öğretmek istediğimde ekran çok parlak olduğu için bu hatayı aldım. Bu durumu konfigurasyon ayarlarıyla oynayarak birazcık düzeltebilirsiniz. Parlaklık ayarı, Saturasyon ayarı gibi birkaç ayar mevcut.
Buton ile Öğrenme:
Aslında bu daha basit resimle anlatmama gerek yok sanırım:)
Yapmanız gereken şey kısaca şudur.
Pixy’ye enerji veriyoruz. Enerji verdiğiniz zaman Pixy’nin önündeki RGB led beyaz olarak yanıp bir süre sonra flash yaptıktan sonra sönecektir. Bu normal olarak çalıştığının göstergesidir. Bunu her zaman yapar. Ardından öğretmek istediğimiz objeyi Pixy’nin kadrajının önüne doğru yaklaştırıyoruz. Yaklaşık 25-30cm mesafede durması yeterli. Sonrasında Pixy üzerindeki butona basıp basılı bir şekilde tutuyoruz. Basılı tuttuktan yaklaşık 1-1,5 sn sonra Pixy önündeki led beyaz yanacaktır. Bu öğrenme moduna girdiği anlamına gelir. Bundan sonra butona basılı tuttuğunuz sürece beyaz yanan led sırarıyla Kırmızı, Turuncu, Sarı, Açık mavi, Mavi, Mor ve sonrasında tekrardan beyaz olmak suretiyle renk değiştirir.
Hatırlarsanız eğer PixyMon programında Set Signature 1, Set Signature 2,…., Set Signature 7 olmak üzere 7 adet öğrenme hafızası vardı. Renkler bu hafızaları temsil eder. Sıralama aşağıdaki gibidir
Set Signature 1 : Kırmızı Set Signature 2 : Turuncu Set Signature 3 : Sarı Set Signature 4 : Yeşil Set Signature 5 : Açık Mavi Set Signature 6 : Mavi Set Signature 7 : Mor
Butona basılı tuttuğunuz sürece renkler arası geçiş devam eder. Bundan sonra örneğin led kırmızı yandığı zaman butonu bırakırsanız led kameranın önüne koyduğunuz veya başka bir deyişle tanıtmak istediğiniz cismin rengine döner. Sonra butona tekrar basıp bırakırsanız led parlak bir şekilde kırmızı flaş yapıp, cisminizin 1. hafıza bölgesine (Set Signature 1) başarılı bir şekide kaydedildiğini ifade eder.
Aynı şekilde diyelimki 5. hafıza bölgesine cisim öğretmek istiyorsunuz. Yukarıdaki işlemlerin aynısını tekrar edin. Led açık mavi yandığı zaman butonu bırakın. Hemen ardından led kameranın önüne koyduğunuz cismin rengine döner. Ardından tekrardan butona basıp bıraktığınız zaman led açık mavi yanarak güçlü bir flaş yapıp cismin kaydedildiğini ifade eder. Pixy artık o cismide öğrenmiş oldu. Hepsi bu kadar 🙂
Pixy I/O Portu
Artık donanım kısmını biraz inceleyelim. Daha önce bahsetmiştim. Pixy üzerindeki I/O portu üzerinden birçok formatta haberleşme yapılabiliyor. Aşağıdaki resimde I/O portunda hangi pinin hangi amaçla kullanılabileceği gösterilmiş.
Pixy herzaman slave modunda çalışıyor. Yani SPI, USART ve I2C de durum böyle. Default olarak I2C slave adresi 0x54 olarak ayarlanmış. Usart Baudrate ise 19200, Bu değerleri PixyMon Configuratipn>>Communication tabından değiştirebiliyorsunuz.
Pixy ile istediğiniz MCU ile haberleşebilirsiniz. Çok basitçe bir veri yapısı kullanılıyor. Aşağıdaki verileri kendi sitelerinden alıntıladım.
Bytes 16-bit words Description
—————————————————————-
0, 1 0 sync (0xaa55)
2, 3 1 checksum (sum of all 16-bit words 2-6)
4, 5 2 signature number
6, 7 3 x center of object
8, 9 4 y center of object
10, 11 5 width of object
12, 13 6 height of object
Yukarıdan anladığım kadarıyla ilk başta senkronizasyon için 0xAA55 verisini göndermek gerekiyor. Bunu gönderdikten sonra data paketleri peşi sıra ile okumak gerekiyor. Ben bu konuda bir deneme yapmadım. Bu yüzden üzerinde fazla durmayacağım. Ayrıntılı bilgi için aşağıdaki linklere bakınız
https://docs.pixycam.com
Pixy-Arduino Bağlantısı ve Örnek Uygulama
Pixy’nin Arduino Uno için doğrudan kütüphane desteği var. Örnek uygulamayı çalıştıralım. İlk önce kütüphaneyi Buradan indirip zipten çıkardıktan sonra Arduinonun bulunduğu yerde Libraries klasörüne kopyalayın. Daha sonra Arduinoyu çalıştırıp File>>Examples>>Pixy>>Hello World Uygulamasını açın.
Hello World uygulaması Pixy ile SPI üzerinden haberleşiyor. Yaptığı iş ise Pixy’den Pixy’e öğrettiğimiz nesnelerin konumlarını ve boyutlarını seri port aracılığıyla bize göndermek olarak özetlenebilir. Şimdi Hello World uygulamasını açtıktan sonra Verify Butonuna basarak kodları derleyin.
Kodların hatasız bir şekilde derlenmesi gerekiyor. Eğer buraya kadar problem olmadıysa upload tuşuna basıp programı Arduinoya yükleyebilirsiniz.
Programı yükledikten sonra sıra geldi bağlantıları yapmaya. Pixy’yi Arduinoya bağlamak için kutu içerisinden interface kablosu çıkıyor. Bu kabloyu resimdeki gibi Pixy’nin I/O Portu ile Arduinonun ISP konnektörüne bağlayın.
Bu aşamadan sonra Pixy’ye herhangi bir nesneyi öğretip konum ve boyut bilgilerini alabilirsiniz. Öğretme işlemini butonla yapabileceğiniz gibi Bilgisayar üzerinden de yapabilirsiniz. Butonla yapmak çok kolay 🙂
Sonuç olarak Arduino’da Serial Monitör’ü açınça aldığınız çıktı resimdeki gibi oluyor.
Yukarıdaki çıktıyı almak için kameraya 3 adet nesne öğrettim.
Örneğin ilk gelen pakette 3 adet obje tespit edilmiş. Her birinin farklı renkte olduğunu sig: 1, sig:2, sig:3 şeklinde gelen verilerden anlıyorum. X ve Y verileri bize 640×400 image array içerisindeki kordinatını, width ve height verileri ise tespit edilen objenin boyutunu veriyor. Bundan sonrası artık size kalmış 🙂
Pan/Tilt uygulaması
Son olarak Pan-Tilt uygulaması üzerine biraz değineyim.
Pixy’nin kendi içine gömülü olarak Pan/Tilt Kontrol yazılımı mevcut. Bu yazılımı çalıştırabilmek için Pixy’nin dışında iki adet servoya ve birde Pan/Tilt Mekanizmasına ihtiyacınız var.
Pan-Tilt mekanizmasını hazır alabileceğiniz gibi kendinizde yapabilirsiniz. Ebay’de kamerayı aldığım satıcıda Pan/Tilt Mekanizması var. Pixy’ hariç servolarla birlikte 39$ gibi bir ücrete satıyor.
Biraz pahalı gibi ama ebay’de daha ucuz olanları var.
Ben mekanizmayı satın almadım ama elimde iki adet servo vardı. Bende bu servoları kullanıp Plexiglass kullanarak kendim yapayım dedim. Benim mekanizma budur 🙂
Servolarında çok büyük olmasına gerek yok. İki adet Micro Servo yeterlidir. Örnek olarak linkteki gibi bir servo kullanılabilir
Turnigy MG90S Digital Metal Gear Servo
Şimdi ilk önce servolarımızı resimdeki gibi Pixy’ye bağlayalım. Bağlantı yönüne dikkat edelim.
Daha sonra Pixy’ye bir nesne öğretmemiz gerekir. Bunu nasıl yapacağımızı artık öğrendik. Bu yüzden bu aşamayı geçiyorum. 🙂
Pan Tilt Programı aktif etmek için PixyMon programında Action tabından Run pan/tilt demo‘yu seçmeniz gerekiyor. Bundan sonra servoların hareket etmeye başladığınız göreceksiniz. Hedef öğrenilen objenin sürekli görüntünün tam ortada durmasını sağlamak. Pixy sürekli bunun için uğraşır 🙂
Pan/Tilt ve Servolarla ilgili birkaç ayar var. Bilinmesinde fayda var. Bunlara biraz değineyim.
Aşağıdaki pencerede servoların alt ve üst hareket limitlerini ayarlayabilirsiniz. Ayarlar Default olarak aşağıdaki gibi.
Ayrıca Servo frekansıda ayarlanabilmekte.
Son olarak Pan/Tilt ayarları mevcut. Bu ayarlarda default olarak aşağıdaki gibidir.
Yukarıdaki ayarlar servoların kazanç ayarları. Pan tilt mekanizmasındaki servoların hızına, mekanizmanın yapısına göre bu ayarlarla oynamak gerekebilir. Bunu deneyip görmek lazım. Mesela ben ilk çalıştırdığımda sürekli rezonansa girdiğini farkettim. Yani servolar sürekli salınım yapıp bir türlü objeyi ortada bulamıyordu. Titremler aşırı derece oluyordu. Sonra bu değerleri biraz düşürünce ciddi bir iyileşme oldu. Tahminimce içeride P kontrol tarzı bir algoritma yürütülüyor. Açıkçası buradaki kontrol algoritması o kadarda hoşuma gitmedi. Tam olarak emin değilim. Benim mekanizmanın veya servoların ayarsızlığından da kaynaklanıyor olabilir.
Evet arkadaşlar benim Pan/Tilt deneme videomda budur 🙂
Pixy konusunda diyeceklerim bu kadar arkadaşlar. Umarım birilerine ilham verir 🙂
İyi çalışmalar dilerim.
Yayım tarihi: 2015/02/09 Etiketler: arduino pixy, arduino projeleri, görüntü işleme, kamera modülü, pixy cmucam5
Güzel bir paylaşım olmuş emeğinize sağlık, nesne tanıma ve yapay görme uygulamaları için gömülü sistemlere yönelik mükemmel bir ürün…
Bende bundan var ama ikincisi lazım. Sipariş verdik gelmedi. Yurtiçi arıyorum. Varsa hemen alacağım.
tamam
merhaba,
bir projem için pixy kullanmayı düşünüyorum, eğer mümkünse sizinle iletişime geçerek pixy hakkındaki bilgi edinme olanağım olabilir mi?
Bunun aynısını yapmak istiyorum, sene sonu ödevimiz herkes birer devre yapıcak bu yüzden bende bunda kararlaştırdım ama baskı devresi ve malzemeleri hakkında bilgi verirseniz sevinirim…
Bitirme projesinde bu projenin aynısını yapmam gerekiyor kullanacağım malzemeler ve pixy hakkında bilgi verebilirseniz sevinirim