前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python SDK入门(3)——对事件做出反应

Python SDK入门(3)——对事件做出反应

作者头像
李志伟
发布2019-12-17 17:42:54
5260
发布2019-12-17 17:42:54
举报
文章被收录于专栏:为学为学

Python SDK入门(3)——对事件做出反应

​ 这一节,我想让NAO在每一次侦测到人脸的时候都说一句“你好,人类”。为了达到这一点,我们需要使用ALFacedetection模型下的”FaceDetected”事件。

​ 所以我们需要用Python写一个NAOqi模型出来。而要创建模型,我们首先需要一个中间件(Broker)。

​ 下面是一个例子:

代码语言:javascript
复制
# -*- encoding: UTF-8 -*-

"""每当侦测到人脸时都要说一声“你好,人类”"""

import sys
import time

from naoqi import ALProxy
from naoqi import ALBroker
from naoqi import ALModule

from optparse import OptionParser

pip = "nao.local"

# 用全局变量来存储"HumanGreeter"模型中的实例
HumanGreeter = None
memory = None

class HumanGreeterModule(ALModule):

    def __init__(self, name):
        ALmodule.__init__(self, name)
        #在这里不需要IP和端口,
        #因为我们可以在之后用自己写的中间件去连NAOqi中的中间件

        #创建一个ALTextToSpeech稍后使用
        self.tts = ALProxy("ALTextToSpeech")

        #使用FaceDetected事件
        global memory
        memory = ALProxy("ALMemory")
        memory.subscribeToEvent("FaceDetected",
            "HumanGreeter", "onFaceDetected")

    def onFaceDetected(self,*_args):
        #这个方法将会在每次侦测到人脸的时候被调用

        #当走路的时候不使用该事件
        #以避免多次重复
        memory.unsubscribeToEvent("FaceDetected", "HumanGreeter")

        self.tts.setLanguage("Chinese")
        self.tts.say("你好,人类")

        #再次使用上面那个方法
        memory.subscribeToEvent("FaceDetected",
            "HumanGreeter", "onFaceDetected")

def main():
    """ Main entry point

    """
    parser = OptionParser()
    parser.add_option("--pip",
        help="Parent broker port. The IP address or your robot",
        dest="pip")
    parser.add_option("--pport",
        help="Parent broker port. The port NAOqi is listening to",
        dest="pport",
        type="int")
    parser.set_defaults(
        pip=NAO_IP,
        pport=9559)

    (opts, args_) = parser.parse_args()
    pip   = opts.pip
    pport = opts.pport


    #我们需要用这个中间件来构建NAOqi模型并使用其他模型
    #这个中间件必须在运行期间始终有效
    myBroker = ALBroker("myBroker",
       "0.0.0.0",   # 监听所有的
       0,           # 找到一个空端口并使用它
       pip,         # 父类中间件IP
       pport)       # 父类中间件端口

    #注意:HumanGreeter必须是全局变量
    #传入结构体的名字必须是这个变量的名字
    global HumanGreeter
    HumanGreeter = HumanGreeterModule("HumanGreeter")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print
        print "Interrupted by user, shutting down"
        myBroker.shutdown()
        sys.exit(0)



if __name__ == "__main__":
    main()  

一些注意事项:

  • 要确保我们对实例使用的是全局变量
  • 要确保我们传入ALModule的结构体的名字是自己的变量的名字
  • 如果我们为此方法编写了文档字符串,且它不以下划线开头,则我们的类的方法会自动转换为绑定方法。(The method of your class are automatically transform into bound methods, providing that you wrote a doc string for this method, and it does not start with an underscore.)
  • 一旦建立了ALBroker对象,我们需要使这个对象一直有效,以使订阅(the subscribing)工作。 我们还需要中间件处于有效状态才能创建代理而不必指定IP或端口。
  • 脚本必须有–pip和–pport才能工作

补充内容: 让Python脚本在NAO上运行的方法:

​ 将脚本传到NAO上,如/home/nao/reacting_to_events.py,然后编辑/home/nao/naoqi/preferences下的autoload.ini文件,加上:

代码语言:javascript
复制
[python]
/home/nao/reacting_to_events.py

请注意,在运行脚本时NAOqi会自动设置-pip和-pport值。

最后,运行这个脚本,然后把你的脸放在NAO的面前,你将会听到一声”你好,人类“。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python SDK入门(3)——对事件做出反应
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档