繁体   English   中英

Pepper NAOqi 2.5:如何从事件中创建回调 function?

[英]Pepper NAOqi 2.5: How to create a callback function from an event?

我正在研究来自 SoftBank Robotics 的 Pepper,并且我正在尝试实现一个程序,一旦“Navigation/AvoidanceNavigator/ObstacleDetected”事件变为 TRUE,该程序就能够集成回调 function。

当然,我尝试参考手册,但在 Python SDK 的事件反应部分中,只有一个使用 FaceDetect 事件的示例。

不幸的是,与作为具有订阅方法的 ALFaceDetection 服务的一部分的 FaceDetect 事件不同,“Navigation/AvoidanceNavigator/ObstacleDetected”事件与没有订阅者的 ALNavigation API 相关联。

有人可以帮我吗?

这是我的第一个(不工作)想法:

#! /usr/bin/env python
# -*- encoding: UTF-8 -*-


from naoqi import ALProxy
import qi
import argparse
import sys
import numpy
from PIL import Image
import os
import time


class tryGetEvent(object):


    def __init__(self, app):
        super(tryGetEvent, self).__init__()
        app.start()                 #start the application (see qi.ApplicationAPI)
        session=app.session         #return the current session

        # Open the service ALMemory

        self.memory=session.service("ALMemory")

        #Connect to the event callback
        self.subscriber=self.memory.subscriber("Navigation/AvoidanceNavigator/ObstacleDetected")
        self.subscriber.signal.connect(self.obstacleDet)

        self.tts=session.service("ALTextToSpeech")
        self.navigation=session.service("ALNavigation")
        self.navigation.subscribe("tryGetEvent")
        self.got_obst=False

    def obstacleDet(self, position):

        if position==[]: #empty value
            self.got_obst=False
        elif not self.got_obst:
            self.got_obst=True
            print "Obstacle detected!"
            self.tts.say("Obstacle detected!")

            pos_plot=position [1]

            print (pos_plot)

    def run(self):

        print("Starting script tryGetEvent")
        try:
            while True:
                time.sleep(0.2)
        except KeyboardInterrupt:
            print("user interrupted the script")
            self.navigation.unsubscribe("tryGetEvent")
            sys.exit(0)



# DO NOT TOUCH !

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", type=str, default="192.168.1.32",
                        help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.")
    parser.add_argument("--port", type=int, default=9559,
                        help="Naoqi port number")

    args = parser.parse_args()
    try:
        # Initialize qi framework.
        connection_url = "tcp://" + args.ip + ":" + str(args.port)
        app = qi.Application(["tryGetEvent", "--qi-url=" + connection_url])
    except RuntimeError:
        print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n"
               "Please check your script arguments. Run with -h option for help.")
        sys.exit(1)


    Get_Event=tryGetEvent(app)
    Get_Event.run()

很遗憾看到手册的示例不清楚,但是有一种更简单的方法可以编写此代码。

obstacle_tracker.py

#! /usr/bin/env python
# -*- encoding: UTF-8 -*-
import qi

class ObstacleTracker:
    def __init__(self, session):
        self.session = session
        self.got_obst = False
        memory = session.service("ALMemory")
        subscriber = memory.subscriber("Navigation/AvoidanceNavigator/ObstacleDetected")
        subscriber.signal.connect(self.obstacleDet)

    def obstacleDet(self, position):
        if position == []: #empty value
            self.got_obst = False
        elif not self.got_obst:
            self.got_obst = True
            print("Obstacle detected!")
            tts = self.session.service("ALTextToSpeech")
            tts.say("Obstacle detected!")
            print(position)


if __name__ == "__main__":
    app = qi.Application()
    app.start()
    obstacle_tracker = ObstacleTracker(app.session)
    app.run()

运行它: $ python obstacle_tracker.py --qi-url=192.168.1.32

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM