Robotik
OKUDUĞUNUZ KONU
Arduino ve Pixy Kullanarak Görüntü İşleme
3

Arduino ve Pixy Kullanarak Görüntü İşleme

Yazar : Kerim24 Ekim 2017

Gelişmiş teknolojiler denince aklımıza ; robotik, savunma sanayi ürünleri , otomotiv, uzay-havacılık  ve daha sayamadığım bir sürü alan gelmektedir. Bu teknolojilerin çoğunda hassas sensörler, kartlar , kameralar vb cihazlar kullanır. Bunların mekanik , elektronik alanları olduğu gibi grafiksel çözümleme yapabilen alanları da vardır. Bu çözümleme işine görüntü işleme (image processing) örnek verilebilir. OpenCv, MATLAB, Halcon , OpenFrameworks, CIMG gibi farklı  kütüphaneleri ve programları kullanarak görüntü işleme üzerinde çalışmalar yapılabilir . Günümüzde bazı teknolojik ürünler üreten firmalar geliştirdikleri görüntü işleyen kartlarla yukarıda bahsettiğim kütüphaneler ile çok fazla uğraşmadan istediğimiz şekilde görüntü işlemeyi bize sunuyor.

Bu yazımda gelecekte önemli alanlarda kullanılacak olan  görüntü işleme teknolojisi ile ilgili yaptığımız basit bir projeyi elimden geldiğince anlatmaya çalışacağım. Şimdi kullanılacak olan malzemelere geçelim.

Malzemeler

 

Parçaların 3D baskılarını sitemiz üzerinden temin edebileceğiniz gibi elinizde bulunan ve kullanmadığınız metal ya da plastikleri ; yapıştırıcı , küçük ağızlı yıldız tornavida , plastik kelepçe yardımıyla istediğiniz şekle göre birleştirebilirsiniz.

Plastik kelepçe ile servoların bulunduğu yapıları Arduino Uno üzerinde düzgün bir şekilde sabitliyoruz.

Servoların X ve Y eksenlerinde düzgün bir şekilde hareket etmesi için iki servonun uygun açılarda montajlanması gerekmektedir.

Sabitlenen Ardino Uno’yu Zumo Shield in üstündeki yerine oturtuyoruz.

Sabitleme işlemleri tamamlandıktan sonra Pixy ve Zumo Shield hazır oluyor.

 

Pixy kameradan görüntü almak için Pixymon programını kurup çalıştırıyoruz.

Arduino Nano usb kablosunu Pixy’ye takıp pc bağlantısını yapıyoruz.  Programda bağlantının yapıldığı görünecektir.

Cismin rengini iki şekilde tanıtıyoruz :

ilk tanıtımı bilgisayara kurduğumuz yazılım ile yapıyoruz.

Programı açıp Action bölümünde bulunan signature seçeneği ile ( renk tanımı ) 7 farklı rengi tanıtabiliyoruz . Set signature 1 dediğimizde yazılım kamera görüntüsünü durduruyor. Biz de seçmek istediğim rengi mouse yardımıyla kare içine alıyoruz.

Rengini tanıttığımız cismi artık nereye götürürsek etrafındaki kare cismi takip ediyor olacak.

 

Renk tanımı yapacağımız ikinci yöntem ise Pixy kamera üzerinde bulunan fiziksel buton ile olacaktır.

Bilgisayara bağlı Pixy kameranın üstündeki fiziksel butona bir müddet basılı tutuyoruz.Kamera altındaki RGB led beyaz yanacak; bunun anlamı Pixy kamera renk öğrenmeye başlıyor demektir.Elimizi butondan çekince ışık kırmızıya dönecek . Bunun anlamı da Pixy şu anda tanıtmak istediğin rengi öğrenmeye hazırdır demek oluyor .

 

Tanıtacağımız cismi kamera önüne yaklaştırınca RGB led elimizdeki cismin rengini alacaktır.Aynı zamanda bilgisayardaki görüntüye bakınca cisim pixellerine ayrılmış şekilde görünecektir . Son olarak butona basıp tanıtmak istediğimiz rengi Pixy nin hafızasına almış oluyoruz.

 

 

Pixy kameranın arkasında bulunan pinlere servo motor takılarak kameranın X ve Y eksenlerinde hareket etmesini sağlayabilir ; bununla beraber aşağıda verdiğim kodlarla Zumo Shield ile güzel projeler yapabilirsiniz.

Zumo Shield için Arduino kütüphanelerini bu linkten bulabilirsiniz. İndirdiğiniz dosyada ZumoMotors kütüphanesini  Arduino’nun kütüphane kısmına ekleyeceğiz.Aşağıdaki kodu Zumo Shield üstündeki Arduino ya yükleyeceğiz.


#include <SPI.h>
#include <Pixy.h>

#include <ZumoMotors.h>

#define X_CENTER 160L
#define Y_CENTER 100L
#define RCS_MIN_POS 0L
#define RCS_MAX_POS 1000L
#define RCS_CENTER_POS ((RCS_MAX_POS-RCS_MIN_POS)/2)

//---------------------------------------
// Servo Loop Class
// A Proportional/Derivative feedback
// loop for pan/tilt servo tracking of
// blocks.
// (Based on Pixy CMUcam5 example code)
//---------------------------------------
class ServoLoop
{
public:
ServoLoop(int32_t proportionalGain, int32_t derivativeGain);

void update(int32_t error);

int32_t m_pos;
int32_t m_prevError;
int32_t m_proportionalGain;
int32_t m_derivativeGain;
};

// ServoLoop Constructor
ServoLoop::ServoLoop(int32_t proportionalGain, int32_t derivativeGain)
{
m_pos = RCS_CENTER_POS;
m_proportionalGain = proportionalGain;
m_derivativeGain = derivativeGain;
m_prevError = 0x80000000L;
}

// ServoLoop Update
// Calculates new output based on the measured
// error and the current state.
void ServoLoop::update(int32_t error)
{
long int velocity;
char buf[32];
if (m_prevError!=0x80000000)
{
velocity = (error*m_proportionalGain + (error - m_prevError)*m_derivativeGain)>>10;

m_pos += velocity;
if (m_pos>RCS_MAX_POS)
{
m_pos = RCS_MAX_POS;
}
else if (m_pos<RCS_MIN_POS)
{
m_pos = RCS_MIN_POS;
}
}
m_prevError = error;
}
// End Servo Loop Class
//---------------------------------------

Pixy pixy; // Declare the camera object

ServoLoop panLoop(200, 200); // Servo loop for pan
ServoLoop tiltLoop(150, 200); // Servo loop for tilt

ZumoMotors motors; // declare the motors on the zumo

//---------------------------------------
// Setup - runs once at startup
//---------------------------------------
void setup()
{
Serial.begin(9600);
Serial.print("Starting...\n");

pixy.init();
}

uint32_t lastBlockTime = 0;

//---------------------------------------
// Main loop - runs continuously after setup
//---------------------------------------
void loop()
{
uint16_t blocks;
blocks = pixy.getBlocks();

// If we have blocks in sight, track and follow them
if (blocks)
{
int trackedBlock = TrackBlock(blocks);
FollowBlock(trackedBlock);
lastBlockTime = millis();
}
else if (millis() - lastBlockTime > 100)
{
motors.setLeftSpeed(0);
motors.setRightSpeed(0);
ScanForBlocks();
}
}

int oldX, oldY, oldSignature;

//---------------------------------------
// Track blocks via the Pixy pan/tilt mech
// (based in part on Pixy CMUcam5 pantilt example)
//---------------------------------------
int TrackBlock(int blockCount)
{
int trackedBlock = 0;
long maxSize = 0;

Serial.print("blocks =");
Serial.println(blockCount);

for (int i = 0; i < blockCount; i++)
{
if ((oldSignature == 0) || (pixy.blocks[i].signature == oldSignature))
{
long newSize = pixy.blocks[i].height * pixy.blocks[i].width;
if (newSize > maxSize)
{
trackedBlock = i;
maxSize = newSize;
}
}
}

int32_t panError = X_CENTER - pixy.blocks[trackedBlock].x;
int32_t tiltError = pixy.blocks[trackedBlock].y - Y_CENTER;

panLoop.update(panError);
tiltLoop.update(tiltError);

pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);

oldX = pixy.blocks[trackedBlock].x;
oldY = pixy.blocks[trackedBlock].y;
oldSignature = pixy.blocks[trackedBlock].signature;
return trackedBlock;
}

