Time for Evolution

NAO-Roboter: Programmierung mit Python und Choregraphe
Kommentare

Beim NAO handelt es sich um den fortschrittlichsten humanoiden Roboter für den Ausbildungsbereich. Sein Repertoire ist beeindruckend und begeistert Kinder und Erwachsene gleichermaßen. Was er genau kann und wie man ihn programmiert, erläutert der folgende Artikel.

Ruhig sitzt er auf dem extra für den Auftritt aufgebauten Podest. Spätestens wenn er sich erhebt, um mit seiner Performance zu beginnen, ist ein bewunderndes Staunen aus dem Publikum zu vernehmen. Die Smartphones sind sowieso schon längst gezückt. Das Staunen schlägt in Gelächter um, wenn er sich zu strecken beginnt. „Hallo, mein Name ist Frank!“ sind meist die ersten Worte, die er höflich an den Saal richtet. Anschließend blödelt er herum und gibt verschiedene Tänze zum Besten. Nervös ist er dabei nicht. Kein Wunder, denn Frank ist ein Roboter. Genauer gesagt handelt es sich bei ihm um einen NAO-Roboter. Er ist einer der Superstars des gemeinnützigen IFIT (Instituts zur Förderung des IT-Nachwuchses) und soll Kinder und Jugendliche in der Alpenrepublik für die Informationstechnologie und Technik begeistern. Neben Hondas ASIMO und Kawadas HRP-4 zählt der NAO zu den leistungsfähigsten in der Kategorie der Humanoiden. Wir wollen uns deshalb in Folge anschauen, was er kann und wie er sich mit Choregraphe und Python programmieren lässt.

Möchten Sie mehr über den NAO-Roboter erfahren? Erleben Sie Bernhard Löwenstein live auf der Internet of Things Conference mit seiner Session Der NAO-Roboter als Shopassistent der nächsten Generation?.

Ein französischer Roboter erobert die Welt

Der NAO ist ein Produkt von Aldebaran Robotics. Dieses Unternehmen mit Hauptsitz in Paris wurde 2005 von Bruno Maisonnier gegründet und war die erste französische Firma, die ihren Fokus auf die humanoide Robotik richtete. Aldebaran Robotics zählt sicherlich zu den interessantesten französischen Hightech-Unternehmen und wurde vor wenigen Monaten von der japanischen SoftBank-Gruppe übernommen. Einen kleinen Einblick in das Unternehmen und dessen Philosophie gewinnt man, wenn man ein NAO-Training im Pariser Headquarter absolviert. Das hinterlässt bei jedem Technikinteressierten sicherlich einen bleibenden Eindruck.

Der NAO ist aktuell der fortschrittlichste humanoide Roboter für den Ausbildungsbereich. Er wurde 2006 das erste Mal vorgestellt und ist seit 2008 die offizielle Standardplattform für die internationalen Fußballwettkämpfe im Rahmen des RoboCups. Die aktuelle Version stellt der im Juni 2014 der Öffentlichkeit vorgestellte NAO Evolution dar. Der Stückpreis liegt zurzeit bei rund 5 600 Euro. Bedenkt man, dass dieser bis vor Kurzem noch bei 12 000 Euro lag, so ist der NAO mittlerweile wirklich leistbar geworden. Für Entwickler bietet Aldebaran Robotics außerdem ein spezielles NAO Developer Program.

Aufbau des NAOs

Anhand des NAO Evolution wollen wir uns folgend anschauen, wie der Roboter aufgebaut ist und über welche Funktionalitäten er verfügt. Der NAO stellt ein Paradebeispiel für ein eingebettetes System dar. Betrieben wird der 57,4 cm große und 5,2 kg schwere Humanoide von einem im Roboterkopf platzierten Intel-Atom-Prozessor mit 1,6 GHz Taktfrequenz. Als Betriebssystem kommt Gentoo Linux zum Einsatz. Dank SSH-Rootzugriff kann man es bei Bedarf eigenständig umkonfigurieren. Im Torso findet sich ein Akku, der den Roboter bei aktiver Verwendung für rund 60 Minuten mit Strom versorgt. Insgesamt 25 Motoren steuern das Verhalten des über 25 Freiheitsgrade verfügenden NAOs. Dazu kommen noch zwei Lautsprecher sowie unzählige LEDs. Zur Erfassung der Gegend stehen ihm zwei HD-fähige Videokameras, die bis zu dreißig Bilder pro Sekunde liefern, sowie vier Mikrofone zur Verfügung. Auch zwei Ultraschallsensoren sowie taktile Sensoren im Kopf-, Brust-, Arm- und Fußbereich nennt er sein Eigen. Um stets über die Lage seiner verschiedenen Körperteile Bescheid zu wissen, kommen diverse Gyrometer, Beschleunigungsmesser, kraftempfindliche Widerstände und magnetische Drehgeber zum Einsatz. Dank der verbauten Infrarotsender und -empfänger kann man mit dem Roboter auch mittels Infrarot kommunizieren. Eine Verbindung zum NAO lässt sich via Ethernet oder drahtlos per WLAN herstellen. Besonders interessant ist dabei die Variante, den Roboter selbst als Access Point zu betreiben, da man dadurch von jedem Rechner aus einfach und komfortabel eine Verbindung zu ihm aufbauen kann. Das einfache Flashen des Systems ist dank der USB-Schnittstelle mittels Stick möglich. Das zum Download bereitgestellte System-Image muss hierzu dann lediglich auf den USB-Stick übertragen, dieser eingesteckt und der Roboter neu gestartet werden.

