[英]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.