Merhabalar, bu içerikte sizlerle daha önceden geliştirdiğimiz görüntü işleme komutlarını paylaşacağım. Öncelikle kodların tamamına ulaşmak isterseniz : https://github.com/enisgetmez/FRC-Vision-Processing buradan ulaşabilirsiniz.
Bu kısmı buradan daha detaylı bir şekilde izleyebilirsiniz:
Co-Processor olarak Raspberry PI kullanacağız.
Gerekli Kütüphanelerin Kurulması
Öncelikle görüntü işleme yapacağımız için OpenCV kütüphanelerinden faydalanacağız. OpenCV kütüphanelerinin çalışması için aynı zamanda Numpy kütüphanesini de kurmamız gerekmektedir.
Konsola girmemiz gereken komutlar şu şekildedir:
sudo apt install python-numpy python-opencv libopencv-dev
y/n seçeneğine y yanıtını verelim. Bu işlem yaklaşık 5 dakika sürebilir.
Python için pip yani paket yöneticimizi indirmemiz gerekmektedir.
sudo apt install python python-pip
y/n seçeneğine y yanıtını verelim. Ardından
pip install opencv-python
pip install pynetworktables
pip install imutils
komutlarını girelim. Eğer Python 3 kullanıyorsanız, pip komutlarınız şu şekilde olmalı:
pip3 install opencv-python
pip3 install pynetworktables
pip3 install imutils
Her şey tamamlandıktan sonra bu adımda bitmiş demektir. Bir sonraki adıma geçebiliriz.
Renk işleme için renk değerlerinin oluşturulması
En başta renk işlememiz için bize tanımlayacağımız rengin alt ve üst sınırları dediğimiz renk kodu gerekmektedir. Bunun için bir converter yazılımı mevcut. Kodlar bu şekildedir:
Algılatmak istediğiniz rengin kırmızı, yeşil, mavi renk değerlerini almalısınız. Ardından şu komutu kullanmalısınız:
convert.py red green blue
Lower bound ve upper bound dediğimiz renkleri kopyalayın. İleride kullanacağız.
Renk İşleme
Raspberry PI için python yazılımımız şu şekildedir :
#!/usr/bin/env python# -*- coding: utf-8 -*-from collections import dequefrom networktables import NetworkTablesimport numpy as npimport argparseimport cv2import timeimport imutilsx =0#programın ileride hata vermemesi için x 0 olarak tanımlıyorumy =0# programın ileride hata vermemesi için y 0 olarak tanımlıyorumNetworkTables.initialize(server='roborio-6025-frc.local')# Roborio ile iletişim kuruyoruztable = NetworkTables.getTable("Vision")# table oluşturuyoruz#sari rengin algilanmasicolorLower = (24,100,100)colorUpper = (44,255,255)#converter.py ile convert ettiğiniz rengi buraya girinizcamera = cv2.VideoCapture(0)# webcamin bagli oldugu port varsayilan 0whileTrue:#yazılımımız çalıştığı sürece aşağıdaki işlemleri tekrarla (grabbed, frame) = camera.read()# grabbed ve frame değişkenini camera.read olarak tanımlıyoruz. frame = imutils.resize(frame, width=600)# görüntü genişliğini 600p yapıyoruz frame = imutils.rotate(frame, angle=0)# görüntüyü sabitliyoruz hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# görüntüyü hsv formatına çeviriyoruz mask = cv2.inRange(hsv, colorLower, colorUpper) # hsv formatına dönen görüntünün bizim belirttiğimiz renk sınırları içerisinde olanları belirliyor
mask = cv2.erode(mask, None, iterations=2)# bizim renklerimizi işaretliyor mask = cv2.dilate(mask, None, iterations=2)# bizim renklerimizin genişliğini alıyor cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] center =Noneiflen(cnts)>0: c =max(cnts, key=cv2.contourArea) ((x, y), radius) = cv2.minEnclosingCircle(c) M = cv2.moments(c) center = (int(M["m10"] / M["m00"]),int(M["m01"] / M["m00"]))if radius >10:#algılanacak hedefin minumum boyutu cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1)else: x =0##değerlerin sıfırlanması y =0print("x : ")print(x)# kameradan gelen görüntüde bizim rengimiz varsa x kordinatıprint("y : ")print(y)# kameradan gelen görüntüde bizim rengimiz varsa y kordinatı table.putNumber("X", x)# roborioya değeri göndermek table.putNumber("Y", y)
Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.
Artık Java kodlarınızıda yazdıktan sonra robotunuzu enable ettiğinizde , Raspberry PI üzerinden yazılımımızı çalıştırdığımızda değerler otomatik olarak SmartDashboarda düşmeye başlayacaktır.
Kodunuzu Raspberry PI üzerinden çalıştırmak için:
python yazilimadi.py
Şeklinde kullanmanız gerekmektedir. Eğer wget komutunu kullandıysanız yazılım otomatik olarak vision.py olarak gelecektir. Yani çalıştırmak için:
python vision.py
komutunu kullanmanız yeterli olacaktır.
Raspberry Pi kod düzenleme(opsiyonel)
Raspberry Pi ile gelen kodu düzenlemek isterseniz nano komutunu kullanarak düzenleyebilirsiniz.
nano vision.py
Komutunu girip düzenleyeceğiniz satırı düzenledikten sonra ctrl-x tuşlarıyla çıkış yapabilirsiniz.
Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.
Artık robotunuzu enable ettiğinizde , Raspberry PI üzerinden yazılımımızı çalıştırdığımızda değerler otomatik olarak smart dashboarda düşmeye başlayacaktır.
Kodunuzu Raspberry PI üzerinden çalıştırmak için:
python yazilimadi.py
Şeklinde kullanmanız gerekmektedir. Eğer wget komutunu kullandıysanız yazılım otomatik olarak vision.py olarak gelecektir. Yani çalıştırmak için:
python circle.py
komutunu kullanmanız yeterli olacaktır.
Javadan Değerleri Çekin!
Kütüphaneleri import edin
importedu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesiimportedu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek içinimportedu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
Class'ınızın altına networktables'i tanımlayın
publicstaticNetworkTable table1 =NetworkTable.getTable("Vision"); // vision adında table çekiliyor
Değerleri okumak için 2 tane void oluşturalım.
publicstaticdoublekonumX() {returntable1.getNumber("X",0.0); //raspberry pi den gelen x kordinatları }publicstaticdoublekonumY() {returntable1.getNumber("Y",0.0); //raspberry pi den gelen y kordinatları }
Değerleri SmartDashboard'a yazdıralım.
publicvoidteleopPeriodic() {SmartDashboard.putNumber("Nesnenin X konumu: ",konumX()); // smartdashboarda x konumu yazdırSmartDashboard.putNumber("Nesnenin Y konumu: ",konumY()); // smartdashboarda y konumunu yazdır }
Motorlarımız Değerlere göre haraket ettirelim!
publicvoidautonomousPeriodic() {if(konumX()==0) {sagmotor1.set(0);sagmotor2.set(0);solmotor1.set(0);solmotor2.set(0); }elseif(konumX()<285) // degerler 285'ten kucukse saga don {sagmotor1.set(0.5); // sag motorları calistirsagmotor2.set(0.5); }elseif (konumX()>295) // degerler 295'ten buyukse sola don {solmotor1.set(0.5); //sol motorlari calistirsolmotor2.set(0.5); } }
Kodların tamamına buradan ulaşabilirsiniz :
Artık robotunuzu enable ettiğinizde , yazılımımızı çalıştırdığımızda değerler otomatik olarak SmartDashboard düşmeye başlayacaktır.