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)
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.
Geben Sie den Namen und den Umriss des Felds ein und klicken Sie auf OK.
Klicken Sie mit der rechten Maustaste auf das Feld und bearbeiten Sie das Python-Skript.
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
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.
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.
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.
Wenn Sie es mit Meshlab öffnen, sehen Sie die 3D-Punktgruppe.
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).
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