helpers.py
Go to the documentation of this file.
1 import rospy
2 from mycroft_ros.msg import *
3 from mycroft_ros.srv import *
4 from std_msgs.msg import String
5 import actionlib
6 from os.path import basename
7 
8 response_client = None
9 ask_yesno_client = None
10 
12 
13  def __init__(self, intents={}):
14  self.intents = intents
15 
16  def remove_callback(self, intent_name):
17  del self.intents[intent_name]
18 
19  def register_callbacks(self, intents):
20  self.intents.update(intents)
21  return self
22 
23  def handle_intent(self, data):
24  intent_func = self.intents.get(data.intent_name, None)
25  if intent_func is not None:
26  intent_func(data)
27 
28  def register_callback(self, intent_name, func):
29  self.intents[intent_name] = func
30  return self
31 
33 
34  def __init__(self, path=""):
35  self.path = path
36  self.intents = []
37  self.intent_files = []
38  self.entities = []
39 
40  def intent(self, intent):
41  self.intents.append(intent)
42  return self
43 
44  def intent_file(self, intent_file):
45  self.intent_files.append(intent_file)
46  return self
47 
48  def entity(self, entity):
49  self.entities.append(entity)
50  return self
51 
52  def build(self):
53  return Mycroft(self.path, self.intents, self.intent_files, self.entities)
54 
55  def buildAndRegister(self):
56  return register_skill(Mycroft(self.path, self.intents, self.intent_files, self.entities))
57 
58 
60 
61  def __init__(self, intent_name):
62  self.at_least_one = []
63  self.requires = []
64  self.optional = []
65  self.name = intent_name
66 
67  def one_of(self, *args):
68  self.at_least_one.append(args)
69  return self
70 
71  def require(self, entity_type, attribute_name=None):
72  if not attribute_name:
73  attribute_name = entity_type
74  self.requires.append(IntentRequire(entity=entity_type, attribute_name=attribute_name))
75  return self
76 
77  def optionally(self, entity_type, attribute_name=None):
78  if not attribute_name:
79  attribute_name = entity_type
80  self.optional.append(IntentOptional(entity=entity_type, attribute_name=attribute_name))
81  return self
82 
83  def build(self):
84  return Intent(self.name, self.requires, self.at_least_one, self.optional)
85 
86 def get_response(skill_path, dialog, client=None):
87  if client is None:
88  client = actionlib.SimpleActionClient('get_response', GetResponseAction)
89 
90  client.wait_for_server()
91  goal = GetResponseGoal(skill_path, dialog)
92  client.send_goal(goal)
93  client.wait_for_result()
94  result = client.get_result()
95  return result.response
96 
97 def ask_yesno(skill_path, dialog, client=None):
98  if client is None:
99  client = actionlib.SimpleActionClient('ask_yesno', GetResponseAction)
100 
101  client.wait_for_server()
102  goal = GetResponseGoal(skill_path, dialog)
103  client.send_goal(goal)
104  client.wait_for_result()
105  result = client.get_result()
106  return result.response
107 
108 def register_skill(mycroft_skill):
109  rospy.wait_for_service('mycroft/register_skill')
110  try:
111  register = rospy.ServiceProxy('mycroft/register_skill', MycroftSkill)
112  response = register(mycroft_skill)
113  return response.initialised
114  except rospy.ServiceException:
115  rospy.loginfo("Service call failed")
116 
118 
119  def __init__(self, path):
121  self.entities = []
122  self.intent_files = []
123  self.intents = []
124  self.path = path.rstrip('/')
125  self.id = basename(self.path)
126  self.topic = "mycroft/{}".format(self.id)
127  self.response_client = actionlib.SimpleActionClient('get_response', GetResponseAction)
128  self.ask_yesno_client = actionlib.SimpleActionClient('ask_yesno', GetResponseAction)
129  self.remove_skill = rospy.Publisher('mycroft/remove_skill', String, queue_size=10)
130 
131  def register_intent(self, intent_parser, callback):
132 
133  if isinstance(intent_parser, IntentBuilder):
134  intent_parser = intent_parser.build()
135  elif not isinstance(intent_parser, Intent):
136  raise ValueError('"' + str(intent_parser) + '" is not an Intent')
137 
138  name = self.id + ":" + intent_parser.name
139  self.registered_intents[name] = callback
140  self.intents.append(intent_parser)
141 
142  def register_intent_file(self, intent_file, callback):
143  name = self.id + ":" + intent_file
144  self.registered_intents[name] = callback
145  self.intent_files.append(intent_file)
146 
147  def register_entity_file(self, entity_file):
148  self.entities.append(entity_file)
149 
150  def initialise(self):
151  rospy.Subscriber(self.topic, IntentResponse, self._handle_intent)
152  return self._register_skill(Mycroft(self.path, self.intents, self.intent_files, self.entities))
153 
154  def _register_skill(self, skill):
155  rospy.wait_for_service('mycroft/register_skill')
156  try:
157  register = rospy.ServiceProxy('mycroft/register_skill', MycroftSkill)
158  response = register(skill)
159  return response.initialised
160  except rospy.ServiceException:
161  rospy.loginfo("Service call failed")
162 
163  def _handle_intent(self, response):
164  if len(response.entities) > 0:
165  response.entities = dict([(entity.entity, entity.value) for entity in response.entities])
166  else:
167  response.entities = {}
168  intent_func = self.registered_intents.get(response.intent_name, None)
169  if intent_func is not None:
170  intent_func(response)
171 
172  def get_response(self, dialog):
173  client = self.response_client
174  client.wait_for_server()
175  goal = GetResponseGoal(self.path, dialog)
176  client.send_goal(goal)
177  client.wait_for_result()
178  result = client.get_result()
179  return result.response
180 
181  def ask_yesno(self, dialog):
182  client = self.ask_yesno_client
183  client.wait_for_server()
184  goal = GetResponseGoal(self.path, dialog)
185  client.send_goal(goal)
186  client.wait_for_result()
187  result = client.get_result()
188  return result.response
189 
190  def shutdown(self):
191  self.remove_skill.publish(self.path)
def handle_intent(self, data)
Definition: helpers.py:23
def optionally(self, entity_type, attribute_name=None)
Definition: helpers.py:77
def intent_file(self, intent_file)
Definition: helpers.py:44
def _handle_intent(self, response)
Definition: helpers.py:163
def register_skill(mycroft_skill)
Definition: helpers.py:108
def intent(self, intent)
Definition: helpers.py:40
def register_callback(self, intent_name, func)
Definition: helpers.py:28
def __init__(self, intents={})
Definition: helpers.py:13
def register_intent_file(self, intent_file, callback)
Definition: helpers.py:142
def get_response(self, dialog)
Definition: helpers.py:172
def entity(self, entity)
Definition: helpers.py:48
def remove_callback(self, intent_name)
Definition: helpers.py:16
def register_intent(self, intent_parser, callback)
Definition: helpers.py:131
def _register_skill(self, skill)
Definition: helpers.py:154
def __init__(self, path="")
Definition: helpers.py:34
def register_entity_file(self, entity_file)
Definition: helpers.py:147
def get_response(skill_path, dialog, client=None)
Definition: helpers.py:86
def __init__(self, intent_name)
Definition: helpers.py:61
def require(self, entity_type, attribute_name=None)
Definition: helpers.py:71
def ask_yesno(skill_path, dialog, client=None)
Definition: helpers.py:97
def register_callbacks(self, intents)
Definition: helpers.py:19


mycroft_ros
Author(s):
autogenerated on Mon Apr 26 2021 02:35:40