Inhaltsverzeichnis:

Jetson Nano Quadruped Robot Object Detection Tutorial - Gunook
Jetson Nano Quadruped Robot Object Detection Tutorial - Gunook

Video: Jetson Nano Quadruped Robot Object Detection Tutorial - Gunook

Video: Jetson Nano Quadruped Robot Object Detection Tutorial - Gunook
Video: Jetson Nano Quadruped Robot | Object Detection & Teleoperation 2024, November
Anonim
Image
Image

Nvidia Jetson Nano ist ein Entwicklerkit, das aus einem SoM (System on Module) und einem Referenzträgerboard besteht. Es ist in erster Linie darauf ausgerichtet, eingebettete Systeme zu erstellen, die eine hohe Rechenleistung für maschinelles Lernen, maschinelles Sehen und Videoverarbeitungsanwendungen benötigen. Eine ausführliche Rezension dazu könnt ihr euch auf meinem YouTube-Kanal anschauen.

Nvidia hat versucht, Jetson Nano so benutzerfreundlich und einfach wie möglich zu gestalten. Sie haben sogar einen kleinen Kurs darüber gestartet, wie Sie Ihren Roboter mit Jetson Nano bauen, Tage nach der Einführung des Boards. Details zu diesem Projekt finden Sie hier.

Allerdings hatte ich selbst ein paar Probleme mit dem Jetbot als Projekt:

1) Es war mir nicht EPIC genug. Jetson Nano ist ein sehr interessantes Board mit großartigen Verarbeitungsmöglichkeiten und einen einfachen Roboter mit Rädern daraus zu machen, schien einfach eine sehr … enttäuschende Sache zu sein.

2) Die Hardware-Auswahl. Jetbot erfordert einige Hardware, die teuer ist / durch andere Alternativen ersetzt werden kann - zum Beispiel verwenden sie Joystick für die Teleoperation. Klingt nach Spaß, aber brauche ich wirklich einen Joystick, um einen Roboter zu steuern?

Sofort nachdem ich Jetson Nano in die Finger bekommen hatte, begann ich mit der Arbeit an meinem eigenen Projekt, einem Jetspider. Die Idee war, grundlegende Demos zu replizieren, die Jetbot hatte, jedoch mit gängigerer Hardware und auf eine größere Vielfalt von Projekten anwendbar.

Schritt 1: Bereiten Sie Ihre Hardware vor

Bereiten Sie Ihre Hardware vor
Bereiten Sie Ihre Hardware vor

Für dieses Projekt habe ich einen frühen Prototyp des Zuri-Vierbeinroboters verwendet, der von Zoobotics hergestellt wurde. Es lag lange Zeit im Labor unserer Firma herum. Ich habe es mit einer lasergeschnittenen Holzhalterung für Jetson Nano und einer Kamerahalterung ausgestattet. Ihr Design ist proprietär. Wenn Sie also für Ihren Jetson Nano-Roboter etwas Ähnliches erstellen möchten, können Sie sich das Meped-Projekt ansehen, das ein ähnlicher Vierbeiner mit einem Open-Source-Design ist. Da niemand den Quellcode für Zuris Mikrocontroller (Arduino Mega) in unserem Labor hatte, habe ich den Code von Meped mit einigen geringfügigen Anpassungen im Bein-/Fußversatz verwendet.

Ich habe eine normale USB Raspberry Pi-kompatible Webcam und einen Wifi-USB-Dongle verwendet.

Der Hauptpunkt ist, dass Ihr System, da wir Pyserial für die serielle Kommunikation zwischen Mikrocontroller und Jetson Nano verwenden werden, im Wesentlichen jede Art von Mikrocontroller verwenden kann, solange es über ein serielles USB-Kabel mit Jetson Nano verbunden werden kann. Wenn Ihr Roboter Gleichstrommotoren und einen Motortreiber (zum Beispiel L298P-basiert) verwendet, ist es möglich, den Motortreiber direkt mit Jetson Nano GPIO zu verbinden. Aber leider können Sie zur Steuerung von Servos nur einen anderen Mikrocontroller oder einen dedizierten I2C-Servotreiber verwenden, da Jetson Nano kein Hardware-GPIO-PWM hat.