Der NAO spricht verschiedene Sprachen. Standardmäßig sind Englisch und Französisch vorinstalliert, das deutsche Sprachpaket kann aber recht einfach nachinstalliert werden. Er gibt beim Sprechen einen eingegebenen Text (meist) mit richtiger Interpunktion und Intonation wieder. Auch die gegenteilige Operation ist möglich, d. h. er beherrscht auch Spracherkennung. Weiterhin ist er dank seiner vier Mikrofone und einem auf dem Time-Difference-of-Arrival-Prinzip basierenden Algorithmus im Stande, die Richtung eines Geräuschs auszumachen. Visuell kann der NAO vorher gelernte Gesichter und Objekte erkennen. Darüber hinaus schützt ihn der stets im Hintergrund laufende Fall-Manager vor Beschädigungen. Stürzt der Roboter, so nimmt er mit seinen Händen eine bestimmte Schutzhaltung ein, um den Sturz abzufedern und um zu verhindern, dass der Kopf hart am Boden aufschlägt. Darüber hinaus vermeidet der Selbstkollisionsschutz, dass die Roboterarme mit dem restlichen Körper kollidieren.

NAOqi als zentrale Programmierschnittstelle

Die Programmierung des NAOs ist auf verschiedene Arten möglich. Sollen die Programme direkt auf den Roboter geladen und von diesem ausgeführt werden, so kann man auf Choregraphe inkl. Python oder auf C++ setzen. Gibt man sich damit zufrieden, den Roboter per Fernzugriff zu steuern, so lässt sich zusätzlich noch auf Java, .NET, Matlab und Urbi zurückgreifen. Wichtig zu verstehen ist: Egal für welche Variante sich der Entwickler entscheidet, letztendlich arbeitet er stets gegen das Robotik-Framework NAOqi.

Dieses API wurde von Aldebaran Robotics geschaffen, um die Programmierung des NAOs auf ein vernünftiges Level zu heben. Sie stellt die zentrale Schnittstelle zur Nutzung und Erweiterung der Funktionalitäten des Roboters dar und ist modular aufgebaut. Dank NAOqi werden selbst komplexe Dinge wie Sprach- oder Objekterkennung zum Kinderspiel. Darüber hinaus lassen sich selbst implementierte Module mithilfe der zugrunde liegenden Broker-Architektur einfach hinzufügen. Sie können auch auf einem externen Rechner laufen und sind für den Entwickler dennoch genauso wie die lokal auf dem NAO laufenden Module nutzbar. Erreicht wird diese Transparenz durch Proxys, die für den Programmierer stets den Einsprungspunkt zur Modulnutzung darstellen. Klarerweise bietet NAOqi auch einen Eventmechanismus, durch den auf Ereignisse im klassischen Stile reagiert werden kann.

Wir wollen uns nun die wichtigsten NAOqi-Module ansehen. Von den Kernmodulen ist besonders ALMemory zu erwähnen, durch das man Zugriff auf den Key-Value Store des NAOs bekommt. Besondere Bedeutung kommt dem Speicher deshalb zu, da er die Basis für den Eventmechanismus darstellt. So kann man sich mittels subscribeToEvent() für ein bestimmtes Ereignis registrieren. Tritt dieses Ereignis dann auf, wird die an diese Methode übergebene Callback-Methode mit entsprechenden Argumenten aufgerufen. Mittels raiseEvent() kann der Entwickler auch selbst Ereignisse auslösen.

