Co-Processor - Raspberry Pi

Raspberry Pi

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:
Görüntü İşleme Workshop | Fikret Yüksel Foundation #FRCTurkey
YouTube
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:
1
import sys
2
import numpy as np
3
import cv2
4
5
blue = sys.argv[1]
6
green = sys.argv[2]
7
red = sys.argv[3]
8
9
color = np.uint8([[[blue, green, red]]])
10
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
11
12
hue = hsv_color[0][0][0]
13
14
print("Lower bound is :"),
15
print("[" + str(hue-10) + ", 100, 100]\n")
16
17
print("Upper bound is :"),
18
print("[" + str(hue + 10) + ", 255, 255]")
Copied!
Dilerseniz Github hesabımdan bu kodlara ulaşabilirsiniz. Github üzerinden kolayca wget komutu ile indirebilirsiniz.
Kullanımı ise şu ş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 :
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
from collections import deque
4
from networktables import NetworkTables
5
import numpy as np
6
import argparse
7
import cv2
8
import time
9
import imutils
10
x = 0 #programın ileride hata vermemesi için x 0 olarak tanımlıyorum
11
y = 0 # programın ileride hata vermemesi için y 0 olarak tanımlıyorum
12
NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
13
table = NetworkTables.getTable("Vision") # table oluşturuyoruz
14
15
#sari rengin algilanmasi
16
colorLower = (24, 100, 100)
17
colorUpper = (44, 255, 255)
18
#converter.py ile convert ettiğiniz rengi buraya giriniz
19
camera = cv2.VideoCapture(0) # webcamin bagli oldugu port varsayilan 0
20
while True: #yazılımımız çalıştığı sürece aşağıdaki işlemleri tekrarla
21
22
23
(grabbed, frame) = camera.read() # grabbed ve frame değişkenini camera.read olarak tanımlıyoruz.
24
25
frame = imutils.resize(frame, width=600) # görüntü genişliğini 600p yapıyoruz
26
frame = imutils.rotate(frame, angle=0) # görüntüyü sabitliyoruz
27
28
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # görüntüyü hsv formatına çeviriyoruz
29
30
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
31
mask = cv2.erode(mask, None, iterations=2) # bizim renklerimizi işaretliyor
32
mask = cv2.dilate(mask, None, iterations=2) # bizim renklerimizin genişliğini alıyor
33
34
35
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
36
cv2.CHAIN_APPROX_SIMPLE)[-2]
37
center = None
38
39
40
if len(cnts) > 0:
41
42
c = max(cnts, key=cv2.contourArea)
43
((x, y), radius) = cv2.minEnclosingCircle(c)
44
M = cv2.moments(c)
45
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
46
47
48
if radius > 10: #algılanacak hedefin minumum boyutu
49
cv2.circle(frame, (int(x), int(y)), int(radius),
50
(0, 255, 255), 2)
51
cv2.circle(frame, center, 5, (0, 0, 255), -1)
52
else:
53
x = 0 ##değerlerin sıfırlanması
54
y = 0
55
56
print("x : ")
57
print(x) # kameradan gelen görüntüde bizim rengimiz varsa x kordinatı
58
print("y : ")
59
print(y) # kameradan gelen görüntüde bizim rengimiz varsa y kordinatı
60
61
table.putNumber("X", x) # roborioya değeri göndermek
62
table.putNumber("Y", y)
Copied!
Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.
1
wget https://raw.githubusercontent.com/enisgetmez/FRC-Vision-Processing/master/Color%20Detect/vision.py
Copied!
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.

Şekil İşleme

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
import numpy as np
4
import argparse
5
import cv2
6
import cv2 as CV
7
from networktables import NetworkTables
8
9
10
NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
11
table = NetworkTables.getTable("Vision") # table oluşturuyoruz
12
13
cap = cv2.VideoCapture(0) # webcamin bagli oldugu port
14
15
16
while(True):
17
# goruntu yakalama
18
ret, frame = cap.read()
19
20
# goruntuyu grilestir
21
22
output = frame.copy()
23
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
24
25
# goruntuyu blurlastir
26
gray = cv2.GaussianBlur(gray,(5,5),0);
27
gray = cv2.medianBlur(gray,5)
28
29
gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
30
cv2.THRESH_BINARY,11,3.5)
31
32
kernel = np.ones((5,5),np.uint8)
33
gray = cv2.erode(gray,kernel,iterations = 1)
34
35
gray = cv2.dilate(gray,kernel,iterations = 1)
36
circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) #python2 icin
37
# circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=40, param2=45, minRadius=0, maxRadius=0) # python3 icin
38
# (x−xcenter)2+(y−ycenter)2=r2 (xcenter,ycenter)
39
# kalibre
40
# daireyi isle
41
42
if circles is not None:
43
44
circles = np.round(circles[0, :]).astype("int")
45
46
47
for (x, y, r) in circles:
48
49
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
50
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
51
52
53
print ("X kordinat: ")
54
print (x) # x kordinatı
55
print ("Y Kordinat: ")
56
print (y) # y kordinatı
57
print ("Radius: ")
58
print (r) # cisimin büyüklüğü
59
table.putNumber("X", x) # roborioya değeri göndermek
60
table.putNumber("Y", y)
61
#cv2.imshow('frame',output) # ekranda göster
62
if cv2.waitKey(1) & 0xFF == ord('q'):
63
break
64
cap.release()
65
cv2.destroyAllWindows()
Copied!
Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.
1
wget https://raw.githubusercontent.com/enisgetmez/FRC-Vision-Processing/master/Figure%20Detect/circle.py
Copied!
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
1
import edu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesi
2
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek için
3
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
Copied!
Class'ınızın altına networktables'i tanımlayın
1
public static NetworkTable table1 = NetworkTable.getTable("Vision"); // vision adında table çekiliyor
Copied!
Değerleri okumak için 2 tane void oluşturalım.
1
public static double konumX()
2
{
3
return table1.getNumber("X", 0.0); //raspberry pi den gelen x kordinatları
4
}
5
public static double konumY()
6
{
7
return table1.getNumber("Y", 0.0); //raspberry pi den gelen y kordinatları
8
}
Copied!
Değerleri SmartDashboard'a yazdıralım.
1
public void teleopPeriodic() {
2
SmartDashboard.putNumber("Nesnenin X konumu: ", konumX()); // smartdashboarda x konumu yazdır
3
SmartDashboard.putNumber("Nesnenin Y konumu: ", konumY()); // smartdashboarda y konumunu yazdır
4
5
}
Copied!
Motorlarımız Değerlere göre haraket ettirelim!
1
public void autonomousPeriodic() {
2
if(konumX() == 0)
3
{
4
sagmotor1.set(0);
5
sagmotor2.set(0);
6
solmotor1.set(0);
7
solmotor2.set(0);
8
}
9
else if(konumX() < 285) // degerler 285'ten kucukse saga don
10
{
11
sagmotor1.set(0.5); // sag motorları calistir
12
sagmotor2.set(0.5);
13
}
14
else if (konumX() > 295) // degerler 295'ten buyukse sola don
15
{
16
solmotor1.set(0.5); //sol motorlari calistir
17
solmotor2.set(0.5);
18
}
19
20
}
Copied!
Kodların tamamına buradan ulaşabilirsiniz :
FRC-Vision-Processing/robot.java at master · enisgetmez/FRC-Vision-Processing
GitHub
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.
Last modified 2yr ago