### **概述** > 本篇列出了几类常用的 API 功能模块,介绍了一个重要的 API 函数 ALProxy,并自己创建了一个 Python 指令盒,简单实现了让 Nao 说出 Hello World 的程序代码。 ![Title](/upload/Robot-Nao-03-1.jpg) ---------- ### **一、Naoqi APIs** **1. API 概览([官方文档戳我](http://doc.aldebaran.com/2-8/naoqi/index.html))**   Naoqi 的 API 按功能分类可以大致分为八个部分,分别是: - 核心类API:**[NAOqi Core](http://doc.aldebaran.com/2-8/naoqi/core/index.html)** - 情感类API:**[NAOqi Emotion](http://doc.aldebaran.com/2-8/naoqi/emotion/index.html)** - 交互类API:**[NAOqi Interaction engines](http://doc.aldebaran.com/2-8/naoqi/interaction/index_interaction.html)** - 运动类API:**[NAOqi Motion](http://doc.aldebaran.com/2-8/naoqi/motion/index.html)** - 音频类API:**[NAOqi Audio](http://doc.aldebaran.com/2-8/naoqi/audio/index.html)** - 视觉类API:**[NAOqi Vision](http://doc.aldebaran.com/2-8/naoqi/vision/index.html)** - 人像感知API::**[NAOqi People Perception](http://doc.aldebaran.com/2-8/naoqi/lola/lola.html)** - 传感器与LED灯:**[NAOqi Sensors & LEDs](http://doc.aldebaran.com/2-8/naoqi/sensors/index.html)** **2. 重要API: ALProxy**   在 Naoqi 的 Python SDK 中提供了一条重要的 API: ALProxy,在调用 Naoqi 的各个功能模块时通常都要先调用此API,从而获取指定功能模块的代理服务,其返回的应该是指定服务类的一个实例。ALProxy 有两个不同的构造函数,详见下面的函数原型: ``` ALProxy (name, ip, port) # name is the name of the module, # ip is the IP of the broker in which the module is running, # port is the port of the broker. ``` ``` ALProxy (name) # name is the name of the module. ``` > ALProxy (name) 作为 ALProxy (name, ip, port) 的重载函数,通常在没有可用的代理实例时才被使用。 ### **二、在 Choregraphe 中创建自己的第一个 Python Box**   接下来,我们就要开始着手 Python 程序的编写了,这一系列的学习笔记都将在 Choregraphe 环境中完成代码的编写。首先,我们需要在 Choregraphe 中新建一个盒子,只需在流程图面板右键 -> Create a new box 中选择 Python 即可,填写 Box name 和 Description 并点击确定,其他参数我们暂时不管。 ![Title](/upload/Robot-Nao-03-gif1.gif)   这样,我们就造了一个盒子(Box),双击我们刚才造的 Box 即可打开文本编辑器,可以看到其中已经有一些初始代码了: ``` 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 onInput_onStart(self): #self.onStopped() #activate the output of the box 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 ```   其中 onLoad 函数和 onUnload 函数分别在初始化和清除的时候调用,而 onInput_onStart 函数与 onInput_onStop 函数则是在盒子启动和停止的时候被调用。 ### **三、Hello World!**   好了,下面就让我们通过代码实现,让 Nao 说出那句经典的 Hello World 吧!   为了让 Nao 开口说话,我们还需要一个分类于 NAOqi Audio 的 API: [ALTextToSpeech](http://doc.aldebaran.com/2-8/naoqi/audio/altexttospeech-api.html)。   ALTextToSpeech 是一个类,或者说是 Naoqi 的一个功能模块,其中包含 setParameter、setVoice、getVoice 等成员函数,而具有能让 Nao 开口说话这种神奇作用的,就是其中的 say 函数。   函数原型: ``` void ALTextToSpeechProxy::say(const std::string& stringToSay) ```   say 函数本身非常的简单,只有一个参数即要说的内容,由于 say 函数是 ALTextToSpeech 类中的成员函数,为了调用它我们首先要借助 ALProxy 来获得 ALTextToSpeech 模块的实例(代理): ``` tts = ALProxy ("ALTextToSpeech", "localhost", 7096) ```   之后就可以大大方方的调用 say 函数来让 Nao 机器人说出我们想它说出的内容了: ``` tts.say ("Hello World!") ```   为了让程序在 Box 被运行时执行,并在运行完所有内容后自动结束,我们将代码写在 OnStart 函数中、self.onStopped() 代码行上方,并取消 self.onStopped() 前的 # 号注释,完整代码如下: ``` 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 onInput_onStart(self): tts = ALProxy("ALTextToSpeech", "localhost", 7096) tts.say("Hello World!") self.onStopped() #activate the output of the box 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 ```   运行效果: ![Title](/upload/Robot-Nao-03-gif2.gif)
--- END ---