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 np
from PIL import ImageGrab
from collections import deque
from networktables import NetworkTables
import cv2
import time
import imutils
import argparse
import cv2 as CV
x = 0 #programın ileride hata vermemesi için x 0 olarak tanımlıyorum
y = 0 # programın ileride hata vermemesi için y 0 olarak tanımlıyorum
NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
table = NetworkTables.getTable("Vision") # table oluşturuyoruz
#sari rengin algilanmasi
colorLower = (24, 100, 100)
colorUpper = (44, 255, 255)
#converter.py ile convert ettiğiniz rengi buraya giriniz
def screen_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 = None
if len(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 = 0
print("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
import edu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesi
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek için
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
Class'ınızın altına networktables'i tanımlayın
public static NetworkTable table1 = NetworkTable.getTable("Vision"); // vision adında table çekiliyor
Değerleri okumak için 2 tane void oluşturalım.
public static double konumX()
{
return table1.getNumber("X", 0.0); //raspberry pi den gelen x kordinatları
}
public static double konumY()
{
return table1.getNumber("Y", 0.0); //raspberry pi den gelen y kordinatları
}
Değerleri SmartDashboard'a yazdıralım.
public void teleopPeriodic() {
SmartDashboard.putNumber("Nesnenin X konumu: ", konumX()); // smartdashboarda x konumu yazdır
SmartDashboard.putNumber("Nesnenin Y konumu: ", konumY()); // smartdashboarda y konumunu yazdır
}
Motorlarımız Değerlere göre haraket ettirelim!
public void autonomousPeriodic() {
if(konumX() == 0)
{
sagmotor1.set(0);
sagmotor2.set(0);
solmotor1.set(0);
solmotor2.set(0);
}
else if(konumX() < 285) // degerler 285'ten kucukse saga don
{
sagmotor1.set(0.5); // sag motorları calistir
sagmotor2.set(0.5);
}
else if (konumX() > 295) // degerler 295'ten buyukse sola don
{
solmotor1.set(0.5); //sol motorlari calistir
solmotor2.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.