Verwenden eines Fischauges auf einem Raspberry Pi 3 mit ROS - Teil 2

Guten Tag liebe Leser von Habr! Dies ist der zweite Teil der Geschichte über die Verwendung der Fischaugen-Kamera auf dem Raspberry Pi 3. Der erste Teil ist hier zu finden. In diesem Artikel werde ich über das Kalibrieren einer Fischaugen-Kamera und das Verwenden der Kamera zum Erkennen von Objekten mithilfe des Pakets find_object_2d sprechen. Wen kümmert es bitte unter der Katze.

Kalibrieren Sie eine Fischaugen-Kamera mit camera_calibration


Hier beschreibe ich das Kalibrierungsverfahren anhand des offiziellen Handbuchs auf dem ros.org-Portal.

Für die Kalibrierung benötigen wir das Kamerakalibrierungspaket. Wir können es mit apt installieren:

sudo apt-get install ros-kinetic-camera-calibration 

Wir benötigen eine Schachbrettvorlage. Laden Sie die Vorlage aus dem offiziellen Handbuch auf ros.org herunter und drucken Sie sie aus. Der Einfachheit halber habe ich es auf eine Sperrholzplatte geklebt:

Bild

Lassen Sie uns das Kalibrierungsprogramm ausführen:

 rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam 

Wir werden ein Bild bekommen:

Bild

Bewegen Sie die Vorlage ein wenig und warten Sie, bis die Vorlage im Rahmen ausgewählt ist (farbige Linien mit Punkten erscheinen nicht auf der Vorlage).

Bild

Bild

Bewegen Sie die Vorlage etwas weiter zur Seite. Um die Kalibrierung erfolgreich durchzuführen, müssen wir eine Reihe von Bewegungen der Schablone vor der Kamera von einer Seite zur anderen ausführen, damit die Schablone in alle Winkelpositionen im Sichtfeld der Kamera fällt (links, rechts, oben und unten). Rechts neben dem Kamerabildfenster im Programmfenster befindet sich das Registrierungsfeld mit drei Fortschrittsbalken:

  • X erfasst die Bewegung des Musters in der linken / rechten Richtung (horizontal) im Sichtfeld der Kamera
  • Y erfasst die Bewegung des Musters in Aufwärts- / Abwärtsrichtung (horizontal) im Sichtfeld der Kamera
  • Die Größe erfasst die Annäherung / Entfernung der Vorlage von der Kamera und die Neigung in Bezug auf die Kamera.
  • Die Neigung korrigiert die Neigung der Schablone nach links, rechts, oben und unten (Abschrägung).

Für eine erfolgreiche Kalibrierung ist es daher wichtig, dass die Vorlage in verschiedenen Ecken des Rahmens angezeigt wird, den gesamten Rahmen einnimmt und auch nach links, rechts, oben und unten geneigt ist.

Das Kalibrieren einer Fischaugen-Kamera auf Ihrem Raspberry Pi kann eine Weile dauern. Seien Sie also geduldig. Mein Kalibrierungsvorgang dauerte 20 Minuten.

Wenn die Kalibrierung abgeschlossen ist, sollte die Schaltfläche Kalibrieren aktiviert sein (farblich hervorgehoben):

Bild

Wir können die Kalibrierungsergebnisse auch im Terminal sehen:

Bild

Wenn Sie mit dem Ergebnis zufrieden sind, drücken Sie die COMMIT-Taste. Das Programmfenster wird geschlossen und im Terminal wird die Meldung "Schreiben von Kalibrierungsdaten in ..." angezeigt.

Überprüfen Sie, ob die angegebene Datei erstellt wurde:

 ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml 

Kalibrierung abgeschlossen. Jetzt können die erhaltenen Kalibrierungsdaten in visuellen Lokalisierungs- und SLAM-Algorithmen in ROS verwendet werden.

Erkennen von Objekten mit find_object_2d


Die Installation des Pakets ist recht einfach. Installieren Sie es aus dem apt-Repository in Ubuntu 16.04 für ROS Kinetic:

 sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash 

Führen Sie ROS master und rqt_image_view aus:

 roscore roslaunch usb_cam usb_cam-test.launch 

Starten Sie den Detektorknoten mit dem folgenden Befehl:

 rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw 

Das Fenster des Erkennungsprogramms wird geöffnet:

Bild

Hier sehen wir den Strom von der Kamera und das Ergebnis der Erkennung charakteristischer Merkmale auf Objekten.
Zunächst werden wir in unseren Einrichtungen Detektorschulungen durchführen. Stellen Sie das erste Objekt vor die Kamera:

Bild

Klicken Sie mit der rechten Maustaste auf das linke Feld der Objekte im Fenster, und die Option Objekte aus Szene hinzufügen wird geöffnet. Wählen Sie diese Option und das Fenster zum Hinzufügen eines Objekts wird geöffnet:

Bild

Nachdem Sie die beste Position für das Objekt ausgewählt haben, klicken Sie auf die Schaltfläche Bild aufnehmen, um ein Bild des Objekts aufzunehmen:

Bild

Wir müssen das Objekt im Bild auswählen. Verwenden Sie den Mauszeiger, um das Objekt auszuwählen:

Bild

Klicken Sie auf die Schaltfläche Weiter, um das Objekt im Bild auszuschneiden und mit dem nächsten Schritt fortzufahren. Nach dem Zuschneiden des Bildes erhalten wir die Gesamtzahl der am Objekt erkannten charakteristischen Merkmale. Es bleibt nur die Taste Ende zu drücken, um das Objekt zur Datenbank der trainierten Detektorobjekte hinzuzufügen. Hier sehen wir den letzten Schritt der Prozedur zum Hinzufügen eines Objekts:

Bild

Als Ergebnis haben wir den Detektor auf ein Objekt trainiert. Jetzt können Sie versuchen, das Objekt in der Szene zu erkennen:

Bild

Zeichnen wir die Position des erkannten Objekts zum Terminal:

 rosrun find_object_2d print_objects_detected 

Die Ausgabe sieht folgendermaßen aus:

 Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) --- 

Lassen Sie uns die Themen auflisten:

 rostopic list 

In der Liste wurden zwei neue Themen angezeigt: / Objekte und / ObjekteStempel.

Wir zeigen Informationen zu den erkannten Objekten an:

 rostopic echo /objects 

 layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] --- 

Hier repräsentieren der zweite und dritte Wert (266.0, 177.0) die Breite und Höhe des Objekts. Alle anderen Werte im Datenfeld stellen eine 3x3-Homografiematrix dar (zur Berechnung der Position und Ausrichtung des Objekts sowie der Skalierungs- und Verschiebungswerte).

Wie Beobachtungen zeigen, erkennt find_object_2d Objekte mit einer schwachen Textur oder ohne Textur (texturlos) nur schlecht. Außerdem ist der Detektor unwirksam, wenn ein Objekt in einem großen Winkel zum Objekt (wenn wir das Objekt von der Seite betrachten) oder in großer Entfernung vom Objekt erfasst wird.

Bild

Nach Abschluss der Arbeit mit dem Detektor bietet find_object_2d an, die hinzugefügten Objekte auf der Festplatte zu speichern.

Das ist alles für jetzt. Viel Glück an alle und bis bald!

Source: https://habr.com/ru/post/de429894/


All Articles