//---------------------------------------
// Follow blocks via the Zumo robot drive
//
// This code makes the robot base turn
// and move to follow the pan/tilt tracking
// of the head.
//---------------------------------------
int32_t size = 400;
void FollowBlock(int trackedBlock)
{
int32_t followError = RCS_CENTER_POS - panLoop.m_pos; // How far off-center are we looking now?

// Size is the area of the object.
// We keep a running average of the last 8.
size += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;
size -= size >> 3;

// Forward speed decreases as we approach the object (size is larger)
int forwardSpeed = constrain(400 - (size/256), -100, 400);

// Steering differential is proportional to the error times the forward speed
int32_t differential = (followError + (followError * forwardSpeed))>>8;

// Adjust the left and right speeds by the steering differential.
int leftSpeed = constrain(forwardSpeed + differential, -400, 400);
int rightSpeed = constrain(forwardSpeed - differential, -400, 400);

// And set the motor speeds
motors.setLeftSpeed(leftSpeed);
motors.setRightSpeed(rightSpeed);
}

//---------------------------------------
// Random search for blocks
//
// This code pans back and forth at random
// until a block is detected
//---------------------------------------
int scanIncrement = (RCS_MAX_POS - RCS_MIN_POS) / 150;
uint32_t lastMove = 0;

void ScanForBlocks()
{
if (millis() - lastMove > 20)
{
lastMove = millis();
panLoop.m_pos += scanIncrement;
if ((panLoop.m_pos >= RCS_MAX_POS)||(panLoop.m_pos <= RCS_MIN_POS))
{
tiltLoop.m_pos = random(RCS_MAX_POS * 0.6, RCS_MAX_POS);
scanIncrement = -scanIncrement;
if (scanIncrement < 0)
{
motors.setLeftSpeed(-250);
motors.setRightSpeed(250);
}
else
{
motors.setLeftSpeed(+180);
motors.setRightSpeed(-180);
}
delay(random(250, 500));
}

pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
}
}

Pixy , Zumo ve servolar ortak çalışacaktır. Pixy’ ye tanıttığımız  rengi takip edip peşinden giden bir robot yapmış olduk.

Bu ürünü marketimizden temin edebilirsiniz.

Son olarak,  yaptığım çalışmanın videosunu paylaşmak istedim.

 

 

SİZCE NASIL OLMUŞ?
Beğendim
95%
İlginç
5%
Eh İşte
0%
Anlamadım
0%
Kötü
0%
Berbat
0%
YAZAR HAKKINDA
Kerim
3 YORUMLAR
  • 29 Ekim 2017 at 02:20

    merhaba hayirli.islerdilerim.size elin koluna saglik. bu kameranin. aynisi. var. robotla sitedeki. gibi. sizin. sayenizde. yapmak. mumkunse.
    arduino baglatilari. bende shell motor surucu, var l293d. sizden istedigim. kodu. sitedeki. hata variyor.
    bide bu govdeyi.Zumo ve servolar ortak çalışacaktır ucret karsiligi. bende kamera. var aynisi
    bu robotu calisan kodu- mumkunse. umarim. cevap verirsiniz. allaha emanet olun
    semayida gonderseniz. cok sevinirim.isvecten selamlar.

  • 30 Ekim 2017 at 00:37

    merhaba liberar. icine icine atmam. icin kodlari. becermedim. bunun hakinda. sizden yardim. istiyorum. bu pixcamerayi. sumo robotla. calistirmak. bunun kodunu. yapamadim. sizden. yardim. beklemek. tesekkurler. allah. isinizi. rast getirsin
    bende pixy kamera aynisi. var bende., sizin sayenizde. robotu. calistirmak.evelden. cevap veriyordunuz. ne oldu. bir hatam, varsa, soyle.

  • 30 Ekim 2017 at 19:26

    merhaba sizden istedigim. bu robotun kodu ve sizindedigin gibi linkte. ikutuphaneleri. becermedim. bunun hakinda. sizden yardim. istiyorum.
    pixy kamera aynisi var. bende. sumo robot kit bana yolarsaniz. ucretiniz neyse odur. umarim. cevap verirsiniz. allaha emanet olun,

YORUM YAP