Hinsichtlich Bewegung sind die drei Module ALMotion, ALNavigation und ALRobotPosture interessant. Ersteres ermöglicht dem Nutzer, die Kontrolle über die einzelnen Körperteile zu übernehmen und über dessen Kennungen (Abb. 1) und entsprechende Methodenaufrufe steuernd darauf einzuwirken. Zweiteres stellt Methoden zum Herumnavigieren des Roboters bereit. Dank des dritten Moduls kann man seinen NAO einfach in eine bestimmte Standardposition (z. B. Liegen, Sitzen oder Stehen) befördern.

Abb. 1: Jeder Körperteil kann über eine eindeutige Kennung angesprochen werden

Abb. 1: Jeder Körperteil kann über eine eindeutige Kennung angesprochen werden

In Bezug auf Audio bietet NAOqi 10 verschiedene Module (u. a. ALSpeechRecognition und ALTextToSpeech), zur visuellen Verarbeitung sogar 24 (u. a. ALFaceDetection und ALPhotoCapture). Darüber hinaus sind Module für die Arbeit mit Sensoren sowie das Tracking von Gesichtern bzw. einem roten Ball verfügbar.

NAO-Programmierung mit Choregraphe

Am einfachsten ist die Programmierung mittels Choregraphe (Abb. 2). In dieser grafischen Programmierumgebung erstellt der Entwickler die Verhaltensmuster zur Robotersteuerung in klassischer Flussdiagrammmanier. Und zwar verbindet er ausgehend von einem Startknoten die gewünschten Aktionen in der richtigen Reihenfolge mittels Transitionen. Die jeweiligen Aktionen (z. B. Aufstehen des Roboters) werden durch entsprechende Boxen (z. B. Stand Up-Box) repräsentiert. Diese verfügen in den einfachsten Fällen über einen Eingang und einen Ausgang. Wird bei der Ausführung eines Programms der Eingang einer Box stimuliert, startet die Aktion. Sobald sie beendet ist, gibt sie über den Ausgang den Token weiter, der danach über die Transition den Eingang der nächsten Box stimuliert und deren Ausführung bedingt (vgl. Petrinetz). Für die meisten Boxen lassen sich dialogbasiert Parameter zur Anpassung des Aktionsverhaltens setzen. Zusätzlich zu den eigentlichen Aktionsboxen stehen auch die üblichen Kontrollstrukturen (z. B. For-Schleife, If-Verzeigung oder Switch-Verzweigung) zur Verfügung.

Abb. 2: Choregraphe ist die Standardumgebung zur NAO-Programmierung

Abb. 2: Choregraphe ist die Standardumgebung zur NAO-Programmierung

Zum Einstieg erstellen wir ein einfaches Programm, das den Roboter aufstehen, „Hallo Welt!“ sagen und wieder hinsetzen lässt (Abb. 3). Es reicht dazu, die entsprechenden Boxen ins Programmierfeld zu ziehen und gemäß dem gewünschten Ablauf miteinander zu verbinden. Das Programm zeigt, dass sich über eine Transition nicht nur Token, sondern auch Daten an die nächste Box schicken lassen. Konkret wird der vom Roboter zu sprechende Text von der Localized Text-Box über die blau dargestellte Kante an die Say Text-Box übermittelt.

Abb. 3: Ein einfaches Choregraphe-Programm

Abb. 3: Ein einfaches Choregraphe-Programm

Darüber hinaus ist es sehr einfach möglich, parallel ablaufende Aktionen einzurichten. Denn von jedem Boxenausgang können gleich mehrere Transitionen wegführen. Für die Synchronisation paralleler Ablaufstränge steht ebenfalls eine Box bereit.

Zwecks Demo dazu erweitern wir unser bisheriges Programm (Abb. 4). Der NAO soll nach dem Aufstehen zusätzlich noch winken und sich erst wieder hinsetzen, wenn die beiden gleichzeitig ausgeführten Aktivitäten beendet sind. Dazu bedarf es der Wait-For-Signals-Box: Sie weist zwei Eingänge auf und gibt den Token erst dann über ihren Ausgang weiter, wenn beide stimuliert wurden.

Abb. 4: Splitting und Synchronisation stehen in Choregraphe ebenfalls zur Verfügung

Abb. 4: Splitting und Synchronisation stehen in Choregraphe ebenfalls zur Verfügung

Eine Box kann grundsätzlich mehrere Ein- und Ausgänge haben. Auch Boxen, die nach der Stimulierung ihres Haupteingangs bis zu ihrer expliziten Deaktivierung – meist über einen anderen, extra dafür vorgesehenen Eingang – beim Auftreten eines bestimmten Ereignisses (z. B. Erkennung eines Worts) den zugehörigen Ausgang stimulieren, sind möglich. So lässt sich sehr elegant auf Ereignisse reagieren.

