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)
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.
Entrez le nom et le contour de la boîte et appuyez sur le bouton OK.
Cliquez avec le bouton droit sur la boîte et modifiez le script Python.
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
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.
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).
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.
Si vous l'ouvrez avec Meshlab, vous pouvez voir le groupe de points 3D.
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).
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