Zusammenfassend lässt sich sagen, dass Sie einen Robotertyp mit jedem Mikrocontroller verwenden können, der über ein USB-Datenkabel mit Jetson Nano verbunden werden kann. Ich habe den Code für Arduino Mega für dieses Tutorial in das Github-Repository hochgeladen und der Teil, der für die Anbindung von Jetson Nano an Arduino relevant ist, ist hier:

if(Serial.available()) {switch(Serial.read()) {

{

Fall 1':

nach vorne();

brechen;

Fall '2':

zurück();

brechen;

Fall '3':

Biegen Sie rechts ab();

brechen;

Fall '4':

Biegen Sie links ab();

brechen;

Wir prüfen, ob Daten verfügbar sind, und geben sie gegebenenfalls an die Schaltkasten-Kontrollstruktur weiter. Achten Sie darauf, dass Daten aus der Serie als Zeichen vorliegen, beachten Sie die einfachen Anführungszeichen um die Zahlen 1, 2, 3, 4.

Schritt 2: Installieren Sie die erforderlichen Pakete

Zum Glück für uns enthält das standardmäßige Jetson Nano-Systemabbild eine Menge vorinstallierter Dinge (wie OpenCV, TensorRT usw.), sodass wir nur ein paar andere Pakete installieren müssen, damit der Code funktioniert und SSH aktiviert wird.

Beginnen wir mit der Aktivierung von SSH, falls Sie den Rest der Arbeit aus der Ferne erledigen möchten.

sudo apt-Update

sudo apt install openssh-server

Der SSH-Server wird automatisch gestartet.

Um sich über LAN mit Ihrem Ubuntu-Rechner zu verbinden, müssen Sie nur den folgenden Befehl eingeben:

Wenn Sie einen Windows-Rechner haben, müssen Sie einen SSH-Client installieren, zum Beispiel Putty.

Beginnen wir mit der Installation von Python Package Manager (pip) und Pillow für die Bildbearbeitung.

sudo apt installieren python3-pip python3-pil

Dann installieren wir das Jetbot-Repository, da wir uns auf einige Teile seines Frameworks verlassen, um die Objekterkennung durchzuführen.

sudo apt installieren python3-smbus python-pyserial

git-Klon

CD-Jetbot

sudo apt-get install cmake

sudo python3 setup.py installieren

Klonen Sie schließlich mein Github-Repository für dieses Projekt in Ihren Home-Ordner und installieren Sie Flask und einige andere Pakete für die Fernbedienung des Roboters über den Webserver.

git-Klon

CD

sudo pip3 install -r anforderungen-opencv

Laden Sie das vortrainierte SSD-Modell (Single Shot Detector) von diesem Link herunter und legen Sie es im Ordner jetspider_demos ab.

Jetzt können wir loslegen!

Schritt 3: Führen Sie den Code aus

Führen Sie den Code aus
Führen Sie den Code aus

Ich habe zwei Demos für Jetspider gemacht, die erste ist eine einfache Teleopration, sehr ähnlich der, die ich zuvor für den Banana Pi Rover gemacht habe und die zweite verwendet TensorRT zur Objekterkennung und sendet die Bewegungsbefehle über die serielle Verbindung an den Mikrocontroller.

Da der größte Teil des Teleopration-Codes in meinem anderen Tutorial beschrieben ist (ich habe nur einige kleinere Optimierungen vorgenommen, die Videoübertragung angepasst), konzentriere ich mich hier auf den Teil der Objekterkennung.

Das Hauptskript für die Objektverfolgung ist object_following.py in jetspider_object_following, für Teleoperation ist spider_teleop.py in jetspider_teleoperation.

Das dem Objekt folgende Skript beginnt mit dem Importieren der erforderlichen Module und der Deklaration von Variablen und Klasseninstanzen. Dann starten wir den Flask-Webserver mit dieser Zeile

app.run(host='0.0.0.0', threaded=True)

Sobald wir die 0.0.0.0(localhost)-Adresse in unserem Webbrowser oder die Jetson Nano-Adresse im Netzwerk öffnen (kann mit dem Befehl ifconfig überprüfen), wird diese Funktion ausgeführt

def-index():

Es rendert die Webseitenvorlage, die wir im Vorlagenordner haben. Die Vorlage hat eine eingebettete Videoquelle, so dass nach dem Laden def video_feed(): ausgeführt wird, das ein Response-Objekt zurückgibt, das mit der Generatorfunktion initialisiert wird.

Das Geheimnis der Implementierung von In-Place-Updates (Aktualisierung des Bildes auf der Webseite für unseren Videostream) besteht darin, eine mehrteilige Antwort zu verwenden. Mehrteilige Antworten bestehen aus einem Header, der einen der mehrteiligen Inhaltstypen enthält, gefolgt von den Teilen, die durch eine Begrenzungsmarkierung getrennt sind und jeweils einen eigenen teilspezifischen Inhaltstyp aufweisen.

In der Funktion def gen(): implementieren wir die Generatorfunktion in einer Endlosschleife, die das Bild erfasst, an die Funktion def execute(img): sendet, wodurch ein Bild entsteht, das danach an die Webseite gesendet wird.

def execute(img): Funktion ist der Ort, an dem die ganze Magie passiert, sie nimmt ein Bild auf, ändert die Größe mit OpenCV und übergibt es an die Jetbot ObjectDetector-Klasseninstanz "model". Es gibt die Liste der Erkennungen zurück und wir verwenden OpenCV, um blaue Rechtecke um sie herum zu zeichnen und Anmerkungen mit der Objekterkennungsklasse zu schreiben. Danach prüfen wir, ob es ein Objekt von unserem Interesse gibt detectmatching_detections = [d for d in detections[0] if d['label'] == 53]

Sie können diese Nummer (53) in eine andere Nummer aus dem CoCo-Datensatz ändern, wenn Ihr Roboter anderen Objekten folgen soll, 53 ist ein Apfel. Die gesamte Liste befindet sich in der Datei Categories.py.

Wenn schließlich 5 Sekunden lang kein Objekt erkannt wird, senden wir das Zeichen "5" für den Roboter, um über die Serie anzuhalten. Wenn ein Objekt gefunden wird, berechnen wir, wie weit es vom Zentrum des Bildes entfernt ist und handeln entsprechend (wenn es nahe am Zentrum ist, gehen Sie geradeaus (Zeichen "1" in der Serie), wenn es links ist, gehen Sie nach links usw.). Sie können mit diesen Werten spielen, um das Beste für Ihr spezielles Setup zu bestimmen!

Schritt 4: Letzte Gedanken

Abschließende Gedanken
Abschließende Gedanken

Dies ist der Kern der ObjectFollowing-Demo. Wenn Sie mehr über Flask-Webserver-Videostreaming erfahren möchten, können Sie sich dieses großartige Tutorial von Miguel Grinberg ansehen.

Sie können sich hier auch das Notebook zur Nvidia Jetbot Object Detection ansehen.

Ich hoffe, dass meine Implementierungen von Jetbot-Demos dazu beitragen, Ihren Roboter mit dem Jetbot-Framework zu bauen. Ich habe keine Hindernisvermeidungs-Demo implementiert, da ich denke, dass die Wahl des Modells keine guten Ergebnisse zur Hindernisvermeidung liefert.

Fügen Sie mich auf LinkedId hinzu, wenn Sie Fragen haben, und abonnieren Sie meinen YouTube-Kanal, um über weitere interessante Projekte im Bereich Machine Learning und Robotik informiert zu werden.

Empfohlen: