İçindekiler:

Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot: 13 Adım (Resimlerle)
Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot: 13 Adım (Resimlerle)

Video: Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot: 13 Adım (Resimlerle)

Video: Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot: 13 Adım (Resimlerle)
Video: Amazing arduino project 2024, Kasım
Anonim
Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot
Gesture Hawk: Görüntü İşleme Tabanlı Arayüz Kullanan El Hareketi Kontrollü Robot

Gesture Hawk, TechEvince 4.0'da basit bir görüntü işleme tabanlı insan-makine arayüzü olarak sergilendi. Faydası, diferansiyel tahrik prensibi ile çalışan robotik arabayı kontrol etmek için bir eldiven dışında hiçbir ek sensör veya giyilebilir cihaz gerekmemesi gerçeğinde yatmaktadır. Bu talimatta, sistemde kullanılan nesne izleme ve hareket algılamanın ardındaki çalışma prensibini ele alacağız. Bu projenin kaynak kodu Github'dan şu linkten indirilebilir:

Adım 1: GEREKLİ ŞEYLER:

GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
GEREKLİ ŞEYLER
  1. L298N Motor Sürücüsü
  2. DC Motorlar
  3. Robot araba şasisi
  4. Arduino Uno'su
  5. LiPo Piller
  6. Arduino USB Kablosu(uzun)
  7. Python ile OpenCV Kütüphanesi

Adım 2: ÇALIŞMA PRENSİBİ:

ÇALIŞMA PRENSİBİ
ÇALIŞMA PRENSİBİ

Gesture Hawk, yukarıdaki şemada görebileceğiniz gibi üç fazlı bir işleme sistemidir.

Adım 3: GİRİŞ YAKALAMA VE İŞLEME:

GİRDİ YAKALAMA VE İŞLEME
GİRDİ YAKALAMA VE İŞLEME

Giriş yakalama, yukarıdaki şemada verilen daha geniş kategorilerde anlaşılabilir.

El şeklini ortamdan çıkarmak için, belirli bir rengin (bu durumda - menekşe mavisi) maskeleme veya filtreleme kullanmamız gerekir. Bunu yapmak için aşağıdaki kod parçacığını kullanarak görüntüyü BGR'den HSV formatına dönüştürmeniz gerekir.

hsv = cv2.cvtColor(çerçeve, cv2. COLOR_BGR2HSV)

Şimdi, bir sonraki adım, eli maske veya filtre yoluyla çıkarmak için istenen HSV parametre aralığını bulmaktır. Bunun için en iyi yol, uygun bir menzil bulmak için iz çubuklarını kullanmaktır. İşte bu proje için kullanılan bir izleme çubuğunun ekran görüntüsü.

4. Adım:

resim
resim

Adım 5:

Burada, maske yapımı için böyle bir izleme çubuğu yapmak için aşağıda verilen bir kod parçası var:

cv2'yi içe aktar

numpy'yi npdef hiçbir şey(x) olarak içe aktar: cv2.namedWindow('image') ilet img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, hiçbir şey) cv2.createTrackbar('l_S) ', 'image', 50, 255, hiçbir şey) cv2.createTrackbar('l_V', 'image', 50, 255, hiçbir şey) cv2.createTrackbar('h_H', 'image', 130, 255, hiçbir şey) cv2. createTrackbar('h_S', 'image', 255, 255, hiçbir şey) cv2.createTrackbar('h_V', 'image', 255, 255, hiçbir şey) while(1): _, çerçeve = img.read()

