Inhaltsverzeichnis:

Gesture Hawk: Handgestengesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle - Gunook
Gesture Hawk: Handgestengesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle - Gunook

Video: Gesture Hawk: Handgestengesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle - Gunook

Video: Gesture Hawk: Handgestengesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle - Gunook
Video: Top 50 Christmas Toy 2015 - WowWee MiP Robot Review 2024, November
Anonim
Gesture Hawk: Handgesten-gesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle
Gesture Hawk: Handgesten-gesteuerter Roboter mit bildverarbeitungsbasierter Schnittstelle

Gesture Hawk wurde in TechEvince 4.0 als einfache bildverarbeitungsbasierte Mensch-Maschine-Schnittstelle vorgestellt. Sein Nutzen liegt darin, dass keine zusätzlichen Sensoren oder Wearables außer einem Handschuh erforderlich sind, um das Roboterauto zu steuern, das nach dem Differentialantriebsprinzip fährt. In diesem anweisbaren führen wir Sie durch das Arbeitsprinzip der Objektverfolgung und Gestenerkennung, die im System verwendet werden. Der Quellcode dieses Projekts kann von Github über den Link heruntergeladen werden:

Schritt 1: ERFORDERLICHE DINGE:

ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
ERFORDERLICHE DINGE
  1. L298N Motortreiber
  2. Gleichstrommotoren
  3. Fahrgestell von Roboterautos
  4. Arduino Uno
  5. LiPo-Akkus
  6. Arduino USB-Kabel (lang)
  7. OpenCV-Bibliothek mit Python

Schritt 2: FUNKTIONSPRINZIP:

ARBEITSPRINZIP
ARBEITSPRINZIP

Gesture Hawk ist ein dreiphasiges Verarbeitungssystem, wie Sie im obigen Diagramm sehen können.

Schritt 3: EINGANGSAUFNAHME UND VERARBEITUNG:

EINGANGS-ERFASSUNG UND -VERARBEITUNG
EINGANGS-ERFASSUNG UND -VERARBEITUNG

Die Eingabeerfassung kann in den breiteren Kategorien im obigen Diagramm verstanden werden.

Um die Handform aus der Umgebung zu extrahieren, müssen wir eine Maskierung oder Filterung einer bestimmten Farbe (in diesem Fall – Violettblau) verwenden. Dazu müssen Sie das Bild vom BGR- in das HSV-Format konvertieren, was mit dem folgenden Code-Snippet möglich ist.

hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)

Der nächste Schritt besteht nun darin, den gewünschten Bereich von HSV-Parametern zu finden, um die Hand über Maske oder Filter zu extrahieren. Verwenden Sie dazu am besten Trackbars, um einen geeigneten Bereich zu finden. Hier ist der Screenshot einer für dieses Projekt verwendeten Spurleiste.

Schritt 4:

Bild
Bild

Schritt 5:

Hier ist unten ein Code-Snippet, um eine solche Trackbar für den Maskenbau zu erstellen:

CV2 importieren

import numpy as npdef nichts(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, nichts) cv2.createTrackbar('l_S ', 'image', 50, 255, nichts) cv2.createTrackbar('l_V', 'image', 50, 255, nichts) cv2.createTrackbar('h_H', 'image', 130, 255, nichts) cv2. createTrackbar('h_S', 'image', 255, 255, nichts) cv2.createTrackbar('h_V', 'image', 255, 255, nichts) while(1): _, frame = img.read()

hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbarPos('l_V', 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') lower_R = np. array([lH, lS, lV]) höher_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, niedriger_R, höher_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF if k == 27: break cv2.destroyAllWindows()

Schritt 6: VERARBEITUNGSTEIL:

VERARBEITUNGSTEIL
VERARBEITUNGSTEIL

Nun, wir haben die geometrische Form einer Hand, jetzt ist es an der Zeit, sie auszunutzen und sie zu verwenden, um die Handgeste herauszufinden.

Konvexer Rumpf:

Durch die konvexe Hülle versuchen wir, ein ungefähres Polygon über in der Form vorhandene Extrempunkte anzupassen. Das links abgebildete Bild zeigt das ungefähre Polygon, das der Form mit den rot markierten konvexen Punkten zugewiesen wurde.

Konvexe Punkte sind die Punkte in der Form, die am weitesten von einer Seite dieses angenäherten Polygons entfernt sind. Das Problem mit der konvexen Hülle besteht jedoch darin, dass wir während ihrer Berechnung ein Array aller konvexen Punkte erhalten, aber was wir brauchen, ist der blau spitze konvexe Punkt. Wir sagen Ihnen, warum es erforderlich ist.

Um diesen konvexen Punkt zu finden, müssen wir die Formel für den senkrechten Abstand anwenden, um den Abstand des konvexen Punkts zur nächsten Seite zu ermitteln. Wir haben beobachtet, dass der blau spitze Punkt den maximalen Abstand von der Seite besitzt und so erhalten wir diesen Punkt.

Schritt 7:

Bild
Bild

Schritt 8:

Bild
Bild

Als nächstes müssen wir die Neigung der Linie finden, die die Daumenspitze (oder den Extrempunkt) mit diesem konvexen Punkt mit der Horizontalen verbindet.

Schritt 9:

Bild
Bild

Im obigen Fall sollte der Winkel α zwischen 0 und 90 Grad liegen, wenn die Geste für das Linksabbiegen bestimmt ist. Das heißt, tan(α) sollte positiv sein.

Schritt 10:

Bild
Bild

Im obigen Fall sollte der Winkel α zwischen 180 und 90 Grad liegen, wenn die Geste für das Rechtsabbiegen bestimmt ist. Das heißt, tan(α) sollte negativ sein.

Wenn Tan α positiv ist, dann links abbiegen. Wenn Tan α negativ ist, dann rechts abbiegen. Jetzt ist es an der Zeit zu sehen, wie Sie den wichtigsten Stoppbefehl erkennen.

Hier wird ein bestimmtes Verhältnis (durch Treffer und Versuch gefunden) untersucht und in maximalen Fällen bleibt dieses Verhältnis der Entfernungen in diesem bestimmten Bereich.

Schritt 11:

Bild
Bild

Zuletzt wird die Vorwärtsbewegungsgeste von der matchShape()-Funktion in OpenCV analysiert. Diese Funktion vergleicht die Form zweier Zähler, in diesem Fall zwischen dem Trainingsbeispiel rechts im obigen Bild mit der Kontur auf der linken Seite des obigen Bildes. Es gibt einen Wert im Bereich von 0 bis 2 oder 3 zurück, je nach vorhandener Variation in Form von zwei Konturen. Bei identischer Kontur wird 0 zurückgegeben.

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

Hier sind cn1 und cnt2 die beiden zu vergleichenden Konturen.

Schritt 12: BEWEGUNGSKONTROLLE:

BEWEGUNGSKONTROLLE
BEWEGUNGSKONTROLLE

PySerial:

Wir haben die PySerial-Bibliothek von Python verwendet, um die verarbeiteten Daten in serielle Daten umzuwandeln, die über das Arduino-USB-Kabel an Arduino Uno übermittelt werden. Sobald eine bestimmte Geste von opencv erkannt wurde, haben wir eine temporäre Variable erstellt, sagen "x", und ihr einen eindeutigen Wert zugewiesen und sie mit der folgenden Befehlszeile in eine serielle Eingabe umgewandelt:

import serial #um die Pyserial-Bibliothek zu importieren

serial. Serial('', baudrate = '9600', timeout = '0') # Einrichten der seriellen Ausgabe.. PORT NAME ist der Name des Ports, über den die Datenübertragung erfolgt.

serial.write(b'x') # x ist das an den Port gesendete Alphabet …b soll diesen String in Bytes umwandeln.

Arduino-Verarbeitung:

Jetzt ist Arduino so codiert, dass jedes unterschiedliche serielle x linear auf eine bestimmte Aktion abgebildet wird, die für eine reibungslose Bewegung des Roboters verantwortlich ist (z. B. die Erkennung einer linken Geste löst die Motoren rechts aus, um nach links abzubiegen). Wir können die Bewegung jedes Rades sowohl translatorisch als auch rotatorisch steuern, indem wir den Code richtig ändern.

L298N Motortreiber:-

Motortreiber wird als Vermittler zwischen Motor und Stromquelle verwendet, da Motoren aufgrund niedriger Nennspannungen nicht direkt mit Strom versorgt werden können. Die Li-Po-Batterie ist an ihren 12-V-Eingangsanschluss angeschlossen und wir verbinden die 5-V-Buchse von Arduino mit der 5-V-Eingangsbuchse des Motortreibers und verbinden schließlich die Masse von Li-Po sowie arduino in einer gemeinsamen Massebuchse des Motortreibers.

Nun werden die Klemmen der Motoren an den vorgegebenen Buchsen angeschlossen. Schließlich verbinden wir Eingangsklemmen für den Motor mit PWM-Ausgangsbuchsen von Arduino, damit wir die Rotations- und Translationsaspekte der Bewegung genau bestimmen können.

Empfohlen: