Erfassung der 3D-Punktgruppe mit Pepper of Softbank (Choregraphe, Python)

01.03.2015 Aldebaran Atelier Akihabara Pfefferentwicklung Touch & Try Rekord

Mit der 3D-Kamera (Xtions Tiefensensor), die Peppers Auge ist, habe ich eine Box erstellt, um eine Gruppe von 3D-Punkten zu erfassen. Referenzartikel: Thorikawas [Pepper-Kun-Punktwolke](http://qiita.com/thorikawa/items/a625b4766dcd283b783b#pcd%E3%83%95%E3%82%A1%E3%82%A4%E3% 83% AB% E3% 81% AE% E5% 87% BA% E5% 8A% 9B)

Erstellen Sie eine getPointCloud-Box

Starten Sie Choregraphe 2.1.2 und erstellen Sie eine Box für Ihr Python-Skript. Klicken Sie mit der rechten Maustaste → Neue Box → Python-Skript oder Box-Bibliotheksstandard → Vorlagen → Python-Skript. p1.png

Geben Sie den Namen und den Umriss des Felds ein und klicken Sie auf OK. p2.png

Klicken Sie mit der rechten Maustaste auf das Feld und bearbeiten Sie das Python-Skript. p3.png

Definieren Sie die Funktion getPointCloud wie folgt:

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def getPointCloud(self):
        import argparse
        import Image
        import time

        # Camera parameters (only tested on Pepper)
        # Focal length
        FX = 525.0 / 2
        FY = 525.0 / 2
        # Optical center
        CX = 319.5 / 2
        CY = 239.5 / 2

        # millimeter to meter
        UNIT_SCALING = 0.001

        NAME = "depth_camera"
        CAMERA_ID = 2 # depth
        RESOLUTION = 1 # 320*240
        FRAMERATE = 15
        COLOR_SPACE = 17 # mono16 Note: this is not documented as of Dec 14, 2014

        video = ALProxy('ALVideoDevice')
        client = video.subscribeCamera(NAME, CAMERA_ID, RESOLUTION, COLOR_SPACE, FRAMERATE)

        try:
            image = video.getImageRemote(client)

            if image is None:
                print 'Cannot obtain depth image.'
                exit()

            width = image[0]
            height = image[1]
            array = image[6]
            
            cloud = []
            for v in range(height):
                for u in range(width):
                    offset = (v * width + u) * 2
                    depth = ord(array[offset]) + ord(array[offset+1]) * 256
                    x = (u - CX) * depth * UNIT_SCALING / FX
                    y = (v - CY) * depth * UNIT_SCALING / FY
                    z = depth * UNIT_SCALING
                    cloud.append((x, y, z))
        finally:
            video.unsubscribe(client)

        fileName = '/home/nao/recordings/cameras/cloud%f.ply' % time.time()

        f = open(fileName, 'w')
        num = len(cloud)
        header = '''ply
 format ascii 1.0
 comment Pepper 3D generated
 element vertex %d
 property float x
 property float y
 property float z
end_header
'''

        f.write(header % (width*height))
        f.write("\n")
        for c in cloud:
            f.write('%f %f %f' % (c[0], c[1], c[2]))
            f.write("\n")
        f.close()
        pass

    def onInput_onStart(self):
        #self.onStopped() #activate the output of the box
        self.getPointCloud()
        pass

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

Lauf

Zum Roboter hochladen und spielen (F5), Speichern Sie die 3D-Punktgruppe im Schichtformat lokal in Pepper.

Der durch die Leitung verbundene wird zuerst ausgeführt. p4.PNG

Auch wenn es nicht durch eine Leitung verbunden ist, können Sie es nach dem Hochladen auf den Roboter selbst ausführen, indem Sie auf die Eingabe (Wiedergabetaste) klicken. p5.PNG

Punktgruppendatei herunterladen

Klicken Sie in der Menüleiste auf Verbinden → Erweitert → Datei übertragen ID:nao Password:nao Sie können Peppers lokalen Ordner mit sehen.

Die Punktgruppendatei wird in Aufzeichnungen / Kameras / gespeichert. Laden Sie sie herunter. c1.png

c2.png

c3.png

c4.png

Anzeige der Punktgruppe

Wenn Sie es mit Meshlab öffnen, sehen Sie die 3D-Punktgruppe. p7.PNG

Zusammenfassung

Mit der 3D-Kamera von Pepper konnte ich die 3D-Punktgruppe mit Ply speichern, lokal herunterladen und mit Meshlab anzeigen. Als nächstes möchte ich SLAM durchführen, das die Rohdaten von Depth (16 Bit, PNG-Bild) verwendet, um eine Karte zu erstellen und gleichzeitig die Selbstposition zu schätzen. Erstellen Sie einen Datensatz mit Kilometerzähler (Beschleunigung), RGB (Farbe) und Tiefe (Tiefe), wenn Sie auf der Zielspur fahren (move_traj.pmt).

Ergänzung

SLAM wird verwendet, wenn Sie den Roboter in einer bestimmten Flugbahn autonom bewegen möchten oder wenn Sie die Fahrumgebung verstehen möchten. Es ist genauer und zuverlässiger als interne Sensoren wie Encoder und Beschleunigungssensoren.

Die 3D-Kamera kann auch zur Ebenenextraktion, Objekterkennung, Gesichtserkennung usw. verwendet werden. Da Pepper über zwei 2D-Kameras (RGB-Kameras) verfügt, können Sie eine Punktgruppe erhalten, wenn Sie eine Stereokamera verwenden (Gibt es nur einen Teil, der häufig aussieht? W), und eine Punktgruppe, die von einer 3D-Kamera abgerufen werden kann. Sie können es auch ausmalen.

Recommended Posts

Erfassung der 3D-Punktgruppe mit Pepper of Softbank (Choregraphe, Python)
Punktwolke mit Pfeffer
[Python --open3d] So konvertieren Sie 3D-Modellobjektdaten in Punktwolken
[Python] Grenzachse des 3D-Graphen mit Matplotlib
Löse A ~ D des Yuki-Codierers 247 mit Python
Erstellen Sie ein 3D-GIF mit Python3
Python> Umgang mit 2D-Arrays
Debuggen mit dem PEPPER Python Interpreter
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython
Visualisieren Sie die Häufigkeit von Wortvorkommen in Sätzen mit Word Cloud. [Python]
[Paketwolke] Verwalten Sie Python-Pakete mit der Paketwolke
Dreidimensionale Skelettstrukturanalyse mit Python
Löse ABC166 A ~ D mit Python
Erste Schritte mit Python Grundlagen von Python
Führen Sie XGBoost mit Cloud Dataflow (Python) aus.
Lebensspiel mit Python! (Conways Spiel des Lebens)
10 Funktionen von "Sprache mit Batterie" Python
Implementierung der Dyxtra-Methode durch Python
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Grundlegendes Studium von OpenCV mit Python
python + faker Generiere zufällig einen Punkt mit einem Radius von 100 m von einem bestimmten Punkt
Grundlagen der binärisierten Bildverarbeitung durch Python
[Beispiel für eine Python-Verbesserung] Python mit Codecademy lernen
Führen Sie das Python-Skript mit TS-220 cron aus
Überprüfen Sie die Existenz der Datei mit Python
2D FEM Stressanalyseprogramm von Python
Verstopft mit Python-Update der GCP-Konsole ①
Einfache Einführung der Spracherkennung mit Python
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Beispiel einer dreidimensionalen Skelettanalyse von Python
Bildanpassung und Punktgruppenausrichtung mit PatchMatch
Bildaufnahme von der Kamera mit Python + OpenCV
[GCP] Betreiben Sie Google Cloud Storage mit Python
UnicodeEncodeError hat Probleme mit der Standardausgabe von Python3
Löse AtCoder ABC168 mit Python (A ~ D)
1. Mit Python 1-3 gelernte Statistiken. Berechnung verschiedener Statistiken (Statistiken)
Visualisieren Sie Punkt P, der mit Python funktioniert
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Empfehlung von Altair! Datenvisualisierung mit Python
Text Mining mit Python ② Visualisierung mit Word Cloud
Stellen Sie mit dem Python-Interpreter von PEPPER Mac eine Verbindung zu Pfeffer her
Vergleich der Matrixtranspositionsgeschwindigkeit durch Python
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, (C), D-Probleme von ABC165 mit Python!
[AtCoder-Erklärung] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC183 mit Python!
Lösen mit Ruby und Python AtCoder ABC084 D Kumulative Summe der Primzahlen
[Überprüfung] Versuchen Sie, die Punktgruppe an der Optimierungsfunktion von Pytorch Part 1 auszurichten
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC181 mit Python!