hsv = cv2.cvtColor(çerçeve, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbarPos('l_H', 'image') 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') low_R = np. dizi([lH, lS, lV]) high_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, low_R, high_R) res = cv2.bitwise_and(çerçeve, çerçeve, maske= maske) cv2.imshow('image', res) k = cv2.waitKey(1) & k == 27 ise 0xFF: break cv2.destroyAllWindows()

Adım 6: İŞLEME BÖLÜMÜ:

İŞLEME BÖLÜMÜ
İŞLEME BÖLÜMÜ

Bir elin geometrik şekline sahibiz, şimdi onu kullanmanın ve el hareketini anlamak için kullanmanın zamanı geldi.

Dışbükey örtü:

Dışbükey gövde sayesinde, şekilde mevcut olan uç noktalar aracılığıyla yaklaşık bir çokgen sığdırmaya çalışıyoruz. Soldaki resim, kırmızı ile işaretlenmiş dışbükey noktalarla şekle atanmış yaklaşık çokgeni göstermektedir.

Dışbükey noktalar, bu yaklaşık poligonun bir tarafından en uzak olan şekildeki noktalardır. Ancak, dışbükey gövde ile ilgili sorun, hesaplaması sırasında tüm dışbükey noktaların bir dizisini alacağımızdır, ancak ihtiyacımız olan şey mavi sivri dışbükey noktadır. Neden gerekli olduğunu size söyleyeceğiz.

Bu dışbükey noktayı bulmak için, dışbükey noktanın en yakın kenara olan uzaklığını bulmak için dik uzaklık formülünü uygulamamız gerekir. Mavi noktanın yandan maksimum uzaklığa sahip olduğunu gözlemledik ve bu noktayı elde ettik.

7. Adım:

resim
resim

Adım 8:

resim
resim

Ardından, başparmağın ucunu (veya en uç noktayı) bu dışbükey noktaya yatayla birleştiren çizginin eğimini bulmamız gerekiyor.

9. Adım:

resim
resim

Yukarıdaki durumda, hareket sola dönüş içinse α açısı 0 ila 90 derece arasında olmalıdır. Yani tan(α) pozitif olmalıdır.

Adım 10:

resim
resim

Yukarıdaki durumda, hareket sağa dönüş içinse α açısı 180 ila 90 derece arasında olmalıdır. Yani tan(α) negatif olmalıdır.

Bu nedenle, Tan α pozitifse, Sola dönün. Tan α negatifse, Sağa dönün. Şimdi, en önemli durdurma komutunun nasıl tespit edileceğini görme zamanı.

Burada belirli bir oran (isabet ve deneme ile bulunan) incelenir ve maksimum durumlarda bu mesafe oranı bu belirli aralıkta kalır.

Adım 11:

resim
resim

Son olarak, ileriye doğru hareket hareketi OpenCV'deki matchShape() işlevi tarafından analiz edilir. Bu fonksiyon, bu durumda, yukarıdaki resimde sağdaki eğitim örneği ile yukarıdaki görüntünün sol tarafındaki kontur arasında iki sayacın şeklini karşılaştırır. İki kontur şeklindeki mevcut varyasyona göre 0 ile 2 veya 3 arasında bir değer döndürür. Aynı kontur için 0 döndürür.

ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)

Burada cn1 ve cnt2 karşılaştırılacak iki konturdur.

Adım 12: HAREKET KONTROLÜ:

HAREKET KONTROLÜ
HAREKET KONTROLÜ

PySerial:

İşlenen verileri Arduino USB Kablosu ile Arduino Uno'ya iletmek üzere seri verilere dönüştürmek için python'un PySerial kütüphanesini kullandık. opencv tarafından belirli bir hareket algılandığında, 'x' diyen geçici bir değişken oluşturduk ve buna benzersiz bir değer atadık ve aşağıdaki komut satırını kullanarak onu seri girişe dönüştürdük: -

Pyserial kitaplığını içe aktarmak için seriyi içe aktar

serial. Serial('', baudrate = '9600', timeout = '0') # seri çıkışın ayarlanması.. PORT ADI, veri iletiminin gerçekleşeceği portun adıdır.

serial.write(b'x') # x bağlantı noktasına gönderilen alfabedir …b bu dizgiyi baytlara dönüştürmektir.

Arduino İşleme:

Şimdi arduino, her bir farklı seri x'in robotun düzgün hareketinden sorumlu belirli bir eyleme doğrusal olarak eşleneceği şekilde kodlanmıştır (diyelim ki sol hareketin algılanması, sağdaki motorları sola çevirmek için tetikleyecektir). Kodu doğru bir şekilde değiştirerek her bir tekerleğin hareketini hem öteleme hem de dönme yönünde kontrol edebiliriz.

L298N Motor sürücüsü:-

Motor Sürücüsü, düşük voltaj değerleri nedeniyle motorlara doğrudan güç verilemediğinden motor ve güç kaynağı arasında aracı olarak kullanılır. Li-Po Batarya, 12V giriş terminaline bağlanır ve arduino'nun 5V soketini motor sürücüsünün 5V giriş soketine bağlarız, son olarak Li-Po'nun yanı sıra arduino'yu motor sürücüsünün ortak bir toprak soketine bağlarız.

Artık motorların klemensleri verilen soketlere bağlanmıştır. Son olarak, motor için giriş terminallerini arduino'nun PWM çıkış soketlerine bağlayarak, hareketin dönme ve öteleme yönlerine doğru bir şekilde karar vermemizi sağladık.

Önerilen: