Acquisition d'un groupe de points 3D avec Pepper de Softbank (Choregraphe, Python)

2015/03/01 Aldebaran Atelier Akihabara Pepper Development Touch & Try Record

À l'aide de la caméra 3D Pepper's eye (capteur de profondeur Xtion), j'ai créé une boîte pour acquérir un groupe de points 3D. Article de référence: Thorikawa's [Pepper-kun Point Cloud](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)

Créer une boîte getPointCloud

Lancez Choregraphe 2.1.2 et créez une boîte pour votre script Python. Cliquez avec le bouton droit de la souris → Nouvelle boîte → Script Python ou Standard de la bibliothèque de boîtes → Modèles → Script Python. p1.png

Entrez le nom et le contour de la boîte et appuyez sur le bouton OK. p2.png

Cliquez avec le bouton droit sur la boîte et modifiez le script Python. p3.png

Définissez la fonction getPointCloud comme suit:

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

Courir

Téléchargez sur le robot et jouez (F5), Enregistrez localement le groupe de points 3D au format pli dans Pepper.

Celui connecté par la ligne est exécuté en premier. p4.PNG

Même s'il n'est pas connecté par une ligne, après avoir été téléchargé sur le robot, vous pouvez l'exécuter par lui-même en cliquant sur l'entrée (bouton de lecture). p5.PNG

Télécharger le fichier de groupe de points

Dans la barre de menus, cliquez sur Connexion → Avancé → Transférer un fichier ID:nao Password:nao Vous pouvez voir le dossier local de Pepper avec.

Le fichier de groupe de points est enregistré dans les enregistrements / caméras /, alors téléchargeons-le. c1.png

c2.png

c3.png

c4.png

Affichage du groupe de points

Si vous l'ouvrez avec Meshlab, vous pouvez voir le groupe de points 3D. p7.PNG

Résumé

En utilisant la caméra 3D de Pepper, j'ai pu enregistrer le groupe de points 3D avec ply, le télécharger localement et l'afficher avec Meshlab. Ensuite, j'aimerais faire du SLAM qui utilise les données brutes de Depth (16 bits, image png) pour créer une carte et estimer la position personnelle en même temps. Créez un ensemble de données d'odométrie (accélération), RVB (couleur) et profondeur (profondeur) lorsque vous vous déplacez sur la piste cible (move_traj.pmt).

Supplément

SLAM est utilisé lorsque vous souhaitez déplacer le robot de manière autonome sur une certaine trajectoire ou lorsque vous souhaitez comprendre l'environnement de conduite. Il est plus précis et fiable que les capteurs internes tels que les encodeurs et les capteurs d'accélération.

La caméra 3D peut également être appliquée à l'extraction de plan, à la détection d'objet, à la reconnaissance faciale, etc. Puisque Pepper a deux caméras 2D (caméras RVB), vous pouvez obtenir un groupe de points si vous utilisez une caméra stéréo (n'y a-t-il qu'une partie qui semble commune? W) et un groupe de points pouvant être obtenu à partir d'une caméra 3D. Vous pouvez également le colorier.

Recommended Posts

Acquisition d'un groupe de points 3D avec Pepper de Softbank (Choregraphe, Python)
Nuage de points avec du poivre
[Python --open3d] Comment convertir des données d'obj de modèle 3D en nuage de points
[Python] axe limite du graphe 3D avec Matplotlib
Résolvez A ~ D du codeur yuki 247 avec python
Créer un gif 3D avec python3
python> Gestion des tableaux 2D
Déboguer avec l'interpréteur PEPPER python
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Visualisez la fréquence des occurrences de mots dans les phrases avec Word Cloud. [Python]
[Package cloud] Gérez les packages python avec le package cloud
Analyse de la structure du squelette en trois dimensions avec Python
Résoudre ABC166 A ~ D avec Python
Premiers pas avec Python Bases de Python
Exécutez XGBoost avec Cloud Dataflow (Python)
Jeu de vie avec Python! (Le jeu de la vie de Conway)
10 fonctions du "langage avec batterie" python
Implémentation de la méthode Dyxtra par python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Etude de base d'OpenCV avec Python
python + faker Générer aléatoirement un point avec un rayon de 100m à partir d'un certain point
Bases du traitement d'images binarisées par Python
[Exemple d'amélioration de Python] Apprentissage de Python avec Codecademy
Exécuter le script Python avec TS-220 cron
Vérifier l'existence du fichier avec python
Programme d'analyse des contraintes FEM 2D par Python
Obstrué par la mise à jour Python de la console GCP ①
Introduction facile de la reconnaissance vocale avec Python
Essayez d'utiliser Python avec Google Cloud Functions
Exemple d'analyse de squelette tridimensionnelle par Python
Correspondance d'images et alignement de groupes de points avec PatchMatch
Acquisition d'images depuis une caméra avec Python + OpenCV
[GCP] Exploitez Google Cloud Storage avec Python
UnicodeEncodeError lutte avec la sortie standard de python3
Résoudre AtCoder ABC168 avec python (A ~ D)
1. Statistiques apprises avec Python 1-3. Calcul de diverses statistiques (statistiques)
Visualisez le point P qui fonctionne avec Python
Dessin avec Matrix-Reinventor of Python Image Processing-
Recommandation d'Altair! Visualisation des données avec Python
Text mining avec Python ② Visualisation avec Word Cloud
Connectez-vous à Pepper avec l'interpréteur Python de PEPPER Mac
Comparaison de la vitesse de transposition de la matrice par Python
[Explication AtCoder] Contrôlez les problèmes A, B, (C), D de ABC165 avec Python!
[Explication AtCoder] Contrôlez les problèmes A, B, C, D d'ABC183 avec Python!
Résoudre avec Ruby et Python AtCoder ABC084 D Somme cumulative des nombres premiers
[Vérification] Essayez d'aligner le groupe de points avec la fonction d'optimisation de pytorch Partie 1
[Explication AtCoder] Contrôlez les problèmes A, B, C, D d'ABC181 avec Python!