Eğer Raspberry Pi kullanmadan doğrudan bilgisayar aracılığı ile görüntü işlemek için bilgisayarınıza Python ve belirli kütüphaneleri kurmanız gerekmektedir. Gerekli kütüphaneleri şu şekilde kurabilirsiniz:
pip install pillow
pip install opencv-python
pip install pynetworktables
pip install imutils
import numpy as npfrom PIL import ImageGrabfrom collections import dequefrom networktables import NetworkTablesimport cv2import timeimport imutilsimport argparseimport cv2 as CVx =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 girinizdefscreen_record(): x =0 y =0 r =0 last_time = time.time()while(True):# 800x600 windowed mode printscreen = np.array(ImageGrab.grab(bbox=(0,40,1024,768)))print('Tekrarlanma süresi : {} saniye'.format(time.time()-last_time)) last_time = time.time() frame = printscreen frame = imutils.resize(frame, width=600) frame = imutils.rotate(frame, angle=0) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, colorLower, colorUpper) mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) 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: 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 y =0print("x : ")print(x)print("y : ")print(y) table.putNumber("X", x)# roborioya değeri göndermek table.putNumber("Y", y)# roborioya değeri göndermek cv2.imshow('frame', frame) cv2.waitKey(1)screen_record()
Kodunuzu yazıp kaydettikten sonra çalıştırmak için konsoldan şu komutu girmeniz gerekmektedir:
python yazilimadi.py
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'a düşmeye başlayacaktır.