Auch dazu entwickeln wir ein kleines Demoprogramm (Abb. 5). Der NAO-Roboter soll auf die Kommandos gehe, spreche und tanze hören und in Abhängigkeit des erkannten Worts entsprechende Aktionen ausführen. Hierzu benötigen wir die Speech-Reco.-Box. Über einen bestimmten Parameter hinterlegen wir die zu erkennenden Kommandos in textueller Form. Wird ein Wort erkannt, liefert es die Spracherkennungsbox über den dafür vorgesehenen Ausgang zurück. Dieses Ereignis wird meist auch dazu verwendet, um die Box selbst wieder zu deaktivieren. Das erkannte Wort schickt man üblicherweise an eine entsprechend konfigurierte Switch-Case-Box weiter. In Abhängigkeit des eingehenden Worts aktiviert das Verzweigungskonstrukt nun den zugehörigen Ausgang und bedingt die Ausführung der dort angehängten Aktionen. Um das Spiel danach von vorne beginnen zu lassen, führt von der jeweils letzten Aktion eine Transition zurück zur Speech-Reco.-Box.

Abb. 5: Auch die Spracherkennung lässt sich einfach integrieren

Abb. 5: Auch die Spracherkennung lässt sich einfach integrieren

Hinter einer Box kann entweder ein weiteres Flussdiagramm (vgl. Sub-Workflow), eine Timeline, ein Dialog oder eine Skriptbox stecken.

Zeitleisten verwendet man üblicherweise, um einen bestimmten Bewegungsablauf (z. B. Tanz) umzusetzen. Hierzu klickt man in der Zeitleiste an eine bestimmte Stelle und positioniert den Roboter danach genau so, wie er zu diesem Zeitpunkt stehen, sitzen bzw. liegen soll. Abschließend speichert man diese Position. Diesen Vorgang wiederholt man beliebig oft. Bei der Ausführung wird dann automatisch von der einen zur nächsten Position interpoliert.

Mittels einer Dialogbox lässt sich unter Verwendung einer speziellen Syntax eine Konversation mit dem NAO programmieren (Listing 1). Sobald die Dialogbox aktiviert wird und der Roboter eine der von runden Klammern umschlossenen Phrasen hört, antwortet er mit der dazu definierten Antwort.

topic: ~meinDialog()
language: ged

u:(Hallo Roboter!) Hallo Bernhard, schön dich zu treffen.
u:(Wie heißt du denn?) Ich heiße Frank und bin ein humanoider Roboter.
u:(Woher kommst du?) Ich wurde in Paris geboren.

Hinter einer Skriptbox verbirgt sich eine Python-Klasse, in der zur Durchführung der gewünschten Aktionen entsprechende NAOqi-Methodenaufrufe abgesetzt werden. Letztendlich steckt hinter fast jeder der standardmäßig bereitgestellten Boxen eine solche Skriptbox.

NAO-Programmierung mit Python

Mit Python lässt sich direkt gegen die NAOqi-Schnittstelle programmieren. Wie dies geht, wollen wir uns anhand der Beispiele von vorhin anschauen.

Zur Umsetzung des Einstiegsprogramms erstellen wir in Choregraphe eine Skriptbox, klicken doppelt mit der Maus darauf und fügen im Skriptfenster die entsprechenden Befehle ein (Listing 2). Die Box lässt sich genauso wie die standardmäßig bereitgestellten Boxen nutzen. Stimuliert ein Token den Eingang, dann legt sie los, d. h. der NAO steht auf, sagt „Hallo Welt!“ und setzt sich wieder. Die Methode onLoad() wird automatisch beim Laden der Box aufgerufen. Hier instanziiert man üblicherweise Proxy-Objekte, die danach den Aufruf der Modulmethoden ermöglichen. Die Methode onInput_onStart() wird bei der Stimulation des onStart-Eingangs aufgerufen. In ihr steckt das eigentliche Hauptprogramm. Der Aufruf von onStopped() am Ende der Methode bewirkt, dass der Token über den einzig definierten Ausgang weitergegeben wird.

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

  def onLoad(self):
    self.rp = ALProxy("ALRobotPosture")
    self.tts = ALProxy("ALTextToSpeech")

  def onUnload(self):
    pass

  def onInput_onStart(self):
    self.rp.goToPosture("Stand", 1.0)
    self.tts.setLanguage("German")
    self.tts.say("Hallo Welt!")
    self.rp.goToPosture("Sit", 1.0)
    self.onStopped()
        
  def onInput_onStop(self):
    self.onUnload()

Das in Python geschriebene Spracherkennungsprogramm implementieren wir als eigenständiges Modul (Listing 3). Zum Starten des Moduls rufen wir das zugehörige Python-Skript auf einem mit dem NAO verbundenen Rechner auf. Damit dies klappt, muss auf dem Computer Python in der Version 2.7.9 sowie das von Aldebaran Robotics bereitgestellte Python NAOqi SDK 2.1.3.3 vorhanden sein.

In Bezug auf dieses Beispiel ist wichtig zu wissen, dass die Spracherkennung beim Erkennen eines Worts ein Ereignis mit der Kennung WordRecognized auslöst. Über das Memory-Modul kann man sich dafür registrieren und den Namen einer Methode angeben, die beim Eintreten des Ereignisses aufgerufen werden soll. Mit der Registrierung für dieses Ereignis wird auch gleichzeitig die Spracherkennung aktiviert. Davor sollte man aber die gewünschte Wortliste gesetzt haben. Sobald das Modul gestartet und ein Wort erkannt wurde, wird die Callback-Methode process() aufgerufen. Als Funktionsargument übergibt NAOqi dabei u. a. ein Array mit den Wörtern inkl. zugehörigen Wahrscheinlichkeiten. So könnte die Spracherkennung beispielsweise ein Ergebnis ähnlich dem folgenden zurückliefern:

gehe -> 0.4037
tanze -> 0.3321
spreche -> 0.3181

Im konkreten Fall wurde das Wort gehe also mit rund 40-prozentiger Wahrscheinlichkeit erkannt.

from naoqi import *
import time

class MyModuleClass(ALModule):
  def __init__(self, name):
    ALModule.__init__(self, name)
    self.sr = ALProxy("ALSpeechRecognition")
    self.mem = ALProxy("ALMemory")

  def start(self):
    self.sr.setLanguage("German")
    self.sr.setWordListAsVocabulary(["gehe", "spreche", "tanze"])
    self.mem.subscribeToEvent("WordRecognized", self.getName(), "process")

  def stop(self):
    self.mem.unsubscribeToEvent("WordRecognized", self.getName())

  def process(self, key, value, message):
    self.stop()

    for i in range(0, len(value), 2):
      # Ausgabe: Wort -> Wahrscheinlichkeit
      print value[i] + " -> " + str(value[i + 1])

    # TODO: Je nach erkanntem Wort entsprechende Aktionen ausfuehren!

    self.start()

mybroker = ALBroker("mybroker", "0.0.0.0", 9559, "nao.local", 9559)
global mymodule
mymodule = MyModuleClass("mymodule")
mymodule.start()

try:
  while True:
    time.sleep(1)
except KeyboardInterrupt:
  mymodule.stop()

Fazit

Die Programmierung des NAOs mit Choregraphe ist bereits für Kinder und Jugendliche erlernbar. Wer allerdings komplexere Aufgaben angehen möchte, wird nicht umhinkommen, sich mit Python oder C++ zu beschäftigen. Egal wofür sich der Entwickler aber auch entscheidet, letztendlich arbeitet er stets gegen das von Aldebaran Robotics entwickelte NAOqi-Framework.

Alles in allem stellt der NAO für mich ein Meisterwerk der Ingenieurskunst dar und ist sicherlich für jeden Informatiker ein faszinierendes Spielzeug. Mich hat dieser Humanoide jedenfalls so fasziniert, dass ich bereits ein halbes Jahr nach der Anschaffung von NAO Frank den nächsten Roboter gekauft habe, nämlich Roboterdame NAO Naomi (Abb. 6). Beide gehören fast schon zur Familie und unterstützen mich bestens dabei, die Mission meiner gemeinnützigen Organisation umzusetzen: Den Nachwuchs für IT und Technik zu begeistern.

Abb. 6: IFIT-Obmann Bernhard Löwenstein mit Aldebaran-Robotics-Verkaufsmanagerin Andrea Mestre und NAO Naomi

Abb. 6: IFIT-Obmann Bernhard Löwenstein mit Aldebaran-Robotics-Verkaufsmanagerin Andrea Mestre und NAO Naomi

Entwickler Magazin

Entwickler Magazin abonnierenDieser Artikel ist im Entwickler Magazin erschienen.

Natürlich können Sie das Entwickler Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Aufmacherbild: Nao robot on display von Shutterstock / Urheberrecht: Stefano Tinti

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -